国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Spring4.3.x 淺析xml配置的解析過程(7)——解析context命名空間之annotation-config標簽

2019-11-10 17:34:15
字體:
來源:轉載
供稿:網友

概述


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標簽


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方法。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 秭归县| 中阳县| 自贡市| 上蔡县| 汝阳县| 丰县| 吴旗县| 新沂市| 鄱阳县| 许昌市| 抚州市| 岳普湖县| 娄烦县| 望谟县| 宜春市| 罗城| 米易县| 长治市| 奎屯市| 岳西县| 丰顺县| 平利县| 凌源市| 宝兴县| 礼泉县| 长白| 商丘市| 铜鼓县| 社会| 内丘县| 玉田县| 阿克| 鹰潭市| 香港| 夏津县| 汽车| 浪卡子县| 汤原县| 孝义市| 察雅县| 太白县|