文档章节

spring积累

zuoer
 zuoer
发布于 2013/12/23 09:44
字数 494
阅读 94
收藏 0

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


© 著作权归作者所有

共有 人打赏支持
zuoer
粉丝 21
博文 26
码字总数 22430
作品 0
嘉定
高级程序员
Spring Scala 实践

项目代码 http://git.oschina.net/for-1988/Simples Spring Scala 实践 Spring Scala 项目是Spring团队提供的,为了简化在 Scala 应用中使用 Spring 框架。我们相信很多 Spring 用户想尝试 ...

ForEleven
2014/05/06
0
8
golang实战使用gin+新版微信公众号赛车源码建go语言web框架rest

联系方式:QQ:2747044651 网址 2017年我们联系方式:QQ:2747044651 网址公司需要快速迭代一款联系方式:QQ:2747044651 网址产品,当联系方式:QQ:2747044651 网址时,我们团队的后端框架是...

a5126320
08/11
0
0
最近的动态和计划20150411

0,自从接触了github后,我对语言、技术就看得很开了,不再拘泥于自己的技术能力,把发现、学习、积累优秀项目作为核心能力之一;1、想学习下设计模式,重拾马士兵老师的课程,寻找设计的乐趣...

luobin
2015/04/11
0
0
Maven搭建SpringMVC+Hibernate项目详解 【转】

今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这篇主要搭建SpringMVC4.1.4和Hiber...

梵蒂冈考虑过
2016/10/19
37
1
项目中的积累,及常见小问题

1、浏览器清空缓存的时候如果选择清空cookie,其实就是清空session(google浏览器,ie11没有这个问题) 2、本地环境最好用ip地址127.0.0.1而非localhost,重定向要加request.getcontentpath(...

吹比龙
2016/05/11
159
0

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之高级类型的可辨识联合(Discriminated Unions)

转发 TypeScript基础入门之高级类型的可辨识联合(Discriminated Unions) 高级类型 可辨识联合(Discriminated Unions) 你可以合并单例类型,联合类型,类型保护和类型别名来创建一个叫做 ...

durban
11分钟前
1
0
画图工具

目标是不要让我自己摆放,那样会打断我的思路。要自己会摆放,我写字就好。 纠结对齐的我在也不会因为一个像素的问题小心翼翼的移动鼠标了。因为它对不齐你也管不了。 Graphviz https://www...

郭大鹏
12分钟前
1
0
在Visual Studio中使用GitHub(使用篇)

上一篇中已经介绍了如何在windows下安装和配置Git,并且详细说明了如何和GitHub连接。 这里就详细的说明下如何在Visual Studio中使用GitHub。这里也是一个简单的Git教程。 注:非常非常简单的...

Jokeny
12分钟前
1
0
tomcat 在liunx系统中shutdown后进程仍然存在解决办法

这个在windows下没有碰到过,因为此前跑Tomcat都是以服务而不是命令脚本的形式跑的,而且已经换了一个项目,所以暂时不考察windows下是否存在该问题。 难道是Tomcat版本问题?或者用带内存泄...

乱舞
13分钟前
1
0
区块链10年了,还未落地,它失败了吗?

几乎每个人,甚至是对通证持怀疑态度的人,都对区块链的技术有积极的看法,因为它有可能改变世界。然而,区块链技术问世已经10年了,我们仍然没有真正的用上区块链技术。 有人说,比特币是建...

linux-tao
18分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部