@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
boolean proxyTargetClass() default false;
boolean exposeProxy() default false;
}
1、proxyTargetClass默认false,默认使用jdk动态代理,如果想强制使用cglib代理,只需设置为true。
推荐使用jdk代理,因为若使用cglib,若调用final 方法,无法通知。cglib生成代理对象是目标类的子类,cglib比jdk动态代理性能更好。
2、代理增强
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = false, exposeProxy = true)
public class Config {
}
@Service
public class BusinessServiceImpl {
{
public void doBuss() {
this.doBuss3();
((BusinessServiceImpl) AopContext.currentProxy()).doBuss3();
}
@Log
public void doBuss3() {
System.out.println("===dobuss3===");
}}
public class LogMethodInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("----------");
Object result = invocation.proceed();
return result;
}
例如方法使用Log注解,代理对象调用则打印------,由于this.doBuss3(); 是目标对象自身调用,并不是代理对象的调用,如果做到内部方法的代理对象的调用
首先: exposeProxy可以实现目标对象自我调用的切面增强,设置为true
其次: ((BusinessServiceImpl) AopContext.currentProxy()).doBuss3()
AopUtils 可以查看代理信息
网友评论