美文网首页
1、springAOP 代理实现

1、springAOP 代理实现

作者: Britney_z | 来源:发表于2017-07-27 16:38 被阅读30次

    @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 可以查看代理信息

    相关文章

      网友评论

          本文标题:1、springAOP 代理实现

          本文链接:https://www.haomeiwen.com/subject/pmvnkxtx.html