實際上Ioc容器中的大量功能都是經過後置處理器實現的,這裏介紹幾個主要的處理器。spring
官方的一些功能就是用後置處理器的方式實現的,例如RequiredAnnotationBeanPostProcessor,它用於處理@Required註解。當咱們一個Setter方法加入@Required後,表示必須設置參數,若是未設置則拋出BeanInitializationException異常。框架
使用方法1,直接添加一個Bean:ui
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" /> <!-- 其餘bean -->
這至關於直接添加一個後置處理器,他會檢查全部的被@Required標註的Setter方法。spa
使用方法2,設置context:code
<!-- 若是使用瞭如下2個context級別的標籤,則會啓用RequiredAnnotationBeanPostProcessor的功能 --> <context:annotation-config /> <context:component-scan />
使用技巧1,修改掃描的註解。處理器默認會識別@Required註解,可是能夠經過RequiredAnnotationBeanPostProcessor::setRequiredAnnotationType修改生效的註解,例如:component
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"> <property name="requiredAnnotationType" value="x.y.Require" /> </bean>
package x.y; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Require {}
使用技巧2,告知RequiredAnnotationBeanPostProcessor不處理某些Bean方法:繼承
<bean class="x.y.A"> <meta key="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor.skipRequiredCheck" value="true" /> </bean>
這個後置處理器在3.x以後使用Spring框架的系統幾乎都會使用,就是他在處理大名鼎鼎的@Autowired和@Value註解。此外他也支持JSR-330中的@Inject註解。當咱們使用<context:annotation-config />
或<context:component-scan />時,IoC容器也會啓用這個功能。生命週期
能夠經過setAutowiredAnnotationType、setAutowiredAnnotationTypes方法設定對應的註解,能夠經過setRequiredParameterName來設置@Autowired中的屬性方法:ip
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"> <property name="autowiredAnnotationType" value="x.y.MyInjectAnnotation" /> </bean>
這個處理器繼承InitDestroyAnnotationBeanPostProcessor實現JSR-250的@PostConstruct和@PreDestroy的處理,此外還支持@Resource註解。JSR-250和Resouce貌似沒有什麼太直接的關係,因此被命名爲Common表示這是一個大雜燴通常的存在。一樣使用annotation-config和component-scan會被自動啓用(由於都是用於處理註解的)。資源
一樣也有initAnnotationType、destroyAnnotationType等Setter方法來設置自定義註解。
處理Bean的生命週期方法以及資源數據注入,CommonAnnotationBeanPostProcessor繼承自它。