spring积累
博客专区 > zuoer 的博客 > 博客详情
spring积累
zuoer 发表于4年前
spring积累
  • 发表于 4年前
  • 阅读 85
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 平时关于spring框架一些理解 点点滴滴都记录在这里 便于以后查阅

1)    spring中的<context:annotation-config /> 起什么作用 ?

       这个节点对应的方法为AnnotationConfigBeanDefinitionParser的parse方法  相应的会为spring添加一个BeanFactoryPostProcessor和几个BeanPostProcessor:

   BeanFactoryPostProcessor为ConfigurationClassPostProcessor

  BeanPostProcessor为AutowiredAnnotationBeanPostProcessor、 RequiredAnnotationBeanPostProcessor

  CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor(如果存在该类的话)

  这几个组件分别在spring容器启动的时候和Bean对象实例化的过程中扮演着重要的作用

   如果没有配这个节点而是配置了<context:component-scan base-package="com.xx.**.manager"/> 这个scan可以自

   动扫描该指定包下class上面打service或者component注解的类  同时  再把这些bean以ScannedGenericBeanDefinition    的形式放入BeanFactory中,然后 底下会判断上面这些相应的FactoryPostProcessor和BeanPostProcessor有没有放入

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


共有 人打赏支持
粉丝 22
博文 26
码字总数 22430
×
zuoer
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: