spring積累

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註解)的對象生成代理。

相關文章
相關標籤/搜索