`

spring源码学习系列1.2-spring事务代理深入分析2

阅读更多
提示:
BeanPostProcessor

AopUtils

代理模式

spring中<aop:config/>,<tx:annotation-driver/>,<aop:aspectJ>等配置看似复杂,其实本质就是PointCut,BeanPostProcessor,AbstractAutoProxyCreator一些接口直接的解耦

查找的Advisor用到了模板方法设计模式和委托模式,创建代理类用到了代理模式




解析:
<tx:annotation-driven transaction-manager="transactionManager" /> - TxNamespaceHandler

spring中的该配置实际上就是注册了几个beanDefinition

InfrastructureAdvisorAutoProxyCreator - BeanPostProcess

AnnotationTransactionAttributeSource - 可以延伸为Pointcut

TransactionInterceptor - MethodInterceptor

TransactionAttributeSourceAdvisor - Advisor(其中持有TransactionAttributeSourcePointcut)



在bean实例化后,开始调用BeanPostProcess.postProcessAfterInitialization

1.首先查询所有的advisor

2.根据advisor中的pointcut校验bean是否符合该advisor,并返回methodInterceptor

3.将methodInterceptor通过适配器模式封装到advisors(这里的methodInterceptor是广义的概念,有可能是advice等)

4.将advisors封装到advisedSupport,委托ProxyFactory(AdvisedSupport)生成代理

ProxyFactory委托AopProxyFactory(InvocationHandler)生成代理





<aop:aspectj-autoproxy /> - AopNamespaceHandler

该配置就是定义了一个AnnotationAwareAspectJAutoProxyCreator(BeanPostProcessor)的bean







<aop:config/> - AopNamespaceHandler

spring中的该配置实际上就是注册了几个beanDefinition

AspectJAwareAdvisorAutoProxyCreator -BeanPostProcessor

AspectJExpressionPointcut - Pointcut

DefaultBeanFactoryPointcutAdvisor - Advisor




讨论:
这里注册的几个BeanPostProcessor都继承了AbastractAutoProxyCreator。AbastractAutoProxyCreator采用了模板方法设计模式,在模板方法中定义了生成代理的一系列步骤,由子类实现查找匹配的Advisor的过程


采用AopUtils查找合适的Advisor
public static List<Advisor> findAdvisorsThatCanApply(List<Advisor> candidateAdvisors, Class<?> clazz){
...
}



PointCut接口设计:
public interface Pointcut {

	/**
	 * Return the ClassFilter for this pointcut.
	 * @return the ClassFilter (never {@code null})
	 */
	ClassFilter getClassFilter();

	/**
	 * Return the MethodMatcher for this pointcut.
	 * @return the MethodMatcher (never {@code null})
	 */
	MethodMatcher getMethodMatcher();


	/**
	 * Canonical Pointcut instance that always matches.
	 */
	Pointcut TRUE = TruePointcut.INSTANCE;

}



分享到:
评论

相关推荐

    spring1.2.6源码

    2. **面向切面编程(Aspect-Oriented Programming,AOP)**:Spring提供了基于代理的AOP实现,允许开发者定义横切关注点,如日志、事务管理等。在源码中,`Advisor`和`Advice`接口定义了切面和通知,而`...

    javapms-1.2-beta.zip

    通过源码分析,可以学习Spring如何管理Bean,如何实现依赖注入,以及如何利用AOP进行事务管理。 4. **MyBatis框架** MyBatis是一个轻量级的持久层框架,简化了SQL操作。在Java PMS中,MyBatis可能用于数据库的CRUD...

    毕业设计论文-IT计算机-javapms-1.2-beta-源码.zip

    总结,JavaPMS 1.2 Beta的源码分析涵盖了Java编程语言、设计模式、系统架构、数据库设计、安全性以及测试等多个方面,对IT计算机专业的学生和开发者来说,是深入了解Java后台开发的宝贵资源。通过阅读和学习源码,...

    计算机毕业设计 javapms-1.2-beta 代码论文 范文 模板 资源 JAVA程序源码

    熟悉Spring的核心概念、AOP(面向切面编程)和Spring Boot能帮助深入分析代码。 4. **MyBatis或JPA**:数据访问层可能使用MyBatis或者Java Persistence API(JPA)与数据库交互。理解SQL映射文件或Entity类,以及...

    spring 1.2源代码

    Spring 1.2源代码是Java开发者深入了解Spring框架工作原理的重要资源。这个版本的Spring框架在2004年发布,标志着Spring框架发展的早期阶段,它包含了许多核心特性,为现代企业级Java应用奠定了基础。在这个源代码...

    Swing+Spring-3.1.1+Mybatis-3.1.1+C3p0-0.9.1.2+Sqlite 实现Swing版网络爬虫

    标题中的“Swing+Spring-3.1.1+Mybatis-3.1.1+C3p0-0.9.1.2+Sqlite 实现Swing版网络爬虫”是一个集成开发项目,它利用了一系列Java技术来构建一个基于Swing的网络爬虫应用程序。这个项目的核心组件包括: 1. **...

    spring-ws源码,例子,及reference

    通过运行和分析这些示例,你可以快速上手Spring-WS,了解如何创建服务端点、客户端代理,以及如何处理各种SOAP操作。同时,例子还可能展示如何与其他Spring组件(如Spring Boot、Spring MVC等)集成,实现完整的Web...

    课程设计javapms-1.2-beta源代码下载

    通过对“javapms-1.2-beta”的源代码进行分析和学习,学生可以深入理解Java编程语言、面向对象设计原则以及软件工程的最佳实践。同时,这也是一次绝佳的机会去探索和掌握现代Java开发中的关键技术和工具,为未来的...

    jsp源码OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR)130224

    ### jsp源码OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR)130224 #### 技术栈介绍 本项目是一款基于多种主流Java技术构建的办公自动化系统(OA系统)。该系统采用了JSP作为前端展示层的技术,后端则...

    jsp源码OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR)

    ### jsp源码OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR)知识点解析 #### 一、项目概述 该OA办公自动化管理系统是基于JSP技术栈开发的一个完整项目,主要涵盖了Struts1.2、Hibernate3.0、Spring2...

    JSP源码——OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR).zip

    这是一个基于Java技术栈的OA(Office Automation)办公自动化管理系统...通过学习和分析这个源码,开发者可以深入理解Java Web开发中的MVC模式、ORM机制、依赖注入以及异步通信等关键概念,对于提升专业技能大有裨益。

    OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR).rar

    OA办公自动化管理系统是一款基于Java技术栈的Web应用,利用了Struts1.2、Hibernate3.0、Spring2和DWR等开源框架,为企事业单位提供了一种高效、便捷的在线办公解决方案。这个项目源码适合Java开发人员进行学习、实践...

    Spring Struts Hibernate的源码

    它们的源码深入研究可以帮助开发者理解Web应用的构建原理,提高代码质量,并为自定义扩展或开发新框架提供基础。通过阅读源码,你可以学习到如何设计模块化的系统,如何优雅地处理并发问题,以及如何优化数据库访问...

    spring jar包

    在描述中提到了一个博客链接,虽然具体内容没有给出,但通常博主会分享关于Spring框架的使用、配置、源码分析或问题解决等内容。在实际开发中,理解和使用Spring框架的源码可以帮助开发者更深入地了解其工作原理,...

    dubbo分布式tcc事务demo

    【压缩包子文件的文件名称列表】"tcc-transaction-master-1.2.x"表明这是一个开源项目的源码仓库,版本为1.2.x,包含了整个TCC事务实现的代码结构。我们可以从中学习到如何定义服务、编写TCC的尝试、确认和取消操作...

    Web_Service学习手册(Xfire) 以及书中的源码

    本篇文章将深入探讨Xfire的学习及其源码分析,帮助新手快速入门Web服务的开发。 首先,我们要理解Web服务的基本概念。Web服务通过使用XML(可扩展标记语言)来描述数据,并利用WSDL(Web服务描述语言)来定义服务...

    使用SSH整合开发的MYBOOK项目源码

    通过查看项目的源码,初学者可以深入学习SSH整合的具体实现,包括各层之间的通信方式、异常处理机制、以及如何通过配置文件进行集成等。 在实际学习过程中,建议按照以下步骤逐步探索MYBOOK项目: 1. 理解项目结构...

    java源码java+sql企业固定资产管理系统

    根据提供的文件信息,我们可以归纳出一系列与“java源码java+sql企业固定资产管理系统”相关的知识点。下面将对这些知识点进行详细解析。 ### 一、Java编程语言基础 #### 1.1 Java概述 - **定义**:Java是一种广泛...

    毕业设计论文-IT计算机-OA办公自动化管理系统-源码.zip

    Spring2是企业级应用开发的重要框架,它不仅包含了IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)等核心特性,还提供了大量的扩展支持,如事务管理、数据访问集成等,极...

    axis-src-1_3.zip_axis_axis-src-1_3_axis1 1.3 src_axis源码

    在本文中,我们将深入探讨 Axis 的源码,理解其核心工作原理,并学习如何利用 Axis 来发布 WebServices。本文将主要基于 Axis 1.3 版本的源代码进行分析。 一、Axis 简介 Axis 是 Apache 组织开发的一个 SOAP ...

Global site tag (gtag.js) - Google Analytics