文档章节

spring积累

zuoer
 zuoer
发布于 2013/12/23 09:44
字数 494
阅读 93
收藏 0
点赞 0
评论 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
最近的动态和计划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
Maven搭建SpringMVC+Hibernate项目详解 【转】

。搭建SpringMVC+Hibernate的框架的思路如下: 1、设计数据库:设计好表结构,最好符合3NF,采用Hibernate tools将设计好的表自动生成对应的实体entity。 1、创建Maven项目,按需映入Maven包...

如何让他和
2016/09/30
75
3
阿里Java面试官分享初级Java程序员通过面试的技巧

本来想分享毕业生和初级程序员如何进大公司的经验,但后来一想,人各有志,有程序员或许想进成长型或创业型公司或其它类型的公司,所以就干脆来分享些提升技能和通过面试的技巧,技巧我讲,公...

Java团长17
07/11
0
0
Idea SpringMVC+Spring+MyBatis+Maven调整 【转】

创建项目 File-New Project 选中左侧的Maven,选中右侧上方的Create from archetype,然后选中下方列表中的webapp,然后点击Next 在GroupId和ArtifactId中填入指定内容,点击Next 直接点Nex...

如何让他和
2016/10/04
61
1
Idea SpringMVC+Spring+MyBatis+Maven调整

创建项目 File-New Project 选中左侧的Maven,选中右侧上方的Create from archetype,然后选中下方列表中的webapp,然后点击Next 在GroupId和ArtifactId中填入指定内容,点击Next 直接点Nex...

梵蒂冈考虑过
2016/08/17
38
1
Idea SpringMVC+Spring+MyBatis+Maven调整 【转】

创建项目 File-New Project 选中左侧的Maven,选中右侧上方的Create from archetype,然后选中下方列表中的webapp,然后点击Next 在GroupId和ArtifactId中填入指定内容,点击Next 直接点Nex...

结构好可
2016/10/27
58
1
Idea SpringMVC+Spring+MyBatis+Maven调整 【转】

创建项目 File-New Project 选中左侧的Maven,选中右侧上方的Create from archetype,然后选中下方列表中的webapp,然后点击Next 在GroupId和ArtifactId中填入指定内容,点击Next 直接点Nex...

梵蒂冈考虑过
2016/09/20
14
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spark Streaming + Kafka Integration Guide

The Spark Streaming integration for Kafka 0.10 is similar in design to the 0.8 Direct Stream approach. It provides simple parallelism, 1:1 correspondence between Kafka partition......

刺猬一号
8分钟前
0
0
数据结构与算法2

一个数组的例子,实现查找,显示和删除的功能。 在这个数组中存储的数据类型是long型,使用long型为的是表明这是数据,而int型被用来表示下标。通常数据结构存储的数据项包含有好几个字段,所...

沉迷于编程的小菜菜
19分钟前
0
0
Python3 基于 requests 批量下载图片

Python3 基于 requests 批量下载图片 import requestsheaders = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Encod......

leeyi
19分钟前
0
0
java获取当前时间所在一周的周一和周日日期

/** * 当前时间所在一周的周一和周日时间 * @param time 当前时间 * @return */ public static Map getWeekDate(String time) { Map map = new HashedMap(); SimpleDateFormat sdf = new Si......

小弱鸡
51分钟前
0
0
Redis数据的导出和导入(dump和load方式)

网上有些文章已经不再适用,本人也是踩了些坑,在此记录下。 迁移redis数据一般有如下3种方式: 第三方工具redis-dump,redis-load aof机制,需要开启aof功能 rdb存储机制 这里介绍第一种方式...

iplusx
56分钟前
2
0
ElasticSearch 高亮显示大文档搜索结果

2016年12月,我们开始研究Ambar——一个文档搜索系统。Ambar使用ElasticSearch作为核心搜索引擎。 在Ambar开发的过程中,我们处理了很多与ES相关的问题,我们想分享我们得到的宝贵经验。让我...

九州暮云
今天
1
0
Python 使用 pywifi 模块 破解wifi密码

git https://github.com/awkman/pywifi 常见常量 from pywifi import const# Define interface status.IFACE_DISCONNECTED = 0IFACE_SCANNING = 1IFACE_INACTIVE = 2IFACE_CONNEC......

阿豪boy
今天
2
0
phpstorm使用Iedis

phpstorm的redis插件Iedis是真好用 看了网上挺多的文章,但是由于我系统还是ubuntu,就有点尴尬了,现在破解之后,留个笔记,即使自己之后有需要也可以很快翻阅 先下载资源 资源下载 zip压缩...

贤郎--均灵
今天
0
0
第三章 spring-bean之FactoryBeanRegistrySupport(4)

前言 从FactoryBeanRegistrySupport类的名字可以看出FactoryBeanRegistrySupport负责FactoryBean的注册与支持。如果想知道FactoryBean相关的资料,请阅读spring-bean中关于FactoryBean的解读...

鸟菜啊
今天
0
0
CentOS “Destination Host Unreachable”问题解决办法

挑战极速安装CentOS时遇到局域网主机不能通信的情况: [root@zjd network-scripts]# ping 8.8.8.8PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.64 bytes from 8.8.8.8: icmp_seq=1 ttl=......

wffger
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部