一、@Autowired和@Qualifier
@Autowired是自動注入的注解,寫在屬性、方法、構造方法上,會按照類型自動裝配屬性或參數。該注解,可以自動裝配接口的實現類,但前提是spring容器中只有一個實現類的bean,多個bean會報錯。同樣,自動裝配其他類型時也一樣。
但同樣的類型的bean有多個實例或同樣的接口有多個實現類的bean,可以使用@Qualifier指定bean名稱,指定bean名稱后,就會按照bean的名稱匹配。
- 寫在屬性上,會自動注入bean到屬性里。
- 寫在方法或構造方法上,會將自動注入bean到參數里。
另外,@AutoWired無法對String、int等常量數據注入。
裝配規則:
當添加@Qualifier時,按照bean的名稱匹配。
當只寫@Autowired時,按照類型自動裝配,若同時有多個或一個都不滿足,會報錯。
1、寫在屬性上
@Autowired默認按照類型注入,匹配屬性類型,也可使用@Qualifier指定bean名稱,使用bean名稱裝配。
@Autowired @Qualifier("userServiceImpl") private UserService userService;
2、寫在方法上
@Component("testSon") public class Son { int num = 99; } @Autowired public Father(@Qualifier("testSon") Son son) { this.son = son; }
二、@Resource
@Resource並非spring中的注解,而是tomcat內的javax.annotation包下的注解。
該注解可以寫在屬性上或方法上,實現自動注入。不能寫在構造方法上。
裝配規則:
當只寫注解,默認按屬性名查找beanid,查到則直接裝配,若spring容器中沒有該beanid,則繼續安裝屬性類型匹配,若只有一個匹配,則裝配;若同時滿足多個則報錯。
當使用了name參數,則只按照name值匹配beanid,沒有滿足條件,會報錯。
1、@Resource默認安照屬性名注入,可使用name和type屬性指定bean名稱和類型
@Resource(name="testSon")
Son son;
2、寫在set方法上
@Resource(name="testSon") public void setSon(Son son) { this.son = son; }