Spring中存儲Bean的常見注解方式
IoC & DI
IoC: Inversion of Control (控制反轉), 也就是說 Spring 是?個"控制反轉"的容器.
控制反轉:也就是控制權反轉. 什么的控制權發(fā)?了反轉? 獲得依賴對象的過程被反轉了
也就是說, 當需要某個對象時, 傳統(tǒng)開發(fā)模式中需要??通過 new 創(chuàng)建對象, 現(xiàn)在不需要再進?創(chuàng)
建, 把創(chuàng)建對象的任務交給容器, 程序中只需要依賴注? (Dependency Injection,DI)就可以了.
這個容器稱為:IoC容器. Spring是?個IoC容器, 所以有時Spring 也稱為Spring 容器。
DI: Dependency Injection(依賴注?)
容器在運?期間, 動態(tài)的為應?程序提供運?時所依賴的資源,稱之為依賴注?。
依賴注?(DI)和控制反轉(IoC)是從不同的?度的描述的同?件事情,就是指通過
引? IoC 容器,利?依賴關系注?的?式,實現(xiàn)對象之間的解耦。
IOC(控制反轉)詳解
共有兩類注解類型可以實現(xiàn)Bean的存儲:
1. 類注解:@Controller、@Service、@Repository、@Component、@Configuration.
2. ?法注解:@Bean.
類注解
1、@Controller(控制器存儲)
使? @Controller 存儲 bean 的代碼如下所?:
@Controller // 將對象存儲到 Spring 中
public class UserController {
public void sayHi(){
System.out.println("hi,UserController...");
}
}表示將這個類的對象存儲到ioc容器當中,并表明這是一個controller類。負責 接收請求, 對請求進?處理, 并進?響應。
2、@Service(服務存儲)
使? @Service 存儲 bean 的代碼如下所?:
@Service
public class UserService {
public void sayHi(String name) {
System.out.println("Hi," + name);
}
}表示將這個類的對象存儲到ioc容器當中,并表明這是一個service類。負責處理具體的業(yè)務邏輯。
3、@Repository(倉庫存儲)
使? @Repository 存儲 bean 的代碼如下所?:
@Repository
public class UserRepository {
public void sayHi() {
System.out.println("Hi, UserRepository~");
}
}表示數據訪問層,也稱為持久層. 負責數據訪問操作。
4、@Component(組件存儲)
使? @Component 存儲 bean 的代碼如下所?:
@Component
public class UserComponent {
public void sayHi() {
System.out.println("Hi, UserComponent~");
}
}單純將這個類的對象加入到ioc容器中,沒有其他含義。
5、@Configuration(配置存儲)
使? @Configuration 存儲 bean 的代碼如下所?:
@Configuration
public class UserConfiguration {
public void sayHi() {
System.out.println("Hi,UserConfiguration~");
}
}表示配置層. 處理項?中的?些配置信息。
方法注解
@Bean
@Bean注解可以將類中的方法注入到ioc容器當中,使一個類可以擁有多個對象。
使用@Bean注解存儲bean代碼如下:
@Component
public class BeanConfig {
@Bean
public User user(){
User user = new User();
user.setName("zhangsan");
user.setAge(18);
return user;
}
}注:@Bean注解必須搭配@Component注解使用才能生效。否則無效。
@Bean注解的優(yōu)勢在于同一個類可以定義多個對象:
@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;
}
}類中的兩個Bean對象的名稱如下:

可以通過設置 name 屬性給 Bean 對象進?重命名操作,如下代碼所?:
@Bean(name = {"u1","user1"})
public User user1(){
User user = new User();
user.setName("zhangsan");
user.setAge(18);
return user;
}依賴注入的三種方式
關于依賴注?, Spring給我們提供了三種?式:
1. 屬性注?(Field Injection)
屬性注?是使? @Autowired 實現(xiàn)的,如將 Service 類注?到 Controller 類中.
Service 類的實現(xiàn)代碼如下:
@Service
public class UserService {
public void sayHi() {
System.out.println("Hi,UserService");
}
}Controller 類的實現(xiàn)代碼如下:
@Controller
public class UserController {
//注??法1: 屬性注?
@Autowired
private UserService userService;
public void sayHi(){
System.out.println("hi,UserController...");
userService.sayHi();
}
}最終結果如下:

2. 構造方法注?(Constructor Injection)
構造?法注?是在類的構造?法中實現(xiàn)注?,如下代碼所示:
@Controller
public class UserController2 {
//注??法2: 構造?法
private UserService userService;
@Autowired
public UserController2(UserService userService) {
this.userService = userService;
}
public void sayHi(){
System.out.println("hi,UserController2...");
userService.sayHi();
}
}注意事項:如果類只有?個構造?法,那么 @Autowired 注解可以省略;如果類中有多個構造?法,那么需要添加上 @Autowired 來明確指定到底使?哪個構造?法。
3. Setter 注?(Setter Injection)
Setter 注?和屬性的 Setter ?法實現(xiàn)類似,只不過在設置 set ?法的時候需要加上 @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();
}
}特殊情況:當同一類型存在多個bean對象時,使用@Autowired會出現(xià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注解:當存在多個相同類型的Bean注?時,加上@Primary注解,來確定默認的實現(xiàn).
@Component
public class BeanConfig {
@Primary //指定該bean為默認bean的實現(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注解:指定當前要注?的bean對象。 在@Qualifier的value屬性中,指定注?的bean的名稱。
• @Qualifier注解不能單獨使?,必須配合@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的名稱進?注?。通過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 默認是按照類型注?,?@Resource是按照名稱注?. 相?于 @Autowired 來說,
@Resource ?持更多的參數設置,例如 name 設置,根據名稱獲取 Bean。
以上關于IOC與DI,希望對你有所幫助。
到此這篇關于Spring中存儲Bean的常見注解方式的文章就介紹到這了,更多相關Spring存儲Bean內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java,android,MD5加密算法的實現(xiàn)代碼(16位,32位)
下面小編就為大家?guī)硪黄猨ava,android,MD5加密算法的實現(xiàn)代碼(16位,32位)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09
java中@DateTimeFormat和@JsonFormat注解的使用
本文主要介紹了java中@DateTimeFormat和@JsonFormat注解的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08
Flutter ListView 上拉加載更多下拉刷新功能實現(xiàn)方法
這篇文章主要介紹了Flutter ListView 上拉加載更多下拉刷新功能實現(xiàn)方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07
Mybatis分頁插件PageHelper的配置和簡單使用方法(推薦)
在使用Java Spring開發(fā)的時候,Mybatis算是對數據庫操作的利器了。這篇文章主要介紹了Mybatis分頁插件PageHelper的配置和使用方法,需要的朋友可以參考下2017-12-12

