SPRing context命名空間有property-placeholder、property-override、annotation-config、component-scan、load-time-weaver、spring-configured、mbean-export和mbean-server 8個標簽。
上一節探討了 property-placeholder和property-override標簽的解析,這一節來探討一下annotation-config的解析與用途。
annotation-config標簽用于向BeanDefinitionRegistry對象(BeanDefinition注冊表)中注冊處理注解配置的工廠后處理器類和bean后處理器類以及其他一些特定類對應的BeanDefinition對象。這些類和注解有
處理@Configuration注解的ConfigurationClassPostProcessor工廠后處理器;
處理@Autowired、@Value、@Inject以及@Lookup注解的AutowiredAnnotationBeanPostProcessor bean后處理器;
處理@Required注解的RequiredAnnotationBeanPostProcessor bean后處理器;
處理JSR-250的@Resource、@PostConstruct、@PreDestroy、@EJB和@WebServiceRef注解的CommonAnnotationBeanPostProcessor bean后處理器;
處理JPA注解的PersistenceAnnotationBeanPostProcessor bean后處理器
處理@EventListener注解的EventListenerMethodProcessor后處理器和創建applicationListener對象的EventListenerFactory對象。
annotation-config標簽的解析器類為AnnotationConfigBeanDefinitionParser,它直接實現了BeanDefinitionParser接口,下面是它實現的parse方法的源代碼。
@Override public BeanDefinition parse(Element element, ParserContext parserContext) { Object source = parserContext.extractSource(element); // 注冊所有相關的BeanPostProcessor. Set<BeanDefinitionHolder> processorDefinitions = AnnotationConfigUtils.registerAnnotationConfigProcessors(parserContext.getRegistry(), source); CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), source); parserContext.pushContainingComponent(compDefinition); for (BeanDefinitionHolder processorDefinition : processorDefinitions) { parserContext.registerComponent(new BeanComponentDefinition(processorDefinition)); } // 最后注冊 composite component. parserContext.popAndRegisterContainingComponent(); return null; }parse方法主要調用注解配置工具類AnnotationConfigUtils的registerAnnotationConfigProcessors靜態方法來注冊于注解配置有關的bean后處理器,這個方法的源碼如下。
private static final boolean jsr250Present = ClassUtils.isPresent("javax.annotation.Resource", AnnotationConfigUtils.class.getClassLoader()); // 定義常量PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME // = "org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" private static final boolean jpaPresent = ClassUtils.isPresent("javax.persistence.EntityManagerFactory", AnnotationConfigUtils.class.getClassLoader()) && ClassUtils.isPresent(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, AnnotationConfigUtils.class.getClassLoader()); /** * 注冊用于注解配置的bean后處理器 **/ public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors( BeanDefinitionRegistry registry, Object source) { DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry); if (beanFactory != null) { if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) { beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE); } // 設置自動注入候選對象的解析器,用于判斷BeanDefinition是否為候選對象 if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) { beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver()); } } Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<BeanDefinitionHolder>(4); // 設置處理@Configuration注解的工廠后處理器 // 常量CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME // ="org.springframework.context.annotation.internalConfigurationAnnotationProcessor"; if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) { RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class); def.setSource(source); beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)); } // 設置用于處理@Autowired、@Value、@Inject以及@Lookup注解 // 定義常量AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME // = "org.springframework.context.annotation.internalAutowiredAnnotationProcessor" if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) { RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class); def.setSource(source); beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)); } // 設置處理@Required注解的bean后處理器 // 定義常量REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME // = "org.springframework.context.annotation.internalRequiredAnnotationProcessor" if (!registry.containsBeanDefinition(REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) { RootBeanDefinition def = new RootBeanDefinition(RequiredAnnotationBeanPostProcessor.class); def.setSource(source); beanDefs.add(registerPostProcessor(registry, def, REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME)); } // 設置處理JSR-250提供的注解的bean后處理器。 // 比如,@Resource, @PostConstruct, @PreDestroy, @EJB, @WebServiceRef // 檢查系統是否支持JSR-250 // 定義常量COMMON_ANNOTATION_PROCESSOR_BEAN_NAME // = "org.springframework.context.annotation.internalCommonAnnotationProcessor"; if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) { RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class); def.setSource(source); beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)); } // 注冊用于處理JPA注解的bean后處理器 // 檢查系統是否支持JPA // 定義常量PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME // = "org.springframework.context.annotation.internalPersistenceAnnotationProcessor" if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) { RootBeanDefinition def = new RootBeanDefinition(); try { // 定義常量PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME // = "org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, AnnotationConfigUtils.class.getClassLoader())); } catch (ClassNotFoundException ex) { throw new IllegalStateException( "Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex); } def.setSource(source); beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)); } // 設置用于處理@EventListener注解的bean后處理器 // 定義常量EVENT_LISTENER_PROCESSOR_BEAN_NAME // = "org.springframework.context.event.internalEventListenerProcessor" if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) { RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class); def.setSource(source); beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME)); } // 設置用于生產ApplicationListener對象的EventListenerFactory對象 // 定義常量EVENT_LISTENER_FACTORY_BEAN_NAME // = "org.springframework.context.event.internalEventListenerFactory" if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) { RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class); def.setSource(source); beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME)); } return beanDefs; }AnnotationConfigUtils用于注冊BeanDefinition的registerPostProcessor靜態方法的代碼如下。
/** * 注冊RootBeanDefinition對象 **/ private static BeanDefinitionHolder registerPostProcessor( BeanDefinitionRegistry registry, RootBeanDefinition definition, String beanName) { definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); registry.registerBeanDefinition(beanName, definition); return new BeanDefinitionHolder(definition, beanName); }(1)annotation-config用于提供bean生命周期管理、bean的依賴注入以及動態注冊事件監聽器的注解處理器。
(2)annotation-config簡化了我們的xml配置。在xml文件中,我們只需要通過bean標簽定義bean,并不需要設置bean的依賴,也不需要設置bean的init和destroy方法。
新聞熱點
疑難解答