Spring框架中前置增强

在上一篇中我们已经通过了动态代理技术实现了简单的AOP功能,但是如果我们细心观察就会发现,通过上一篇中的方式实现有,几点明显需要改进的地方,它们分别是:

目标类所有的方法都添加了事物管理,而有时我们只需要在特殊的方法上添加事物即可。例如上一篇中的事例,我们只需要在有写操作方法上添加事物即可,也就是register方法,而不需要在读事物上添加事物也就是login方法。

我们通过了硬编码的方法指定了横切的逻辑,也就是在目标方法开始前和开始后添加了代码。

我们手动创建了代理类,这样在为不同的类创建代理时,就需要分别编写相应的代码,无法通用。

要想解决上述问题,解决的办法就是使用spring为我们提供的增强,在其它文章中我们已经介绍过了增强就是添加到目标类特殊连接点的信息,并且spring为我们提供了的增强都在带方位信息的,也就是在方法前、方法后等。所以我们可以很方便的使用增强来使我们需要添加事物的方法动态添加织入的功能。下面我们将演示,spring中为我们都提供了哪些增强。

  • 前置增强

顾名思义也就是在目标方法执行之前添加横切的逻辑。我们通过下面的用例来演示一下前置增强的具体使用。

我们知道spring中的AOP功能底层也是通过JDK动态代理或者使用CGLib动态代理,那么我们上述代码到底是通过哪种技术实现的呢?别着急我们看一下ProxyFactory类的底层实现。在ProxyFactory类中我们可以通过设置setInterfaces方法指定使用JDK动态代理。如果是对类进行代理,因为JDK代理不支持,所以ProxyFactory就会采用CGLib动态代理。我们还可以通过setOptimize方法来让ProxyFactory启动优化方式,这样,即使是对接口进行代理,也会使用CGLib代理。

JDK动态代理

CGLib动态代理

下面我们通过sping配置文件的方式实现AOP动态代理功能。

下面我们看一下org.springframework.aop.framework.ProxyFactoryBean类的相关属性说明:

  • target: 动态代理的目标对象
  • proxyInterfaces:动态代理所要实现的接口,如果是用CGLib代理时,可以不设置此属性。也可以同时设置多个接口,当采用多个接口时接口与接口之间用用逗号分隔。
  • interceptorNames:具有和横切逻辑的类。
  • singleton: 创建的代理对象是否是单例对象,默认为单例对象。
  • optimize: 是否启用优化功能,当设置启用时,spring采用CGLib动态代理,反之采用JDK动态代理。当设置为true时,可以不设置proxyInterfaces属性。
  • proxyTargetClass: 是否对类进行代理,当设置为true时,则采用CGLib动态代理,反之采用JDK动态代理。

原文发布于微信公众号 - 吉林乌拉(jilinwulacom)

原文发表时间:2019-08-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券