1) spring中的<context:annotation-config /> 起什麼做用 ?java
這個節點對應的方法爲AnnotationConfigBeanDefinitionParser的parse方法 相應的會爲spring添加一個BeanFactoryPostProcessor和幾個BeanPostProcessor:spring
BeanFactoryPostProcessor爲ConfigurationClassPostProcessorpost
BeanPostProcessor爲AutowiredAnnotationBeanPostProcessor、 RequiredAnnotationBeanPostProcessorui
CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor(若是存在該類的話)spa
這幾個組件分別在spring容器啓動的時候和Bean對象實例化的過程當中扮演着重要的做用代理
若是沒有配這個節點而是配置了<context:component-scan base-package="com.xx.**.manager"/> 這個scan能夠自code
動掃描該指定包下class上面打service或者component註解的類 同時 再把這些bean以ScannedGenericBeanDefinition 的形式放入BeanFactory中,而後 底下會判斷上面這些相應的FactoryPostProcessor和BeanPostProcessor有沒有放入component
BeanFactory中:對象
boolean annotationConfig = true; if (element.hasAttribute(ANNOTATION_CONFIG_ATTRIBUTE)) { annotationConfig = Boolean.valueOf(element.getAttribute(ANNOTATION_CONFIG_ATTRIBUTE)); } if (annotationConfig) { Set<BeanDefinitionHolder> processorDefinitions = AnnotationConfigUtils.registerAnnotationConfigProcessors(readerContext.getRegistry(), source); for (BeanDefinitionHolder processorDefinition : processorDefinitions) { compositeDef.addNestedComponent(new BeanComponentDefinition(processorDefinition)); } }
2) 關於<tx:annotation-driven/>和<aop:aspectj-autoproxy /> 前者會加載InfrastructureAdvisorAutoProxyCreator,後者會加載AnnotationAwareAspectJAutoProxyCreator 這兩個均是BeanPostProcessor 而且均實現了 SmartInstantiationAwareBeanPostProcessor接口。名字是org.springframework.aop.config.internalAutoProxyCreator,倘若spring文件中配置了這兩個節點 後面的會覆蓋前面的。接口
3) <tx:annotation-driven/> 這個背後還作了什麼?
if (!parserContext.getRegistry().containsBeanDefinition(TRANSACTION_ADVISOR_BEAN_NAME)) { Object eleSource = parserContext.extractSource(element); // Create the TransactionAttributeSource definition. RootBeanDefinition sourceDef = new RootBeanDefinition(AnnotationTransactionAttributeSource.class); sourceDef.setSource(eleSource); sourceDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); String sourceName = parserContext.getReaderContext().registerWithGeneratedName(sourceDef); // Create the TransactionInterceptor definition. RootBeanDefinition interceptorDef = new RootBeanDefinition(TransactionInterceptor.class); interceptorDef.setSource(eleSource); interceptorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); registerTransactionManager(element, interceptorDef); interceptorDef.getPropertyValues().add("transactionAttributeSource", new RuntimeBeanReference(sourceName)); String interceptorName = parserContext.getReaderContext().registerWithGeneratedName(interceptorDef); // Create the TransactionAttributeSourceAdvisor definition. RootBeanDefinition advisorDef = new RootBeanDefinition(BeanFactoryTransactionAttributeSourceAdvisor.class); advisorDef.setSource(eleSource); advisorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); advisorDef.getPropertyValues().add("transactionAttributeSource", new RuntimeBeanReference(sourceName)); advisorDef.getPropertyValues().add("adviceBeanName", interceptorName); if (element.hasAttribute("order")) { advisorDef.getPropertyValues().add("order", element.getAttribute("order")); } parserContext.getRegistry().registerBeanDefinition(TRANSACTION_ADVISOR_BEAN_NAME, advisorDef); CompositeComponentDefinition compositeDef = new CompositeComponentDefinition(element.getTagName(), eleSource); compositeDef.addNestedComponent(new BeanComponentDefinition(sourceDef, sourceName)); compositeDef.addNestedComponent(new BeanComponentDefinition(interceptorDef, interceptorName)); compositeDef.addNestedComponent(new BeanComponentDefinition(advisorDef, TRANSACTION_ADVISOR_BEAN_NAME)); parserContext.registerComponent(compositeDef); }
構造了一個TransactionInterceptor 並把transactionAttributeSource和transactionManager塞給了他
構造了一個BeanFactoryTransactionAttributeSourceAdvisor 而且把transactionAttributeSource和上面的這個interceptor的名字塞給了他 爲在BeanPostProcessor(InfrastructureAdvisorAutoProxyCreator或者是AnnotationAwareAspectJAutoProxyCreator)的postProcessAfterInitialization方法 對知足條件的bean(類或者方法上打Transactional註解)的對象生成代理。