亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品精品国产| 精品久久久久久久久久久久久久| www高清在线视频日韩欧美| 色综合视频网站| 国产精品日韩电影| 欧美激情视频在线| 国产精品入口尤物| 亚洲欧美日韩天堂| 91chinesevideo永久地址| 欧洲中文字幕国产精品| 伊人久久大香线蕉av一区二区| zzjj国产精品一区二区| 中文字幕精品在线| 最近2019好看的中文字幕免费| 久久久精品一区二区三区| 日韩美女免费观看| 97在线精品视频| 黄色成人av网| 欧美丰满片xxx777| 日韩国产高清污视频在线观看| 久久久国产精品x99av| 亚洲一区二区三区四区视频| 91精品国产综合久久香蕉922| 亚洲免费电影一区| 国产精品视频精品视频| 国产精品久久久久久久久久尿| 一区二区中文字幕| 国产精品福利在线观看| 国产成人精品日本亚洲| 97精品在线视频| 色伦专区97中文字幕| 久久色在线播放| 日韩av电影在线免费播放| 麻豆国产精品va在线观看不卡| 欧美大片欧美激情性色a∨久久| 亚洲第一网站男人都懂| 91视频国产一区| 日韩免费在线观看视频| 成人欧美一区二区三区在线湿哒哒| 久久天天躁狠狠躁夜夜躁2014| 88国产精品欧美一区二区三区| 欧美xxxx做受欧美.88| 国产精品一区二区女厕厕| 色婷婷av一区二区三区在线观看| 欧美日韩成人在线观看| 欧美日韩激情视频8区| 久久伊人91精品综合网站| 国产成人精品久久二区二区91| 狠狠综合久久av一区二区小说| 久久久久久久电影一区| 伊人久久久久久久久久久久久| 成人黄色免费网站在线观看| 国产日本欧美视频| 日本精品久久久久久久| 91在线|亚洲| 亚洲欧美日韩区| 日韩中文字幕在线精品| 日韩欧美精品在线观看| 日韩欧美在线观看视频| 精品国产网站地址| 亚洲欧美在线播放| 亚洲精品中文字幕有码专区| 中文字幕亚洲欧美一区二区三区| 日韩va亚洲va欧洲va国产| 亚洲欧美激情在线视频| 国产第一区电影| 国产欧美一区二区三区在线| 成人黄色av播放免费| 成人做爽爽免费视频| 国产成人aa精品一区在线播放| 国产视频在线一区二区| 欧美夫妻性生活xx| 久久影视电视剧免费网站清宫辞电视| 91精品国产综合久久久久久蜜臀| 亚洲sss综合天堂久久| 亚洲综合中文字幕在线| 久久精品99无色码中文字幕| 97不卡在线视频| 亚洲综合在线中文字幕| 成人精品一区二区三区电影黑人| 欧美黑人国产人伦爽爽爽| 国产精品稀缺呦系列在线| 久久香蕉国产线看观看av| 日韩a**站在线观看| 清纯唯美亚洲综合| 欧美日韩国产一区在线| 在线日韩中文字幕| 中文字幕在线看视频国产欧美| 久久久精品视频在线观看| 欧美日韩不卡合集视频| 97色在线观看免费视频| 一区二区三区国产视频| 欧美野外wwwxxx| 欧美日韩国产成人| 欧美一二三视频| 欧美视频在线免费看| 欧美视频不卡中文| 欧美黄色成人网| 美日韩精品免费视频| 最新的欧美黄色| 亚洲成人亚洲激情| 乱亲女秽乱长久久久| 青青a在线精品免费观看| 久久成人在线视频| 日韩视频―中文字幕| 欧美激情中文字幕在线| 91精品国产99久久久久久| 欧美日韩加勒比精品一区| 欧美在线视频观看| 亚洲国产精品va在看黑人| 亚洲精品一区二区在线| 亚洲国产精品成人一区二区| 欧美精品电影免费在线观看| 久久99久久亚洲国产| 国产精品国产三级国产专播精品人| 成人av电影天堂| 69av成年福利视频| 国产美女精品免费电影| 成人网中文字幕| 亚洲www在线观看| 国产91对白在线播放| 欧美巨猛xxxx猛交黑人97人| 精品亚洲一区二区三区在线播放| 91亚洲一区精品| 欧美午夜精品久久久久久人妖| 97**国产露脸精品国产| 国产在线精品成人一区二区三区| 性欧美办公室18xxxxhd| 亚洲缚视频在线观看| 欧美猛交ⅹxxx乱大交视频| 亚洲国语精品自产拍在线观看| 亚洲高清免费观看高清完整版| 69av视频在线播放| 久久久精品视频成人| 91爱爱小视频k| 亚洲男人天堂视频| 伊人亚洲福利一区二区三区| 日韩欧美aⅴ综合网站发布| 国产精品三级在线| 日韩欧美一区视频| 97人人做人人爱| 2019日本中文字幕| 国产91精品视频在线观看| 亚洲精品美女在线| 精品久久久精品| 国产亚洲a∨片在线观看| 精品国内自产拍在线观看| 国产精品视频自拍| 色中色综合影院手机版在线观看| 国产z一区二区三区| 91精品视频一区| 国产精品日韩在线| 欧美激情一区二区久久久| 日韩视频在线免费| 26uuu另类亚洲欧美日本老年| 国产美女精彩久久| 欧美精品在线极品| 久久精品国产99国产精品澳门| 精品国产一区二区三区久久久| 日本亚洲欧美三级| 日本一区二区三区四区视频| 一区二区在线免费视频| 久久久久久久久久久av| 91视频-88av|