Spring AOP原理和实战

AOP的实现,相比xml配置,基于注解的方式更加简洁方便。也是日常开发中常用的做法。

下面我们一起来看一个例子。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 @Aspect public class TransactionDemo {      @Pointcut (value= "execution(* com.yangxin.core.service.*.*.*(..))" )      public void point(){          // 业余草:www.xttblog.com      }      @Before (value= "point()" )      public void before(){          System.out.println( "transaction begin" );      }      @AfterReturning (value =  "point()" )      public void after(){          System.out.println( "transaction commit" );      }      @Around ( "point()" )      public void around(ProceedingJoinPoint joinPoint)  throws Throwable{          System.out.println( "transaction begin" );          joinPoint.proceed();          System.out.println( "transaction commit" );      } }

在applicationContext.xml中配置。

1 2 < aop:aspectj-autoproxy /> < bean id "transactionDemo" class "com.yangxin.core.transaction.TransactionDemo" />

就是以上这么简单的配置,就可以实现AOP的功能。

        Spring Aop原理

通过前面介绍可以知道:AOP 代理其实是由 AOP 框架动态生成的一个对象,该对象可作为目标对象使用。AOP 代理包含了目标对象的全部方法,但 AOP 代理中的方法与目标对象的方法存在差异:AOP 方法在特定切入点添加了增强处理,并回调了目标对象的方法。

Spring AOP原理和实战

Spring 的 AOP 代理由 Spring 的 IoC 容器负责生成、管理,其依赖关系也由 IoC 容器负责管理。因此,AOP 代理可以直接使用容器中的其他 Bean 实例作为目标,这种关系可由 IoC 容器的依赖注入提供。

Aop开发时,其中需要程序员参与的只有 3 个部分:

  • 定义普通业务组件。

  • 定义切入点,一个切入点可能横切多个业务组件。

  • 定义增强处理,增强处理就是在 AOP 框架为普通业务组件织入的处理动作。

为了理清关系,先来个类关系图。

Spring AOP原理和实战

        两种动态代理方式

Spring默认采取的动态代理机制实现AOP,当动态代理不可用时(代理类无接口)会使用CGlib机制。

Spring提供了两种方式来生成代理对象: JDKProxy和Cglib,具体使用哪种方式生成由AopProxyFactory根据AdvisedSupport对象的配置来决定。默认的策略是如果目标类是接口,则使用JDK动态代理技术,否则使用Cglib来生成代理。

        JDK动态代理

  • JDK动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。InvocationHandler是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编制在一起。

  • Proxy利用InvocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象。

        CGLib动态代理

CGLib全称为Code Generation Library,是一个强大的高性能,高质量的代码生成类库,可以在运行期扩展Java类与实现Java接口,CGLib封装了asm,可以再运行期动态生成新的class。和JDK动态代理相比较:JDK创建代理有一个限制,就是只能为接口创建代理实例,而对于没有通过接口定义业务方法的类,则可以通过CGLib创建动态代理。

来源:悦码,本文观点不代表自营销立场,网址:https://www.zyxiao.com/p/82823

发表评论

电子邮件地址不会被公开。 必填项已用*标注

侵权联系
分享本页
返回顶部