注册注解BeanDefinition
生活随笔
收集整理的這篇文章主要介紹了
注册注解BeanDefinition
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
AnnotationConfigWebApplicationContext 是AnnotationConfigApplicationContext 的Web 版,它們對(duì)于注解Bean 的注冊(cè)和掃描是基本相同的,但是AnnotationConfigWebApplicationContext對(duì)注解Bean 定義的載入稍有不同,AnnotationConfigWebApplicationContext 注入注解Bean 定義源碼如下:
//載入注解Bean定義資源 @Override protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) {//為容器設(shè)置注解Bean定義讀取器AnnotatedBeanDefinitionReader reader = getAnnotatedBeanDefinitionReader(beanFactory);//為容器設(shè)置類路徑Bean定義掃描器ClassPathBeanDefinitionScanner scanner = getClassPathBeanDefinitionScanner(beanFactory);//獲取容器的Bean名稱生成器BeanNameGenerator beanNameGenerator = getBeanNameGenerator();//為注解Bean定義讀取器和類路徑掃描器設(shè)置Bean名稱生成器if (beanNameGenerator != null) {reader.setBeanNameGenerator(beanNameGenerator);scanner.setBeanNameGenerator(beanNameGenerator);beanFactory.registerSingleton(AnnotationConfigUtils.CONFIGURATION_BEAN_NAME_GENERATOR, beanNameGenerator);}//獲取容器的作用域元信息解析器ScopeMetadataResolver scopeMetadataResolver = getScopeMetadataResolver();//為注解Bean定義讀取器和類路徑掃描器設(shè)置作用域元信息解析器if (scopeMetadataResolver != null) {reader.setScopeMetadataResolver(scopeMetadataResolver);scanner.setScopeMetadataResolver(scopeMetadataResolver);}if (!this.annotatedClasses.isEmpty()) {if (logger.isInfoEnabled()) {logger.info("Registering annotated classes: [" +StringUtils.collectionToCommaDelimitedString(this.annotatedClasses) + "]");}reader.register(this.annotatedClasses.toArray(new Class<?>[this.annotatedClasses.size()]));}if (!this.basePackages.isEmpty()) {if (logger.isInfoEnabled()) {logger.info("Scanning base packages: [" +StringUtils.collectionToCommaDelimitedString(this.basePackages) + "]");}scanner.scan(this.basePackages.toArray(new String[this.basePackages.size()]));}//獲取容器定義的Bean定義資源路徑String[] configLocations = getConfigLocations();//如果定位的Bean定義資源路徑不為空if (configLocations != null) {for (String configLocation : configLocations) {try {//使用當(dāng)前容器的類加載器加載定位路徑的字節(jié)碼類文件Class<?> clazz = ClassUtils.forName(configLocation, getClassLoader());if (logger.isInfoEnabled()) {logger.info("Successfully resolved class for [" + configLocation + "]");}reader.register(clazz);}catch (ClassNotFoundException ex) {if (logger.isDebugEnabled()) {logger.debug("Could not load class for config location [" + configLocation +"] - trying package scan. " + ex);}//如果容器類加載器加載定義路徑的Bean定義資源失敗//則啟用容器類路徑掃描器掃描給定路徑包及其子包中的類int count = scanner.scan(configLocation);if (logger.isInfoEnabled()) {if (count == 0) {logger.info("No annotated classes found for specified class/package [" + configLocation + "]");}else {logger.info("Found " + count + " annotated classes in package [" + configLocation + "]");}}}}} }以上就是解析和注入注解配置資源的全過(guò)程分析。
?
?
總結(jié)
以上是生活随笔為你收集整理的注册注解BeanDefinition的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ClassPathScanningCan
- 下一篇: IOC 容器初始化小结