• 欢迎访问web前端中文站,JavaScript,CSS3,HTML5,web前端demo
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏web前端中文站吧

Spring AOP原理和实战

JAVA web前端中文站 2年前 (2017-10-11) 839次浏览 已收录 0个评论

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

更多精彩内容请看 web 前端中文站
http://www.lisa33xiaoq.net 可按 Ctrl + D 进行收藏

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

 @Aspect public class TransactionDemo {     @Pointcut(value="execution(* com.yangxin.core.service.*.*.*(..))")     public void point(){         // web 前端中文站:www.lisa33xiaoq.net     }     @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 中配置。

 <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 创建动态代理。

【注:本文源自网络文章资源,由站长整理发布】


web 前端中文站 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Spring AOP 原理和实战
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址