java动态代理

JAVA中的JDK是基于接口的,而CGLIB是基于子类的方式来进行动态代理,实现AOP的基础。

支持处理使用AspectJ的@Aspect注释标记的组件,类似于Spring的<aop:aspectj-autoproxy> XML元素中的功能。

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {

@Bean
public FooService fooService() {
    return new FooService();
}

@Bean
public MyAspect myAspect() {
    return new MyAspect();
}

}

FooService类是一个典型的POJO组件 而MyAspect类 是一个 @Aspect-style 的切面:
public class FooService {

// various methods

}

@Aspect
public class MyAspect {

@Before("execution(* FooService+.*(..))")
public void advice() {
    // advise FooService methods as appropriate
}

}

在上面的场景中,@ EnableAspectJAutoProxy确保正确处理MyAspect,并将FooService代理混合在它提供的建议中。

用户可以使用proxyTargetClass()属性控制为FooService创建的代理类型。以下启用CGLIB样式的“子类”代理,而不是基于默认接口的JDK代理方法。

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass=true)
public class AppConfig {
// …
}
CGLIB但因为采用的是继承,所以不能对final修饰的类进行代理。

@EnableAspectJAutoProxy仅适用于其本地应用程序上下文,允许在不同级别选择性地代理bean。

exposeProxy - 指示代理应由AOP框架作为ThreadLocal公开,以便通过AopContext类进行检索。
proxyTargetClass - 指示是否要创建基于子类的(CGLIB)代理,而不是基于标准Java接口的代理。默认值为false。

0%