`

spring源码学习系列4-3种常用的自动代理创建器

阅读更多
3种自动代理器是
AnnotationAwareAspectJAutoProxyCreator-<aop:aspectj-autoproxy />

AbstractAdvisorAutoProxyCreator-<aop:config>

InfrastructureAdvisorAutoProxyCreator-<tx:annotation-driven/>

他们在Spring中注册的beanName都是
public static final String AUTO_PROXY_CREATOR_BEAN_NAME =
			"org.springframework.aop.config.internalAutoProxyCreator"

它们的优先级从上到下,即3者都配置了,默认注册AnnotationAwareAspectJAutoProxyCreator。那<tx:annotation-driven/>如何解析呢




<aop:aspectj-autoproxy /> - AopNamespaceHandler

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

InstantiationModelAwarePointcutAdvisor
AspectJExpressionPointcut
AspectJMethodBeforeAdvice,AspectJAfterAdvice,AspectJAfterReturningAdvice,AspectJAfterThrowingAdvice,AspectJAroundAdvice



该<aop>配置,不会定义Advisor,定义Advisor是在后置处理器(AnnotationAwareAspectJAutoProxyCreator)生成代理时动态创建的

AnnotationAwareAspectJAutoProxyCreator#findCandidateAdvisors
@Override
	protected List<Advisor> findCandidateAdvisors() {
		// Add all the Spring advisors found according to superclass rules.
		List<Advisor> advisors = super.findCandidateAdvisors();
		// Build Advisors for all AspectJ aspects in the bean factory.
		advisors.addAll(this.aspectJAdvisorsBuilder.buildAspectJAdvisors());
		return advisors;
	}


this.aspectJAdvisorsBuilder.buildAspectJAdvisors()生成InstantiationModelAwarePointcutAdvisor,表示注解或Apect类型的切面。

相关切面元素:
AspectJExpressionPointcut
(ReflectiveAspectJAdvisorFactory#getPointcut)

AspectJMethodBeforeAdvice,AspectJAfterAdvice,AspectJAfterReturningAdvice,AspectJAfterThrowingAdvice,AspectJAroundAdvice
(ReflectiveAspectJAdvisorFactory#getAdvice)


this.aspectJAdvisorsBuilder.buildAspectJAdvisors()具体如何设计实现注解的切面这里不做扩展,感兴趣的可以通过代码查看










<aop:config/> - AopNamespaceHandler

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

AspectJAwareAdvisorAutoProxyCreator -BeanPostProcessor

AspectJExpressionPointcut - Pointcut

DefaultBeanFactoryPointcutAdvisor - Advisor



至于怎么实现解析注册的,感兴趣的可查看源码
ConfigBeanDefinitionParser#parse
public BeanDefinition parse(Element element, ParserContext parserContext) {
		CompositeComponentDefinition compositeDef =
				new CompositeComponentDefinition(element.getTagName(), parserContext.extractSource(element));
		parserContext.pushContainingComponent(compositeDef);

		configureAutoProxyCreator(parserContext, element);

		List<Element> childElts = DomUtils.getChildElements(element);
		for (Element elt: childElts) {
			String localName = parserContext.getDelegate().getLocalName(elt);
			if (POINTCUT.equals(localName)) {
				parsePointcut(elt, parserContext);
			}
			else if (ADVISOR.equals(localName)) {
				parseAdvisor(elt, parserContext);
			}
			else if (ASPECT.equals(localName)) {
				parseAspect(elt, parserContext);
			}
		}

		parserContext.popAndRegisterContainingComponent();
		return null;
	}











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

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

InfrastructureAdvisorAutoProxyCreator

TransactionAttributeSourcePointcut Pointcut

TransactionInterceptor - MethodInterceptor(advice)

TransactionAttributeSourceAdvisor - Advisor(持有advice,pointcut)


TransactionInterceptor主要是处理事务的增强,这里不对其扩展
TransactionInterceptor#invoke
public Object invoke(final MethodInvocation invocation) throws Throwable {
		// Work out the target class: may be {@code null}.
		// The TransactionAttributeSource should be passed the target class
		// as well as the method, which may be from an interface.
		Class<?> targetClass = (invocation.getThis() != null ? AopUtils.getTargetClass(invocation.getThis()) : null);

		// Adapt to TransactionAspectSupport's invokeWithinTransaction...
		return invokeWithinTransaction(invocation.getMethod(), targetClass, new InvocationCallback() {
			public Object proceedWithInvocation() throws Throwable {
				return invocation.proceed();
			}
		});
	}






参考:<spring源码学习系列1.2-spring事务代理深入分析2>
http://newjava-sina-cn.iteye.com/blog/2422939
分享到:
评论

相关推荐

    spring-beans源码

    通过对`spring-beans`源码的深入学习,我们可以更好地理解Spring的工作机制,从而更高效地利用这一强大框架。这有助于我们编写出更加灵活、可维护的代码,提升项目的整体质量。在实际开发中,理解并掌握这些知识点将...

    spring 源码

    Spring框架是Java开发中最广泛应用的轻量级...通过对Spring源码的学习,开发者可以更加熟练地运用Spring框架,设计出更加高效、可维护的系统。同时,这也为自定义扩展或优化Spring提供了可能,以满足特定项目的需求。

    Spring源码

    通过深入学习Spring源码,我们可以了解到设计模式的运用,例如工厂模式、代理模式、装饰者模式等,以及如何利用反射、动态代理等Java核心技术实现IoC和AOP。此外,源码中还包括了对Spring Boot、Spring MVC等模块的...

    spring源码解析

    通过"spring源码解析"的学习,开发者可以更好地理解和利用Spring框架,提升开发效率,同时也能为后续的框架设计与优化提供理论基础。这份资料将涵盖上述众多主题,旨在通过源码层面的解析,使读者对Spring有更深层次...

    java毕业设计&课设-spring源码深度解析+注解开发全套视频教程(视频+源码).doc

    ### Java毕业设计&课设——Spring源码深度解析+注解开发全套视频教程知识点概览 #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一款开源轻量级Java EE应用框架,旨在简化企业级应用的开发过程。Spring...

    spring学习笔记,包括源码学习

    这个"spring学习笔记,包括源码学习"的资料很可能包含了一系列关于Spring框架的核心概念、配置、使用方法以及深入源码的解析。 首先,让我们来了解一下Spring框架的基础知识。Spring的核心特性是依赖注入,它允许...

    spring-framework-4.2.3.RELEASE 源码

    《Spring Framework 4.2.3.RELEASE 源码深度解析》 Spring Framework作为Java领域最广泛应用的轻量级框架之一,其4.2.3.RELEASE版本...通过源码学习,我们不仅能掌握Spring的使用,更能提升自己的编程思维和设计能力。

    Spring源码+配套gradle研究Spring源码可直接使用

    要研究Spring源码,你需要对Java语言、设计模式、反射和动态代理有深入理解。Gradle的使用则需要了解其基本语法和插件系统。在阅读源码的过程中,可以从核心接口和实现类入手,例如ApplicationContext接口及其实现,...

    【狂神说】spring 总结源码 下载

    在这个“狂神说”系列的Spring源码总结中,我们可以深入理解Spring的核心概念和实现机制。 1. **依赖注入(DI)与控制反转(IoC)**:Spring的核心特性是依赖注入,它通过反转应用程序对对象的控制权,使得对象的创建和...

    spring5源码分析笔记

    Spring框架是Java开发中最常用的轻量级开源框架之一,它为构建企业级应用程序提供了全面的编程和配置模型。Spring5源码分析笔记旨在深入理解Spring的工作原理,帮助开发者提升技能,优化代码,以及更好地利用其核心...

    spring-boot-seckill-master.zip

    1. **Spring Boot**:了解Spring Boot的启动机制、自动配置原理,以及如何创建和配置自定义的 Starter。 2. **分布式系统设计**:学习如何设计分布式锁,防止秒杀过程中的重复下单问题,以及如何通过消息队列实现...

    二、Spring源码分析——BeanFactory

    《Spring源码分析——BeanFactory》 在Java的IoC(Inversion of Control)和DI(Dependency Injection)领域,Spring框架扮演着至关重要的角色。BeanFactory是Spring的核心组件之一,它是容器的基石,负责管理应用...

    mybatis-spring最新整合包

    4. **Transaction Management**:MyBatis-Spring与Spring的事务管理器配合,可以实现声明式事务管理。只需在Spring配置中定义一个PlatformTransactionManager,MyBatis-Spring就会自动将事务管理应用到所有数据库...

    spring源码关键地方

    标题中的“spring源码关键地方”指的是一项关于Spring框架核心源码的深入解析。Spring是Java企业级应用开发中最常用的框架之一,它的源码分析对于开发者来说具有极高的学习价值,可以帮助理解其工作原理,提升开发...

    Spring源码工程,可以断点调试,外加一个AOP的小例子(不带JAR包)

    Spring框架是Java开发中最常用的轻量级框架之一,它提供了依赖注入、面向切面编程(AOP)、数据访问、Web支持等多种功能。本资源提供了一个Spring的源码工程,允许开发者进行断点调试,这对于理解Spring的工作原理和...

    spring4最新源代码

    Spring MVC作为Spring的Web组件,提供了模型-视图-控制器架构,允许开发者创建高性能的Web应用。Spring4支持了JSR356(Java API for WebSocket),使得实时通信成为可能,为开发富交互的Web应用提供了基础。 另外,...

    spring源码分析免费资源

    通过对Spring源码的分析,我们可以学习到设计模式的应用,例如工厂模式、单例模式、代理模式等;了解依赖注入的实现原理;掌握AOP的底层机制;并能洞察Spring如何优雅地处理并发和异常。这些知识对于提升我们的编程...

    Spring源码文档和方法调用流程图

    通过深入学习Spring源码,开发者可以更好地理解其工作原理,提升问题排查和性能优化能力。在阅读源码时,建议结合方法调用流程图,以便于追踪代码执行路径,理解各组件间的协作。同时,实践是检验理论的最好方式,...

    Spring小例子项目源码

    声明式事务管理更常用,通过在方法上添加`@Transactional`注解,Spring会自动处理事务的开启、提交、回滚等操作。编程式事务管理则需要手动调用`TransactionTemplate`或`PlatformTransactionManager`进行事务控制。 ...

Global site tag (gtag.js) - Google Analytics