答案:不是
spring的ioc 容器中默認(rèn)都是原生對象,只有通過aop增強(qiáng)的對象才是代理對象波材。
配置了aop的類或者類中方法上有@Transactional注解的(因?yàn)锧Transactional注解的原理就是基于aop的)。
查看當(dāng)前對象是否是代理對象的方法:AopUtils.isAopProxy(對象)
情況1:類沒被aop增強(qiáng)身隐,并且類中方法沒有@Transactional注解
執(zhí)行結(jié)果:false , 不是代理類唯灵。
// 類B
@Component
public class B {
public void save(){
System.out.println("保存");
}
}
// 測試類
@Controller
public class A {
@Autowired
B b;
@RequestMapping(value = "/getList",method = RequestMethod.POST)
public void proxyClassTest(){
// 結(jié)果是false 因?yàn)閕oc容器默認(rèn)情況創(chuàng)建的都是原生類
boolean aopProxy = AopUtils.isAopProxy(b);// false
System.out.println("proxyClassTest.................");
}
}
情況2:類被aop增強(qiáng)贾铝,并且類中方法沒有@Transactional注解
執(zhí)行結(jié)果:true , 是代理類埠帕。
// 類B
@Component
public class B {
public void save(){
System.out.println("保存");
}
}
// Aop配置
@Pointcut("(execution(public void cn.a.controller.*.*(..))) ")
public void pubLog(){}
//測試類
@Controller
public class A {
@Autowired
B b;
@RequestMapping(value = "/getList",method = RequestMethod.POST)
public void proxyClassTest(){
boolean aopProxy = AopUtils.isAopProxy(b);// true
System.out.println("proxyClassTest.................");
}
}
情況3:B類被aop增強(qiáng)垢揩,C類沒被aop增強(qiáng),并且類中方法沒有@Transactional注解
執(zhí)行結(jié)果:類B的實(shí)例是代理類 敛瓷,類C的實(shí)例不是代理類(因?yàn)轭怋被aop增強(qiáng)而類C沒被增強(qiáng))叁巨。
// 類B
package cn.a.controller;
@Component
public class B {
public void save(){
System.out.println("保存");
}
}
// 類C
package cn.a;
@Component
public class C {
public void save(){
System.out.println("保存");
}
}
// aop類
@Pointcut("(execution(public void cn.a.controller.*.*(..))) ")
public void pubLog(){}
// 測試類
@Controller
public class A {
@Autowired
B b;
@Autowired
C c;
@RequestMapping(value = "/getList",method = RequestMethod.POST)
public void proxyClassTest(){
boolean aopProxy = AopUtils.isAopProxy(b);// true
boolean aopProxy1 = AopUtils.isAopProxy(c);// false
System.out.println("proxyClassTest.................");
}
}
情況4:類沒被aop增強(qiáng),但是類中方法有@Transactional注解
執(zhí)行結(jié)果:true 呐籽, 是代理類锋勺。
// 類B 方法有@Transactional注解
@Component
public class B {
@Transactional
public void save(){
System.out.println("保存");
}
}
// 測試類
@Controller
public class A {
@Autowired
B b;
@RequestMapping(value = "/getList",method = RequestMethod.POST)
public void proxyClassTest(){
boolean aopProxy = AopUtils.isAopProxy(b);// true
System.out.println("proxyClassTest.................");
}
}