Spring中存儲(chǔ)Bean的常見(jiàn)注解方式
IoC & DI
IoC: Inversion of Control (控制反轉(zhuǎn)), 也就是說(shuō) Spring 是?個(gè)"控制反轉(zhuǎn)"的容器.
控制反轉(zhuǎn):也就是控制權(quán)反轉(zhuǎn). 什么的控制權(quán)發(fā)?了反轉(zhuǎn)? 獲得依賴對(duì)象的過(guò)程被反轉(zhuǎn)了
也就是說(shuō), 當(dāng)需要某個(gè)對(duì)象時(shí), 傳統(tǒng)開(kāi)發(fā)模式中需要??通過(guò) new 創(chuàng)建對(duì)象, 現(xiàn)在不需要再進(jìn)?創(chuàng)
建, 把創(chuàng)建對(duì)象的任務(wù)交給容器, 程序中只需要依賴注? (Dependency Injection,DI)就可以了.
這個(gè)容器稱為:IoC容器. Spring是?個(gè)IoC容器, 所以有時(shí)Spring 也稱為Spring 容器。
DI: Dependency Injection(依賴注?)
容器在運(yùn)?期間, 動(dòng)態(tài)的為應(yīng)?程序提供運(yùn)?時(shí)所依賴的資源,稱之為依賴注?。
依賴注?(DI)和控制反轉(zhuǎn)(IoC)是從不同的?度的描述的同?件事情,就是指通過(guò)
引? IoC 容器,利?依賴關(guān)系注?的?式,實(shí)現(xiàn)對(duì)象之間的解耦。
IOC(控制反轉(zhuǎn))詳解
共有兩類注解類型可以實(shí)現(xiàn)Bean的存儲(chǔ):
1. 類注解:@Controller、@Service、@Repository、@Component、@Configuration.
2. ?法注解:@Bean.
類注解
1、@Controller(控制器存儲(chǔ))
使? @Controller 存儲(chǔ) bean 的代碼如下所?:
@Controller // 將對(duì)象存儲(chǔ)到 Spring 中 public class UserController { public void sayHi(){ System.out.println("hi,UserController..."); } }
表示將這個(gè)類的對(duì)象存儲(chǔ)到ioc容器當(dāng)中,并表明這是一個(gè)controller類。負(fù)責(zé) 接收請(qǐng)求, 對(duì)請(qǐng)求進(jìn)?處理, 并進(jìn)?響應(yīng)。
2、@Service(服務(wù)存儲(chǔ))
使? @Service 存儲(chǔ) bean 的代碼如下所?:
@Service public class UserService { public void sayHi(String name) { System.out.println("Hi," + name); } }
表示將這個(gè)類的對(duì)象存儲(chǔ)到ioc容器當(dāng)中,并表明這是一個(gè)service類。負(fù)責(zé)處理具體的業(yè)務(wù)邏輯。
3、@Repository(倉(cāng)庫(kù)存儲(chǔ))
使? @Repository 存儲(chǔ) bean 的代碼如下所?:
@Repository public class UserRepository { public void sayHi() { System.out.println("Hi, UserRepository~"); } }
表示數(shù)據(jù)訪問(wèn)層,也稱為持久層. 負(fù)責(zé)數(shù)據(jù)訪問(wèn)操作。
4、@Component(組件存儲(chǔ))
使? @Component 存儲(chǔ) bean 的代碼如下所?:
@Component public class UserComponent { public void sayHi() { System.out.println("Hi, UserComponent~"); } }
單純將這個(gè)類的對(duì)象加入到ioc容器中,沒(méi)有其他含義。
5、@Configuration(配置存儲(chǔ))
使? @Configuration 存儲(chǔ) bean 的代碼如下所?:
@Configuration public class UserConfiguration { public void sayHi() { System.out.println("Hi,UserConfiguration~"); } }
表示配置層. 處理項(xiàng)?中的?些配置信息。
方法注解
@Bean
@Bean注解可以將類中的方法注入到ioc容器當(dāng)中,使一個(gè)類可以擁有多個(gè)對(duì)象。
使用@Bean注解存儲(chǔ)bean代碼如下:
@Component public class BeanConfig { @Bean public User user(){ User user = new User(); user.setName("zhangsan"); user.setAge(18); return user; } }
注:@Bean注解必須搭配@Component注解使用才能生效。否則無(wú)效。
@Bean注解的優(yōu)勢(shì)在于同一個(gè)類可以定義多個(gè)對(duì)象:
@Component public class BeanConfig { @Bean public User user1(){ User user = new User(); user.setName("zhangsan"); user.setAge(18); return user; } @Bean public User user2(){ User user = new User(); user.setName("lisi"); user.setAge(19); return user; } }
類中的兩個(gè)Bean對(duì)象的名稱如下:
可以通過(guò)設(shè)置 name 屬性給 Bean 對(duì)象進(jìn)?重命名操作,如下代碼所?:
@Bean(name = {"u1","user1"}) public User user1(){ User user = new User(); user.setName("zhangsan"); user.setAge(18); return user; }
依賴注入的三種方式
關(guān)于依賴注?, Spring給我們提供了三種?式:
1. 屬性注?(Field Injection)
屬性注?是使? @Autowired 實(shí)現(xiàn)的,如將 Service 類注?到 Controller 類中.
Service 類的實(shí)現(xiàn)代碼如下:
@Service public class UserService { public void sayHi() { System.out.println("Hi,UserService"); } }
Controller 類的實(shí)現(xiàn)代碼如下:
@Controller public class UserController { //注??法1: 屬性注? @Autowired private UserService userService; public void sayHi(){ System.out.println("hi,UserController..."); userService.sayHi(); } }
最終結(jié)果如下:
2. 構(gòu)造方法注?(Constructor Injection)
構(gòu)造?法注?是在類的構(gòu)造?法中實(shí)現(xiàn)注?,如下代碼所示:
@Controller public class UserController2 { //注??法2: 構(gòu)造?法 private UserService userService; @Autowired public UserController2(UserService userService) { this.userService = userService; } public void sayHi(){ System.out.println("hi,UserController2..."); userService.sayHi(); } }
注意事項(xiàng):如果類只有?個(gè)構(gòu)造?法,那么 @Autowired 注解可以省略;如果類中有多個(gè)構(gòu)造?法,那么需要添加上 @Autowired 來(lái)明確指定到底使?哪個(gè)構(gòu)造?法。
3. Setter 注?(Setter Injection)
Setter 注?和屬性的 Setter ?法實(shí)現(xiàn)類似,只不過(guò)在設(shè)置 set ?法的時(shí)候需要加上 @Autowired 注
解 ,如下代碼所?:
@Controller public class UserController3 { //注??法3: Setter?法注? private UserService userService; @Autowired public void setUserService(UserService userService) { this.userService = userService; } public void sayHi(){ System.out.println("hi,UserController3..."); userService.sayHi(); } }
特殊情況:當(dāng)同一類型存在多個(gè)bean對(duì)象時(shí),使用@Autowired會(huì)出現(xiàn)問(wèn)題。
@Component public class BeanConfig { @Bean("u1") public User user1(){ User user = new User(); user.setName("zhangsan"); user.setAge(18); return user; } @Bean public User user2() { User user = new User(); user.setName("lisi"); user.setAge(19); return user; } }
@Controller public class UserController { @Autowired private UserService userService; //注?user @Autowired private User user; public void sayHi(){ System.out.println("hi,UserController..."); userService.sayHi(); System.out.println(user); } }
spring提供了以下解決方案:
@Primary
使?@Primary注解:當(dāng)存在多個(gè)相同類型的Bean注?時(shí),加上@Primary注解,來(lái)確定默認(rèn)的實(shí)現(xiàn).
@Component public class BeanConfig { @Primary //指定該bean為默認(rèn)bean的實(shí)現(xiàn) @Bean("u1") public User user1(){ User user = new User(); user.setName("zhangsan"); user.setAge(18); return user; } @Bean public User user2() { User user = new User(); user.setName("lisi"); user.setAge(19); return user; } }
@Qualifier
使?@Qualifier注解:指定當(dāng)前要注?的bean對(duì)象。 在@Qualifier的value屬性中,指定注?的bean的名稱。
• @Qualifier注解不能單獨(dú)使?,必須配合@Autowired使?
@Controller public class UserController { @Qualifier("user2") //指定bean名稱 @Autowired private User user; public void sayHi(){ System.out.println("hi,UserController..."); System.out.println(user); } }
@Resource
使?@Resource注解:是按照bean的名稱進(jìn)?注?。通過(guò)name屬性指定要注?的bean的名稱。
@Controller public class UserController { @Resource(name = "user2") private User user; public void sayHi(){ System.out.println("hi,UserController..."); System.out.println(user); } }
常??試題:
@Autowird 與 @Resource的區(qū)別
• @Autowired 是spring框架提供的注解,?@Resource是JDK提供的注解
• @Autowired 默認(rèn)是按照類型注?,?@Resource是按照名稱注?. 相?于 @Autowired 來(lái)說(shuō),
@Resource ?持更多的參數(shù)設(shè)置,例如 name 設(shè)置,根據(jù)名稱獲取 Bean。
以上關(guān)于IOC與DI,希望對(duì)你有所幫助。
到此這篇關(guān)于Spring中存儲(chǔ)Bean的常見(jiàn)注解方式的文章就介紹到這了,更多相關(guān)Spring存儲(chǔ)Bean內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于java socket實(shí)現(xiàn) 聊天小程序
這篇文章主要介紹了基于java socket實(shí)現(xiàn) 聊天小程序,代碼分為服務(wù)器和客戶端,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12java,android,MD5加密算法的實(shí)現(xiàn)代碼(16位,32位)
下面小編就為大家?guī)?lái)一篇java,android,MD5加密算法的實(shí)現(xiàn)代碼(16位,32位)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09java中@DateTimeFormat和@JsonFormat注解的使用
本文主要介紹了java中@DateTimeFormat和@JsonFormat注解的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Java全局異常處理器實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Java全局異常處理器實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02mybatis-plus 查詢時(shí)排除字段方法的兩種方法
我們?cè)陂_(kāi)發(fā)應(yīng)用時(shí),在某些應(yīng)用場(chǎng)景下查詢有時(shí)需要排除某些字段,本文主要介紹了兩種方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09Flutter ListView 上拉加載更多下拉刷新功能實(shí)現(xiàn)方法
這篇文章主要介紹了Flutter ListView 上拉加載更多下拉刷新功能實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07基于Java實(shí)現(xiàn)XML文件的解析與更新
配置文件可以有很多種格式,包括?INI、JSON、YAML?和?XML。每一種編程語(yǔ)言解析這些格式的方式都不同。本文將通過(guò)Java語(yǔ)言實(shí)現(xiàn)XML文件的解析與更新,需要的可以參考一下2022-03-03Mybatis分頁(yè)插件PageHelper的配置和簡(jiǎn)單使用方法(推薦)
在使用Java Spring開(kāi)發(fā)的時(shí)候,Mybatis算是對(duì)數(shù)據(jù)庫(kù)操作的利器了。這篇文章主要介紹了Mybatis分頁(yè)插件PageHelper的配置和使用方法,需要的朋友可以參考下2017-12-12