Spring中咱們可使用如下三個自動裝配的註解進行依賴注入:java
@Autowired註解默認是按照類型(byType)裝配依賴對象,默認狀況下它要求依賴對象必須存在,當沒有找到相應bean的時候,IOC容器就會報錯。不過@Autowired有個required屬性,能夠配置爲false,若是配置爲false以後,當沒有找到相應bean的時候就注入null,系統不會拋錯。若是咱們想使用按照名稱(byName)來裝配,能夠結合@Qualifier註解一塊兒使用。spring
@Resource默認按照名字(byName)裝配依賴對象,由JAVAEE提供,須要導入包javax.annotation.Resource。@Resource有兩個重要的屬性:name和type,而Spring將@Resource註解的name屬性解析爲bean的名字,而type屬性則解析爲bean的類型。因此,若是使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。若是既不制定name也不制定type屬性,這時將經過反射機制使用byName自動注入策略。bash
@Inject註解默認也是按照類型(byType)裝配依賴對象,若是須要按名稱進行裝配,則須要配合@Named註解。@Inject 註解沒有 required 屬性,所以在找不到合適的依賴對象時 inject 會系統會報錯失敗。 使用 @Inject 須要添加以下依賴:app
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
複製代碼
在Spring框架內部實現當中,註解實現注入主要是經過bean後置處理器BeanPostPocessor接口的實現類來生效的。BeanPostProcessor後置處理器是在spring容器啓動時,建立bean對象實例後,立刻執行的,對bean對象實例進行加工處理。 框架
@Autowired是經過BeanPostProcessor接口的實現類AutowiredAnnotationBeanPostProcessor來實現對bean對象對其餘bean對象的依賴注入的;ui
@Resource和@Inject是經過BeanPostProcessor接口的實現類CommonAnnotationBeanPostProcessor來實現的,顧名思義即公共註解CommonAnotation,CommonAnnotationBeanPostProcessor是Spring中統一處理JDK中定義的註解的一個BeanPostProcessor。該類會處理的註解還包括@PostConstruct,@PreDestroy等。spa
AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor添加到Spring容器的BeanPostProcessor的條件,即激活這些處理器的條件以下:code
在對應的Spring容器的配置xml文件中,如applicationContext.xml,添加<context:annotation-config />和<context:component-scan />,或者只使用<context:component-scan />。 二者的區別是:<context:annotation-config />只查找並激活已經存在的bean,如經過xml文件的bean標籤生成加載到Spring容器的,而不會去掃描如@Controller等註解的bean,查找到以後進行注入;而<context:component-scan />除了具備<context:annotation-config />的功能以外,還會去加載經過basePackages屬性指定的包下面的,默認爲掃描@Controller,@Service,@Component,@Repository註解的類。不指定basePackages則是類路徑下面,或者若是使用註解@ComponentScan方式,則是當前類所在包及其子包下面。component
若是是基於配置類而不是基於applicationContext.xml來對Spring進行配置,如SpringBoot,則在內部使用的IOC容器實現爲AnnotationConfigApplicationContext或者其派生類,在AnnotationConfigApplicationContext內部會自動建立和激活以上的BeanPostProcessor。 若是同時存在基於xml的配置和配置類的配置,而在注入時間方面,基於註解的注入先於基於XML的注入,因此基於XML的注入會覆蓋基於註解的注入。cdn