`
licg1234
  • 浏览: 49891 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

spring aop 底层实现

阅读更多

众所周知,spring1.0 与2.0版本的aop实现方式是不同的。

但是依据spring中不重复设计轮子的原则,这两种实现方式的底层代码一定存在着相同的地方,本篇文章就找出spring aop实现中通用的地方。
  spring1.2的aop配置方式:

<bean id="myAdvisor" class="com.mycompany.MyAdvisor">
                <property name="someProperty"><value>Custom string property value</value></property>
                </bean>
                
                <bean id="debugInterceptor" class="org.springframework.aop.interceptor.DebugInterceptor"/>
                
                <bean id="person" class="org.springframework.aop.framework.ProxyFactoryBean">
                <property name="proxyInterfaces"><value>com.mycompany.Person</value></property>
                <!-- Use inner bean, not local reference to target -->
                <property name="target">
                <bean class="com.mycompany.PersonImpl">
                <property name="name"><value>Tony</value></property>
                <property name="age"><value>51</value></property>
                </bean>
                </property>
                <property name="interceptorNames">
                <list>
                <value>myAdvisor</value>
                <value>debugInterceptor</value>
                </list>
                </property>
            </bean>
 


  spring AspectJ实现方式分为两种,一种是在spring配置文件中,配置类似:

 

<aop:config>
		<aop:pointcut id="manPointcut"
			expression="execution(* com.licg.tx.*Impl.*(..))" />
		<aop:aspect id="beforeExample" ref="fbi">
			<aop:before pointcut-ref="manPointcut" method="before" />
			<aop:after pointcut-ref="manPointcut" method="before" />
		</aop:aspect>
		
		<aop:aspect id="before2" ref="fbi2">
			<aop:before pointcut-ref="manPointcut" method="before" />
		</aop:aspect>
		
		
	</aop:config>
 

另外一种就是:

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class BeforeExample {

  @Before("execution(* com.xyz.myapp.dao.*.*(..))")
  public void doAccessCheck() {
    // ...
  }
 

好的,先研究加载代理bean的方式

      从1.2配置文件中我们可以直接看出来,spring代理bean是通过ProxyFactoryBean这个创建代理类的工厂创建出来的。我们只需要将我们需要代理的bean的Advisor或者Advice配置到ProxyFactoryBean这个代理工厂下面,spring便为我们生成了代理的bean。

 

    那么我们通过aspectj配置的代理bean是如何加载的呢?

    好的我们用eclipse配置spring项目,我们打开spring源代码:

    org.springframework.aop.aspectj.AspectJMethodBeforeAdvice 给构造器打上断点,

    org.springframework.aop.aspectj.AspectJPointcutAdvisor  给构造器打上断点。

    采用debug模式启动,你会惊讶的发现,spring会把aspectj方式所配置的aspectj首先转化为pointcut对象,然后转换成Advice对象,最后转换成Advisor  对象。

 

  ok,到这个时候恐怕大家已经发现了,spring AspectJ的代理方式底层的实现上和spring1.2配置方式实现上竟然一致了,都是先将要代理的bean转化为Advisor或者Advice。

  那么再以后的操作也就相同了,都是通过ProxyFactoryBean这个代理工厂实现代理bean的生成。

 

 

 

着重说明几点:

   1.AspectJMethodBeforeAdvice 与AspectJPointcutAdvisor 这个类的发现大家可以看spring log4j的日子打印,与debug的类调试走向。

 

  2.通过spring aspectj配置的advice的方法中可以带的实现对象的参数为:

   JoinPoint,ProceedingJoinPoint,JoinPoint.StaticPart

   具体查看spring AbstractAspectJAdvice类源代码。

 

 3.AspectJMethodBeforeAdvice 与AspectJPointcutAdvisor 这两个类,我们可以通过查找子类,查询父类,查询接口查看spring的源代码的相关实现。

 

 

 

分享到:
评论

相关推荐

    Spring AOP的底层实现技术

    下面我们将深入探讨Spring AOP的底层实现技术和相关知识点。 1. **代理模式** Spring AOP基于两种代理机制实现:JDK动态代理和CGLIB代理。JDK动态代理适用于实现了接口的目标对象,通过反射机制创建一个代理类来...

    Spring Aop的底层实现技术 --- Jdk动态代理原理

    Spring AOP 的底层实现技术 --- Jdk 动态代理原理 JDK 动态代理是 Spring AOP 的底层实现技术,允许开发者在运行期创建接口的代理实例。在 JDK 1.3 以后,JDK 动态代理技术提供了实现 AOP 的绝好底层技术。JDK 动态...

    Spring AOP IOC源码笔记.pdf

    Spring AOP基于代理实现,可以使用接口代理(JDK动态代理)或类代理(CGLIB)。 7. CGLIB: CGLIB是Spring AOP默认的代理库,用于生成目标类的子类,从而实现方法拦截。当目标类没有实现接口时,Spring会使用CGLIB...

    spring事务的底层实现流程图

    spring事务的底层实现流程图 spring事务的底层实现流程图 spring事务的底层实现流程图 spring事务的底层实现流程图 spring事务的底层实现流程图 spring事务的底层实现流程图 spring事务的底层实现流程图 spring事务...

    SpringAOP的实现机制(底层原理)、应用场景等详解,模拟过程的实例

    这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好地理解和利用Spring AOP来提高您的应用程序的可维护性和可扩展性。 内容亮点: JDK动态...

    spring-aop底层1

    【Spring-AOP底层详解】 Spring AOP,即Spring的面向切面编程,是Spring框架中的一个重要组成部分,它提供了一种在运行时动态插入代码的能力,主要用于处理横切关注点,如日志记录、事务管理、权限校验等,从而降低...

    spring-aop.rar_aop1270_spring_spring aop

    Spring AOP通过动态代理来实现,主要有两种代理方式: 1. JDK动态代理:适用于实现了接口的目标对象,通过反射创建代理对象,代理对象在调用真实对象方法前/后执行通知。 2. CGLIB代理:如果目标对象没有实现接口...

    用xml配置的方式进行SpringAOP开发

    不过,理解XML配置方式有助于深入理解Spring AOP的底层原理。 总的来说,Spring AOP通过XML配置为我们提供了一种灵活的方式来管理横切关注点,使我们的代码更加模块化和可维护。通过定义Advisor、切点和通知,我们...

    springIOC及AOP底层原理Demo实现

    具体实现上,Spring AOP有两种实现方式:基于代理的AOP和基于ASM字节码的AOP。基于代理的AOP主要使用JDK动态代理或CGLIB库生成目标对象的代理对象,代理对象在方法调用时拦截并执行通知。而基于字节码的AOP则在运行...

    SpringAOP所需要的Jar包

    1. **spring-aop.jar**:这是Spring AOP的核心库,包含了实现AOP功能的类和接口,如Aspect、JoinPoint、Pointcut等。 2. **spring-aspects.jar**:此库包含了Spring对某些常见切面库(如JPA、Hibernate等)的集成,...

    Spring中aop编程所需要的jar包

    - `spring-aop.jar`: 提供了实现AOP功能的类和接口,包括定义切面、通知(advises)、切入点(pointcuts)以及代理的创建。它实现了基于代理的AOP模型,可以创建JDK动态代理或CGLIB代理。 3. **Spring Aspects包**...

    个人用java动态代理模拟实现spring aop

    - Spring默认使用CGLIB作为AOP的底层实现,当目标对象没有实现接口时,CGLIB会创建目标对象的子类。 - CGLIB通过ASM库生成字节码,创建目标类的子类,并在子类中拦截并增强方法调用。 - CGLIB使用`...

    Spring实现AOP的4种方式 - Java -

    同时,了解XML配置方式可以帮助我们理解Spring AOP的底层原理。 在实际开发中,理解并掌握这四种AOP实现方式对于编写高效、灵活的代码至关重要。Spring的AOP特性使得我们能够更好地组织代码,将横切关注点与业务...

    42 离开Spring AOP,我们如何实现AOP功能?慕课专栏1

    如果目标类没有实现接口,或者希望进行更底层的代理(如方法拦截),Spring AOP会使用CGLIB库作为代理机制。CGLIB是一个代码生成库,可以在运行时为类创建子类并添加方法拦截器。 JDK动态代理的核心类有两部分:`...

    spring Aop所需要的jar包

    其次,`aspectjrt.jar`是AspectJ运行时库,即使不使用AspectJ语法编写切面,Spring AOP在底层仍然会利用AspectJ的编织机制。这个库支持在运行时动态地对类进行增强,实现切面的注入。 再者,`aspectjweaver.jar`是...

    Spring AOP Example – Pointcut , Advisor

    此外,AspectJ Weaver是Spring AOP的底层实现,它可以在编译时或运行时对字节码进行操作,实现切面的织入。 总之,Spring AOP是解决横切关注点的有效工具,通过Pointcut和Advisor,我们可以优雅地管理那些分散在...

    spring底层的学习之路

    此外,Spring还提供了AOP(面向切面编程)功能,用于实现日志记录、事务管理、权限控制等跨切面关注点。AOP通过定义切面(Aspect)、通知(Advice)、连接点(Join Point)等概念,使得代码更加模块化和可维护。 在...

    Java Spring AOP 面向切面编程的4种实现

    动态代理是一种在运行时创建代理对象的技术,通常用于实现AOP(面向切面编程...Spring AOP既支持JDK动态代理也支持CGLIB,会根据目标类是否实现了接口选择合适的底层技术。 Guice / Dagger: 如果你在使用Google的依赖

    设计模式之动态代理与spring的aop编程

    动态代理和Spring AOP(面向切面编程)是两个关键的设计概念,它们在实现高效、模块化的系统中起着至关重要的作用。本文将深入探讨这两个概念,并结合实际应用进行解析。 首先,让我们理解什么是动态代理。动态代理...

Global site tag (gtag.js) - Google Analytics