@Autowired@Resource@Qualifier的區別


spring不但支持自己定義的@Autowired注解,還支持幾個由JSR-250規范定義的注解,它們分別是@Resource、@PostConstruct以及@PreDestroy

@Resource的作用相當於@Autowired,只不過@Autowired按byType自動注入,而@Resource默認按 byName自動注入罷了。

@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型。

所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略。

1.@Autowired裝配順序

  1. 可以在成員字段,setter 方法,構造函數中使用
  2. 默認通過byType注入,如果有多個實現實例則會拋異常
  3. 如果有多個實例,則用@Qulifier注解配合使用(@Qulifier("bean名稱"))
  4. 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退為一個原始類型進行匹配,如果匹配則自動裝配;

2.@Resource裝配順序

  1. 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常
  2. 如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常
  3. 如果指定了type,則從上下文中找到類型匹配的唯一bean進行裝配,找不到或者找到多個,都會拋出異常
  4. 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退為一個原始類型進行匹配,如果匹配則自動裝配;

3.@Autowired 與@Resource的區別

  1、 @Autowired與@Resource都可以用來裝配bean. 都可以寫在字段上,或寫在setter方法上。

2、 @Autowired默認按類型裝配(這個注解是屬業spring的),默認情況下必須要求依賴對象必須存在,如果要允許null值,可以設置它的required屬性為false,如:@Autowired(required=false) ,如果我們想使用名稱裝配可以結合@Qualifier注解進行使用,如下:

@Autowired()
@Qualifier("baseDao")
private BaseDao baseDao;

3、@Resource(這個注解屬於J2EE的),默認按照名稱進行裝配,名稱可以通過name屬性進行指定,如果沒有指定name屬性,當注解寫在字段上時,默認取字段名進行安裝名稱查找,如果注解寫在setter方法上默認取屬性名進行裝配。當找不到與名稱匹配的bean時才按照類型進行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。

@Resource(name="baseDao")
private BaseDao baseDao;

4.@Qualifier

  當IOC容器中有多個接口實例時用於過濾所需的實例

  1.和@Autowired配合使用

        2.在@Bean修飾方法時注解形參

@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory1) {
    return new RabbitAdmin(connectionFactory);
}
@Bean
public RabbitAdmin rabbitAdmin(@Qualifier("connectionFactory2") ConnectionFactory connFactory) {   return new RabbitAdmin(connectionFactory); }

@Bean注入對象時默認方法名就是實例的名稱
若形參類型只有一個實例,不論形參取什么名,都按類型自動注入賦值
若參數類型有多個實例
1.若不使用@Qualifier形參名稱必須為其中一個實例的名稱嗎,否則報錯
2.若使用@Qualifier注解,形參名可以任意寫,但@Qualifier的參數名稱必須是其中一個的實例,否則報錯

 

-----------常用注解--------

--定義Bean的注解

 @Service @Respository @Controller @Compnent不指定value時 默認生成name的規則為

1.標准的駝峰命名時,bean的名字是類名首字母小寫的名稱,例如

@Service

public Class UserServiceImpl{

}

其bean的名稱為 userServiceImpl

 

 

2.特殊處理:當類的名字是以兩個或以上的大寫字母開頭的話,bean的名字會與類名保持一致 ,參考https://www.cnblogs.com/kevin-yuan/p/5437140.html

@Service

public Class VIPUserServiceImpl{

}

其bean的名稱為 VIPUserServiceImpl

 

@Controller

@Controller("Bean的名稱")

定義控制層,一般不指定bean名稱

@Service          

@Service("Bean的名稱")

定義業務層Bean

@Repository   

@Repository("Bean的名稱")

定義DAO層Bean

@Component  

定義Bean, 不好歸類時使用.

--自動裝配Bean (選用一種注解就可以)

@Autowired  (Srping提供的)

默認按類型匹配,自動裝配(Srping提供的),可以寫在成員屬性上,或寫在setter方法上

 

@Autowired(required=true)  

一定要找到匹配的Bean,否則拋異常。 默認值就是true 

 

@Autowired

@Qualifier("bean的名字") 

按名稱裝配Bean,與@Autowired組合使用,解決按類型匹配找到多個Bean問題。

 

@Resource   JSR-250提供的

默認按名稱裝配,當找不到名稱匹配的bean再按類型裝配.

可以寫在成員屬性上,或寫在setter方法上

可以通過@Resource(name="beanName") 指定被注入的bean的名稱, 要是未指定name屬性, 默認使用成員屬性的變量名,一般不用寫name屬性.

@Resource(name="beanName")指定了name屬性,按名稱注入但沒找到bean, 就不會再按類型裝配了

 

參考:https://www.cnblogs.com/fengli9998/p/7472247.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM