@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
boolean proxyTargetClass() default false;
boolean exposeProxy() default false;
}
1、proxyTargetClass默認(rèn)false盒至,默認(rèn)使用jdk動態(tài)代理酗洒,如果想強(qiáng)制使用cglib代理,只需設(shè)置為true枷遂。
推薦使用jdk代理樱衷,因?yàn)槿羰褂胏glib,若調(diào)用final 方法酒唉,無法通知箫老。cglib生成代理對象是目標(biāo)類的子類,cglib比jdk動態(tài)代理性能更好黔州。
2、代理增強(qiáng)
@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注解阔籽,代理對象調(diào)用則打印------流妻,由于this.doBuss3(); 是目標(biāo)對象自身調(diào)用,并不是代理對象的調(diào)用笆制,如果做到內(nèi)部方法的代理對象的調(diào)用
首先: exposeProxy可以實(shí)現(xiàn)目標(biāo)對象自我調(diào)用的切面增強(qiáng)绅这,設(shè)置為true
其次:? ((BusinessServiceImpl) AopContext.currentProxy()).doBuss3()
AopUtils 可以查看代理信息