一文讀懂Spring中@Bean注解的核心作用
存儲(chǔ)Bean對(duì)象
將對(duì)象存儲(chǔ)在 Spring 中,有兩種注解類型可以實(shí)現(xiàn):
類注解:@Controller
、@Service
、@Repository
、@Component
、@Configuration
方法注解:@Bean
@Controller(控制器存儲(chǔ))
如下使用@Controller
存儲(chǔ)Bean代碼:
@Controller public class UserController { public void SayHi(String name){ System.out.println("你好"+name); } }
使用獲取上下文的方法獲取上面存儲(chǔ)的對(duì)象
public class Test { public static void main(String[] args) { //獲取spring上下文 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml"); //獲取指定的Bean對(duì)象名稱+類型進(jìn)行獲取 UserController userController = (UserController) applicationContext.getBean("userController"); userController.SayHi("zcx"); } }
效果為
@Service(服務(wù)存儲(chǔ))
如下使用@Service
存儲(chǔ)Bean代碼:
@Service public class UserService { public void SayHi(String name){ System.out.println("你好"+name); } }
輸出結(jié)果跟@Controller
一樣
@Repository(倉庫存儲(chǔ))
如下使用@Repository
存儲(chǔ)Bean代碼:
@Repository public class UserRepository { public void SayHi(String name){ System.out.println("你好"+name); } }
@Component(組件存儲(chǔ))
如下使用@Component
存儲(chǔ)Bean代碼:
@Component public class UserComponent { public void SayHi(String name){ System.out.println("你好"+name); } }
@Configuration(配置存儲(chǔ))
如下使用@Configuration
存儲(chǔ)Bean代碼:
@Configuration public class UserConfiguration { public void SayHi(String name){ System.out.println("你好"+name); } }
需要這么多類注解是讓程序員看到類注解之后,就能直接了解當(dāng)前類的?途,比如:
@Controller
:表示的是業(yè)務(wù)邏輯層 @Servie
:表示的是服務(wù)層 @Repository
:表示的是持久層 @Configuration
:表示的是配置層
Bean
?法注解是放到某個(gè)?法上的要配合類注解使?,如以下代碼的實(shí)現(xiàn):
@Controller public class Users { @Bean public User user1(){ User user = new User(); return user; } } public class Test { public static void main(String[] args) { //獲取spring上下文 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml"); //獲取指定的Bean對(duì)象名稱+類型進(jìn)行獲取 User user = (User) applicationContext.getBean("user1"); user.sayHi("zcx"); } }
user類
@Component public class User { public void sayHi(String name){ System.out.println(name+"你好"); } }
結(jié)果
重命名Bean
可通過設(shè)置 name 屬性給 Bean 對(duì)象進(jìn)?重命名操作
@Bean(name = {"u1", "us1"}) public User user1() { User user = new User(); return user; }
或者
@Bean(name = {"u1", "us1"}) public User user1() { User user = new User(); return user; }
獲取Bean對(duì)象
獲取Bean對(duì)象就是把對(duì)象取出來放入某個(gè)類中,也叫對(duì)象注入或者對(duì)象裝配。
對(duì)象注入有三種實(shí)現(xiàn)方法:
屬性注? 構(gòu)造?法注? Setter 注?
下?我們按照實(shí)際開發(fā)中的模式,將 Service 類注?到 Controller 類中
屬性注入
屬性注?是使? @Autowired
實(shí)現(xiàn)的,實(shí)現(xiàn)代碼如下:
@Service public class UserService { public User user1(){ User user = new User(); return user; } } @Controller public class UserController { @Autowired private UserService userService; public User getUser(){ return userService.user1(); } } public class Test { public static void main(String[] args) { //獲取spring上下文 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml"); //獲取指定的Bean對(duì)象名稱+類型進(jìn)行獲取 UserController userController = applicationContext.getBean(UserController.class); userController.getUser().sayHi("zcx"); } }
構(gòu)造方法注入
構(gòu)造?法注?是在類的構(gòu)造?法中實(shí)現(xiàn)注?,實(shí)現(xiàn)代碼如下:
@Controller public class UserController { private UserService userService; @Autowired public UserController(UserService userService) { this.userService = userService; } public User getUser(){ return userService.user1(); } }
其余代碼寫法跟屬性注入一樣
Setter注入
在設(shè)置 set ?法的時(shí)候需要加上 @Autowired
注解
@Controller public class UserController { private UserService userService; @Autowired public void SetUserController(UserService userService) { this.userService = userService; } public User getUser(){ return userService.user1(); } }
@Resource(注入關(guān)鍵字)
@Controller public class UserController { @Resource private UserService userService; public User getUser(){ return userService.user1(); } }
使用@Resource
可以解決同?類型多個(gè) Bean 報(bào)錯(cuò)問題
可以如下設(shè)置方法名
@Resource(name = "user1")
@Autowired 和 @Resource 的區(qū)別
出身不同:@Autowired
來?于 Spring,? @Resource
來?于 JDK 的注解 使?時(shí)設(shè)置的參數(shù)不同:相?于 @Autowired
來說,@Resource
?持更多的參數(shù)設(shè)置,例如name 設(shè)置,根據(jù)名稱獲取 Bean @Autowired
可?于 Setter 注?、構(gòu)造函數(shù)注?和屬性注?,? @Resource
只能?于 Setter 注?和屬性注?,不能?于構(gòu)造函數(shù)注?
更多文章推薦:
2.2,000+ 道 Java面試題及答案整理(2024最新版)
3.《Java開發(fā)手冊(cè)(嵩山版)》最新發(fā)布!
到此這篇關(guān)于一文讀懂Spring中@Bean注解的核心作用的文章就介紹到這了,更多相關(guān)Spring 中 @Bean 注解用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中一個(gè)線程執(zhí)行死循環(huán)有什么后果
這篇文章主要為大家詳細(xì)介紹了Java中一個(gè)線程執(zhí)行死循環(huán)有什么后果,當(dāng)一個(gè)線程在執(zhí)行死循環(huán)時(shí)會(huì)影響另外一個(gè)線程嗎,下面為大家揭曉2016-05-05SpringBoot的配置文件(properties與yml)使用方法
配置文件中的配置類型有兩類,一類是系統(tǒng)配置項(xiàng),這種配置的格式都是固定的,是給系統(tǒng)使用的,另一種是用戶自定義配置,用戶可以隨意地規(guī)定配置項(xiàng)的格式,又用戶自行去設(shè)置和讀取,這篇文章主要介紹了SpringBoot的配置文件(properties與yml)使用方法,需要的朋友可以參考下2023-08-08