spring不但支持本身定義的@Autowired註解,還支持幾個由JSR-250規範定義的註解,它們分別是@Resource、@PostConstruct以及@PreDestroyhtml
@Resource的做用至關於@Autowired,只不過@Autowired按byType自動注入,而@Resource默認按 byName自動注入罷了。java
@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource註解的name屬性解析爲bean的名字,而type屬性則解析爲bean的類型。spring
因此若是使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。若是既不指定name也不指定type屬性,這時將經過反射機制使用byName自動注入策略。函數
1.@Autowired裝配順序ui
1. 能夠在成員字段,setter 方法,構造函數中使用
2. 默認經過byType注入,若是有多個實現實例則會拋異常
3. 若是有多個實例,則用@Qulifier註解配合使用(@Qulifier("bean名稱"))
4. 若是既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;若是沒有匹配,則回退爲一個原始類型進行匹配,若是匹配則自動裝配;url
2.@Resource裝配順序spa
1. 若是同時指定了name和type,則從Spring上下文中找到惟一匹配的bean進行裝配,找不到則拋出異常
2. 若是指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常
3. 若是指定了type,則從上下文中找到類型匹配的惟一bean進行裝配,找不到或者找到多個,都會拋出異常
4. 若是既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;若是沒有匹配,則回退爲一個原始類型進行匹配,若是匹配則自動裝配;.net
3.@Autowired 與@Resource的區別code
一、 @Autowired與@Resource均可以用來裝配bean. 均可以寫在字段上,或寫在setter方法上。htm
二、 @Autowired默認按類型裝配(這個註解是屬業spring的),默認狀況下必需要求依賴對象必須存在,若是要容許null值,能夠設置它的required屬性爲false,如:@Autowired(required=false) ,若是咱們想使用名稱裝配能夠結合@Qualifier註解進行使用,以下:
@Autowired() @Qualifier("baseDao") private BaseDao baseDao;
三、@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, 就不會再按類型裝配了