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, 就不會再按類型裝配了