`
michael.softtech
  • 浏览: 208128 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

spring源码分析之——spring aop代理实现细节

阅读更多

前面分析了spring aop的实现原理。为了突出整个流程的清晰,其中有些细节部分没有详细分析。

现在就分析一下aop生成代理对象的细节。言乘上文,spring aop 生成代理对象是在

AbstractAutoProxyCreator的如下方法中:

protected Object createProxy(
			Class<?> beanClass, String beanName, Object[] specificInterceptors, TargetSource targetSource) {

		ProxyFactory proxyFactory = new ProxyFactory();
		// Copy our properties (proxyTargetClass etc) inherited from ProxyConfig.
		proxyFactory.copyFrom(this);

		if (!shouldProxyTargetClass(beanClass, beanName)) {
			// Must allow for introductions; can't just set interfaces to
			// the target's interfaces only.
			Class<?>[] targetInterfaces = ClassUtils.getAllInterfacesForClass(beanClass, this.proxyClassLoader);
			for (Class<?> targetInterface : targetInterfaces) {
				proxyFactory.addInterface(targetInterface);
			}
		}

		Advisor[] advisors = buildAdvisors(beanName, specificInterceptors);
		for (Advisor advisor : advisors) {
			proxyFactory.addAdvisor(advisor);
		}

		proxyFactory.setTargetSource(targetSource);
		customizeProxyFactory(proxyFactory);

		proxyFactory.setFrozen(this.freezeProxy);
		if (advisorsPreFiltered()) {
			proxyFactory.setPreFiltered(true);
		}

		return proxyFactory.getProxy(this.proxyClassLoader);
	}

   从上面可以看出,如果设置了proxyTargetClass,那么proxyFactory就不调用addInterface.

   跟踪一下最后代码,最后实际调用了了DefaultAopProxyFactory的createAopProxy方法,代码如下:

 

public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
		if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
			Class targetClass = config.getTargetClass();
			if (targetClass == null) {
				throw new AopConfigException("TargetSource cannot determine target class: " +
						"Either an interface or a target is required for proxy creation.");
			}
			if (targetClass.isInterface()) {
				return new JdkDynamicAopProxy(config);
			}
			if (!cglibAvailable) {
				throw new AopConfigException(
						"Cannot proxy target class because CGLIB2 is not available. " +
						"Add CGLIB to the class path or specify proxy interfaces.");
			}
			return CglibProxyFactory.createCglibProxy(config);
		}
		else {
			return new JdkDynamicAopProxy(config);
		}
	}

   这段代码的意义很明确。如果设置了proxyTargetClass或者根本没有接口,那么就

   使用CglibProxyFactory生成代理。否则使用JdkDynamicAopProxy。

   这两种代理方式的实现细节在此不作分析。

分享到:
评论

相关推荐

    五、Spring源码分析——Spring Aop

    《Spring AOP 源码分析》 在深入探讨Spring AOP之前,我们先要理解AOP(面向切面编程)的基本概念。AOP是一种编程范式,它将关注点分离,使得我们可以将横切关注点(如日志、事务管理、安全检查等)与业务逻辑解耦...

    四、Spring源码分析——动态代理

    在Spring框架中,动态代理是实现AOP(面向切面编程)的核心技术之一。它允许我们在不修改原有代码的情况下,为方法添加额外的功能,如事务管理、日志记录等。本篇文章将深入探讨Spring中的动态代理机制,以及它是...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    了解这些基础知识可以帮助我们更好地掌握 Spring AOP 的实现细节。在分析源码时,可以参考作者的源码注释和相关文章,以便更深入地理解每一步操作。 总的来说,Spring AOP 通过动态代理技术实现了切面的插入,使得...

    二、Spring源码分析——BeanFactory

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

    三、Spring源码分析——ApplicationContext

    《Spring源码分析——ApplicationContext》 在Java世界中,Spring框架是不可或缺的一部分,它以其强大的IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)特性,极大地...

    spring 源码中文注释

    在源码分析的过程中,读者会深入理解Spring的内部工作机制,例如如何解析配置、如何创建bean实例、如何实现AOP代理等。这将有助于开发者编写更高效、更健壮的代码,也能为参与Spring的扩展或定制打下坚实基础。 总...

    Spring源码解析.zip

    本压缩包“Spring源码解析”提供了对Spring框架核心组件——IOC(Inversion of Control,控制反转)、AOP(Aspect Oriented Programming,面向切面编程)以及Transaction(事务管理)的源码分析,帮助开发者更全面地...

    Spring5 源码分析(第 2 版)-某Tom老师

    《Spring5 源码分析(第 2 版)》是某Tom老师精心编写的深度解析文档,旨在帮助读者全面理解Spring5的核心机制和设计理念。Spring作为Java领域最为广泛应用的框架之一,其源码的深入理解对于开发者来说至关重要。这篇...

    Spring5 源码分析(第 2 版) .zip

    总的来说,《Spring5 源码分析(第 2 版)》这本书不仅涵盖了Spring5的主要特性和组件,还深入探讨了其实现原理,是Java开发者深入理解Spring框架、提升技术水平的宝贵资源。通过对书中源码的阅读和理解,读者可以更好...

    struts2+spring集成bug——使用AOP时可能遇到的问题分析

    3. **AOP代理问题**:Spring的AOP有两种代理模式,即JDK动态代理和CGLIB代理。如果动作类没有实现接口,Spring默认会使用CGLIB代理。但有些Struts2的插件或者拦截器可能期望动作类是一个接口,这可能导致问题。确保...

    Spring 源码分析文档----自用

    ### Spring 源码分析——设计模式篇 #### 一、引言 Spring框架作为Java企业级开发领域中不可或缺的一部分,其内部集成了多种设计模式,不仅有助于提高系统的可维护性和扩展性,还能够帮助开发者更好地理解和应用...

    spring源码阅读——1.spring-core-3.2.9

    通过分析`readme.txt`,我们可以获得关于这个版本的更多细节,例如新特性、已知问题和改进之处。同时,了解XML配置文件的结构和作用,也能使我们在实际项目中更有效地配置和使用Spring。 总之,Spring Core 3.2.9...

    spring高级源码分析

    Spring AOP通过代理模式实现,可以是JDK动态代理或CGLIB代理,具体使用哪种取决于目标对象是否实现了接口。理解Spring AOP的实现原理对于优化代码和编写更高效的切面至关重要。 接着,Spring MVC是构建Web应用的...

    spring高手之路22

    1. 从整体视角学习Bean是如何被AOP代理的 ...这部分内容在Spring高手之路21——深入剖析Spring AOP代理对象的创建的第2节“匹配增强器Advisors(源码分析+时序图说明)”已经讲解,可自行前往翻阅学习。 关键点:

    spring security 2.0 的简单配置使用(补)——用aop控制method级权限

    7. **源码分析** 对于深入理解Spring Security的工作原理,查看源码是十分有帮助的。例如,`AccessDecisionManager`的实现类,如`AffirmativeBased`和`UnanimousBased`,以及`AccessDecisionVoter`接口,它们共同...

    Spring aop 性能监控器

    本篇文章将深入探讨如何使用Spring AOP实现性能监控器,并通过源码分析来理解其工作原理。 首先,我们要了解AOP的核心概念——切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入...

    spring源码UML图

    《Spring框架源码分析——基于UML图的解读》 在深入探讨Spring框架源码之前,我们首先要理解什么是UML(统一建模语言)。UML是一种标准的图形化建模语言,用于软件设计和系统分析,它通过图表来表示系统的结构、...

    7Spring AOP盗梦空间之二——获得返回值AfterReturnning

    在本篇博文中,我们将深入探讨Spring AOP(面向切面编程)中的一个重要概念——AfterReturning通知,这是Spring框架提供的一种强大的功能,允许我们在方法成功执行并返回后执行额外的操作。我们将通过源码分析和实际...

    Spring有关资料 源码

    这个压缩包中的源码可以帮助我们学习Spring框架的设计模式和实现细节,例如,如何使用注解配置Bean,如何编写AOP切面,以及如何集成Spring与其他技术。对于初学者,通过阅读和分析这些源码,可以加深对Spring的理解...

    小读spring ioc源码(一)——整体介绍

    《Spring IOC源码解析(一)——整体介绍》 在深入理解Spring框架的过程中,源码分析是不可或缺的一环。本文将对Spring的IOC(Inversion of Control,控制反转)...希望本文能为你开启Spring源码探索之旅的第一步。

Global site tag (gtag.js) - Google Analytics