文档章节

spring积累

zuoer
 zuoer
发布于 2013/12/23 09:44
字数 494
阅读 95
收藏 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
嘉定
高级程序员
私信 提问
golang实战使用gin+新版微信公众号赛车源码建go语言web框架rest

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

a5126320
08/11
0
0
Spring Scala 实践

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

ForEleven
2014/05/06
0
8
最近的动态和计划20150411

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

luobin
2015/04/11
0
0
公司为什么需要建立一套统一的开发框架?

近十年,中国互联网发展的速度越来越快,互联网科技颠覆了越来越多的传统行业,我们的衣食住行随着互联网科技的进步,发生了翻天覆地的变化。在这个大潮中,越来越多新兴的公司如雨后春笋般的...

Java高级技术
10/26
0
0
项目中的积累,及常见小问题

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

吹比龙
2016/05/11
159
0

没有更多内容

加载失败,请刷新页面

加载更多

小白带你认识netty(三)之NioEventLoop的线程(或者reactor线程)启动(一)

在第一章中,我们看关于NioEventLoopGroup的初始化,我们知道了NioEventLoopGroup对象中有一组EventLoop数组,并且数组中的每个EventLoop对象都对应一个线程FastThreadLocalThread,那么这个...

天空小小
今天
3
0
PHP动态扩展Redis模块

查看已有模块 [root@test-a ~]# /usr/local/php/bin/php -m[PHP Modules]bz2Core...zlib[Zend Modules] 下载包,解压,生成configure文件 [root@test-a ~]# cd /usr/local/src/[ro......

野雪球
今天
3
0
在Ignite中使用线性回归算法

在本系列前面的文章中,简单介绍了一下Ignite的机器学习网格,下面会趁热打铁,结合一些示例,深入介绍Ignite支持的一些机器学习算法。 如果要找合适的数据集,会发现可用的有很多,但是对于...

李玉珏
今天
5
0
Mybatis应用学习——简单使用示例

1. 传统JDBC程序中存在的问题 1. 一个简单的JDBC程序示例: public class JDBCDemo {public static void main(String[] args) {Connection con=null;PreparedStatement statemen...

江左煤郎
今天
4
0
使用JavaScript编写iOS应用业务逻辑

JSAUIKitCocoa使你可以使用JavaScript编写对性能要求不高但可能变动性很大的iOS应用的业务逻辑部分,View组件、需要多线程支持的Model等则直接使用原生对象。 编写方式与React Native相似,但...

neal01
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部