Spring component-scan 的逻辑 、单例模式下多实例问题、事务失效
原创内容,转发请保留:http://www.cnblogs.com/iceJava/p/6930118.html,非常欢迎指正,谢谢
之前遇到该问题,今天查看了下 spring 4.x 的代码 一,先理解下 context:component-scan 处理过程:
<!-- scan the package and the sub package -->
<!--
【重要】:容易产生事务失效的地方,见:http://jinnianshilongnian.iteye.com/blog/1762632
处理逻辑(入口见:org.springframework.context.config.ContextNamespaceHandler):
1. context:component-scan 表示是否扫描指定路径下的所有 .class 文件;
参见 org.springframework.core.io.support.PathMatchingResourcePatternResolver.getResources 方法 2. use-default-filters,是否使用将 默认的 AnnotationTypeFilter 增加到 include-filter 过滤器,包括:
@Component(包括子注解@Service、@Reposity、@Controller)、@ManagedBean、@Named注解 的Bean
也就是说,如果使用 use-default-filters = true, 就不需要 <context:annotation-config/> 配置了
参见 org.springframework.context.annotation.ComponentScanBeanDefinitionParser.configureScanner 3. 遍历所有的bean, 保留满足 "不是 exclude-filter 黑名单、并且至少满足一条 include-filter 白名单" .class 文件
参见 org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.isCandidateComponent 方法
16 -->
<context:component-scan base-package="com.hm.mobile" use-default-filters="false" >
<context:include-filter type="regex" expression=".*Controller$" />
<context:include-filter type="regex" expression=".*Interceptor$" />
</context:component-scan>
二:单例模式下的多实例问题
1. 包结构:

MessageController、MessageConsumerListener、MessageProviderService 分别 使用了 @Controller @Service @Service
2. application.xml 配置文件片段
<context:component-scan base-package="com.hm.mobile" >
<context:exclude-filter type="regex" expression=".*Controller$" />
<context:exclude-filter type="regex" expression=".*Interceptor$" />
</context:component-scan>
不难理解,在该配置下,Spring 容器 扫描到:MessageConsumerListener、MessageProviderService 并实例化, 其中 MessageController 被黑名单排除
3. dispatcher-servlet.xml 配置文件片段
<context:component-scan base-package="com.hm.mobile">
<context:include-filter type="regex" expression=".*Controller$" />
<context:include-filter type="regex" expression=".*Interceptor$" />
</context:component-scan>
Spring MVC 容器 扫描到了 MessageConsumerListener、MessageProviderService、MessageController 并实例化
4. 通过 vituralVM,我们得到了证实:

5. 在 application-servlet.xml 增加 use-default-filters="false" 之后

三:事务失效问题
a. 一般情况下,我们都是在 Spring 配置中事务,因此只有 spring 容器中的 service 对象 被 AOP 注入事务;换句话说, Spring MVC 容器中的service对象 是没有进行 AOP 事务注入的
b. 因为 Spring mvc 中注入的 service 对象是 自身容器中的 对象,而不是 Spring 容器的
备注:第三点,是本人自己的猜想,没来得及去验证。
Spring component-scan 的逻辑 、单例模式下多实例问题、事务失效的更多相关文章
- c++设计模式之单例模式下的实例自动销毁(垃圾自动回收器)
关于C++单例模式下m_pinstance指向空间销毁问题,m_pInstance的手动销毁经常是一个头痛的问题,内存和资源泄露也是屡见不鲜,能否有一个方法,让实例自动释放. 解决方法就是定义一个内部 ...
- [Spring Boot] Use Component Scan to scan for Bean
Component Scan is important concept when we want to create Bean. Currently we know what, for the cla ...
- Spring Cloud实战 | 最终篇:Spring Cloud Gateway+Spring Security OAuth2集成统一认证授权平台下实现注销使JWT失效方案
一. 前言 在上一篇文章介绍 youlai-mall 项目中,通过整合Spring Cloud Gateway.Spring Security OAuth2.JWT等技术实现了微服务下统一认证授权平台 ...
- 设计模式-单例模式下对多例的思考(案例:Server服务器)
前述: 在学习单例模式后,对老师课上布置的课后作业,自然要使用单例模式,但是不是一般的单例,要求引起我的兴趣,案例是用服务器. 老师布置的要求是:服务器只有一个,但是使用这个服务器时候可以有多个对象( ...
- not registered via @EnableConfigurationProperties or marked as Spring component
利用@ConfigurationProperties(prefix = "")来绑定属性时报错: not registered via @EnableConfigurationPr ...
- java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现
注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...
- Spring事务Transactional和动态代理(三)-事务失效的场景
系列文章索引: Spring事务Transactional和动态代理(一)-JDK代理实现 Spring事务Transactional和动态代理(二)-cglib动态代理 Spring事务Transa ...
- 就这?Spring 事务失效场景及解决方案
小明:靓仔,我最近遇到了很邪门的事. 靓仔:哦?说来听听. 小明:上次看了你的文章<就这?一篇文章让你读懂 Spring 事务>,对事务有了详细的了解,但是在项目中还是遇到了问题,明明加了 ...
- Javascript单例模式概念与实例
前言 和其他编程语言一样,Javascript同样拥有着很多种设计模式,比如单例模式.代理模式.观察者模式等,熟练运用Javascript的设计模式可以使我们的代码逻辑更加清晰,并且更加易于维护和重构 ...
随机推荐
- java集合基础
集合概念与作用 1现实生活中把很多事物凑在一起就是集合.java中的集合类:是一种工具,就像是容器,存储任意数量的有共同属性的对象. 2在类的内部,对数据进行组织: 简单而快速的搜索大数量的条目 有的 ...
- Druid Indexing 服务
索引服务由三个主要组件:一个是peon 组件,可以运行一个任务,一个是Middle Managers组件,管理peons,和一个overlord 组件管理任务分发给Middle Managers. o ...
- 初识ElasticSearch
概述 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库. 分布式的 ...
- Elasticserach学习笔记-01基础概念
本文系本人根据官方文档的翻译,能力有限.水平一般,如果对想学习Elasticsearch的朋友有帮助,将是本人的莫大荣幸. 原文出处:https://www.elastic.co/guide/en/e ...
- python自动化开发-[第一天]-基础数据类型与编码
1.Python与其他语言对比 - C语言的解释方式 代码-->机器码-->计算机 - python,java,php等高级语言的解释方式 代码-->字节码-->机器码-- ...
- 使用Express开发个人网站(一)
Express,基于Node.js平台,快速.开放.极简的 web 开发框架. Node的出现,让js有了运行在服务器端的可能,基于此的Express,可以快速,简单的搭建起一个服务器与个人网站. 安 ...
- 【lucene系列学习】排序
用lucene3实现搜索多字段并排序功能(设置权重)
- ThinkPHP框架的增删改
使用TP框架主要是比较简单一些,之前我们写增删改,代码量相对来说还是比较多的,这里利用tp框架写起来是非常简单的,大大的减少了代码量 这里我是以数据库的nation表为例的,nation表 ...
- 案例分享|某医药集团的BI建设案例
相比于传统型BI,越来越多的企业开始接受并青睐新型的自助式BI,因其项目上线快,失败风险小,简单易用,颇受赞誉.以下是某医药集团上线帆软BI系统FineBI的案例,从用途架构.指标分析.和信息交互几方 ...
- coding.net及git的使用方式
一般部分测试的公司里可能会用到代码管理工具,这里可能不得不推荐coding.net和git这个工具,类似于svn,不过用命令行的情况多点 这里简单介绍下 1.建立coding.net 首先新建一个co ...