基于注解的配置
其實(shí)前面我們已經(jīng)在基于注解配置了,這是由于個(gè)人比較喜歡基于注解配置。
Spring官方文檔提過(guò)一個(gè)問(wèn)題:基于注解配置要好于基于xml的配置嗎?其實(shí)各有千秋,根據(jù)個(gè)人喜好吧。重要的是Spring可以支持基于注解配置,也可以支持基于xml配置文件配置,也可以支持兩者的混搭。
我們可以使用Spring的基于BeanPostProcessor的@Autowire注解,Spring也支持JSR-250的@PostConstruct和@PreDestroy注解,以及基于 JSR-330 (Dependency Injection for Java) 的注解 @Inject 和 @Named。
基于注解的依賴注入的執(zhí)行要早于基于xml配置文件,所以如果同時(shí)使用的話,基于xml文件的配置要優(yōu)先于基于注解的:xml配置會(huì)覆蓋掉注解配置。
通過(guò)以下配置可以實(shí)現(xiàn)混合xml和注解的配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd" >
<context:annotation-config/>
<context:component-scan base-package="packageName.packageName"/>
</beans>
基于注解的配置的底層生效原理其實(shí)是通過(guò)BeanPostProcessor,配置項(xiàng) context:annotation-config/在Spring容器中隱式的注冊(cè)了如下BeanPostProcessor:
ConfigurationClassPostProcessor
AutowiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor
EventListenerMethodProcessor
比如@Autoware注解就是通過(guò)AutowiredAnnotationBeanPostProcessor(postProcessProperties方法)生效的。
@Autowired注解
@Autowired注解可以作用在構(gòu)造方法、屬性、以及普通方法上,我們?cè)谇懊娴奈恼轮幸呀?jīng)做過(guò)說(shuō)明。
作用在構(gòu)造方法和普通方法上,會(huì)自動(dòng)裝配方法中的參數(shù),作用在屬性上則自動(dòng)裝配該屬性。
@Autowired注解是通過(guò)類型匹配的,所以添加注解的參數(shù)類型和注冊(cè)到Spring IoC容器中的Bean的類型必須要匹配,如果Spring IoC在自動(dòng)裝配的過(guò)程中找不到匹配的Bean執(zhí)行注入的話,會(huì)發(fā)生注入失敗,拋異常。
Spring可以支持將同一類型的Bean注入到集合對(duì)象中,比如:
public class MovieRecommender {
private Set<MovieCatalog> movieCatalogs;
@Autowired
public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {
this.movieCatalogs = movieCatalogs;
}
// ...
}
則Spring IoC容器中的所有類型為MovieCatalog的Bean都會(huì)注入到movieCatalogs中。MovieCatalog可以通過(guò)實(shí)現(xiàn) org.springframework.core.Ordered接口或者使用@Order注解、 @Priority注解實(shí)現(xiàn)排序。
也可以將同類型的對(duì)象注入到Map中:
public class MovieRecommender {
private Map<String, MovieCatalog> movieCatalogs;
@Autowired
public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {
this.movieCatalogs = movieCatalogs;
}
// ...
}
此時(shí)Map的key值為bean name,value值為bean對(duì)象。
默認(rèn)情況下@Autowired注解期望必須能夠注入一個(gè)依賴對(duì)象到目標(biāo)對(duì)象中,否則,如果沒(méi)有匹配到、或者匹配到多個(gè)對(duì)象的話,注入失敗,拋異常。
通過(guò)@Autowired對(duì)集合類型注入也要求必須要有至少一個(gè)bean存在,不存在的話會(huì)拋異常。
可以通過(guò)@Autowired的屬性required來(lái)改變這一行為:默認(rèn)情況下required = true,我們可以修改required = false,則允許匹配不到依賴對(duì)象的情況存在,此時(shí)不注入任何對(duì)象,目標(biāo)對(duì)象的值為null。
當(dāng)@Autowired作用于構(gòu)造方法上的時(shí)候,required 設(shè)置為true的情況下,僅允許有一個(gè)構(gòu)造方法設(shè)置為@Autowired。當(dāng)多個(gè)構(gòu)造方法被設(shè)置為@Autowired(required必須設(shè)置為false)的時(shí)候,Sping IoC在注入的時(shí)候會(huì)選擇構(gòu)造方法參數(shù)依賴注入滿足程度最好的構(gòu)造器執(zhí)行注入。如果一個(gè)類有多個(gè)構(gòu)造器、并且都沒(méi)有設(shè)置@Autowired,則主構(gòu)造器、或者默認(rèn)的構(gòu)造器會(huì)被執(zhí)行;如果一個(gè)類只有一個(gè)構(gòu)造器,那么該構(gòu)造器就一定會(huì)被執(zhí)行,即使該構(gòu)造器并沒(méi)有標(biāo)注@Autowired。
java 8 的java.util.Optional、以及@Nullable(Spring5.0以后)同樣可以用來(lái)標(biāo)注@Autowired為非必須(等同于required=false):
public class SimpleMovieLister {
@Autowired
public void setMovieFinder(Optional<MovieFinder> movieFinder) {
...
}
}
最后:
The @Autowired, @Inject, @Value, and @Resource annotations are handled by Spring BeanPostProcessor implementations. This means that you cannot apply these annotations within your own BeanPostProcessor or BeanFactoryPostProcessor types (if any). These types must be ‘wired up’ explicitly by using XML or a Spring @Bean method.
由于@Autowired, @Inject, @Value, and @Resource是通過(guò)BeanPostProcessor實(shí)現(xiàn)的,所以如果你自己實(shí)現(xiàn)了一個(gè)BeanPostProcessor,那就不能用以上幾個(gè)注解,用以上幾個(gè)注解是無(wú)法實(shí)現(xiàn)BeanPostProcessor功能的(錯(cuò)過(guò)了BeanPostProcessor的時(shí)機(jī))。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-495135.html
上一篇 Spring FrameWork從入門到NB -Lazy-initialized Beans文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-495135.html
到了這里,關(guān)于Spring FrameWork從入門到NB -基于注解配置 & @Autowired注解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!