Proxy 利用动态创建一个符合某一接口的实例,生成目标类的代理对象 。
CGLib 动态代理
CGLib 全称为 Code,是一个强大的高性能,高质量的代码生成类库,可以在运行期扩展 Java 类与实现 Java 接口,CGLib 封装了 asm,可以再运行期动态生成新的 class 。和 JDK 动态代理相比较:JDK 创建代理有一个限制,就是只能为接口创建代理实例,而对于没有通过接口定义业务方法的类,则可以通过 CGLib 创建动态代理 。
实现原理
@Aspectpublic class TransactionDemo {@Pointcut(value="http://www.kingceram.com/post/execution(* com.yangxin.core.service.*.*.*(..))")public void point(){}@Before(value="http://www.kingceram.com/post/point()")public void before(){System.out.println("transaction begin");}@AfterReturning(value = "http://www.kingceram.com/post/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");} }
在运行时通知对象
通过在代理类中包裹切面,在运行期把切面织入到管理的bean中 。代理封装了目标类,并拦截被通知方法的调用,再把调用转发给真正的目标bean 。当代理拦截到方法调用时,在调用目标bean方法之前,会执行切面逻辑 。
直到应用需要被代理的bean时,才创建代理对象 。如果使用的是的话,在从中加载所有bean的时候,才会创建被代理的对象 。因为运行时才创建代理对象,所以我们不需要特殊的编译器来织入的切面 。
只支持方法级别的连接点
因为基于动态代理,所以只支持方法连接点 。缺少对字段连接点的支持,而且它不支持构造器连接点 。方法之外的连接点拦截功能,我们可以利用来补充 。
在 AOP 中,关注点和横切关注的区别是什么?在aop 中和 cross-的不同之处