文档章节

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
粉丝 20
博文 26
码字总数 22430
作品 0
嘉定
高级程序员
私信 提问
Spring Scala —— Scala 版的 Spring 框架?

Spring Scala 项目的目的是为了简化在 Scala 应用中使用 Spring 框架。我们相信很多 Spring 用户想尝试 Scala,但并不像放弃他们在 Spring 框架上的积累,这个项目就是为这些人准备的。...

oschina
2012/12/18
5
0
Spring Scala 实践

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

ForEleven
2014/05/06
0
8
Spring Boot,Spring cloud加起来有385个包,学习成本太大了

相比以前的spring,核心包才十来个 虽然入门难 但是慢慢的用下来 还是积累了好多知识。 现在spring出的boot光包就有165个。写第一个hello world确实很快,但是后面的学习成本太高了。想要用好...

湖水没了
2016/11/30
3.8K
10
最近的动态和计划20150411

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

luobin
2015/04/11
0
0
golang实战使用gin+新版微信公众号赛车源码建go语言web框架rest

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

a5126320
2018/08/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何限制用户仅通过HTTPS方式访问OSS?

一、当前存在的问题 当前OSS支持用户使用HTTPS/HTTP协议访问Bucket。但由于HTTP存在安全漏洞。大型企业客户都要求使用HTTPS方式访问OSS,并且拒绝HTTP访问请求。 目前OSS可以通过RAM policy方...

阿里云官方博客
14分钟前
0
0
详解深度学习之经典网络架构——LeNet

一、基本简介 LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition,是一种用于手写体字符识别的非常高效的卷积神经网络。 二、LeNet网络的基本结构 LeNet5 这个网络虽...

AI女神
17分钟前
0
0
日志服务Python消费组实战(二):实时分发数据

场景目标 使用日志服务的Web-tracking、logtail(文件极简)、syslog等收集上来的日志经常存在各种各样的格式,我们需要针对特定的日志(例如topic)进行一定的分发到特定的logstore中处理和...

阿里云云栖社区
17分钟前
1
0
LVM 增加磁盘扩容

sudo parted /dev/sdeparted> mklabel gptparted> mkpart primary lvm ext4 %0 %100parted> printsudo lvmlvm> pvcreate /dev/sde1lvm> vgextend vg-data /dev/sde1lvm> lve......

仪山湖
21分钟前
0
0
Linux挂载本地iso镜像,不联网使用yum命令

上传iso镜像文件到/mnt 目录下 在/mnt目录下创建Server目录 mkdir Server 备份 /etc/yum.repos.d/目录下的repo文件 cd /etc/yum.repos.dmkdir repobakmv *.repo repobak/ 挂载本地iso文件...

AustinYe
22分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部