答案:不是
spring的ioc 容器中默认都是原生对象,只有通过aop增强的对象才是代理对象。
配置了aop的类或者类中方法上有@Transactional注解的(因为@Transactional注解的原理就是基于aop的)。
查看当前对象是否是代理对象的方法:AopUtils.isAopProxy(对象)
情况1:类没被aop增强,并且类中方法没有@Transactional注解
执行结果: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(){
// 结果是false 因为ioc容器默认情况创建的都是原生类
boolean aopProxy = AopUtils.isAopProxy(b);// false
System.out.println("proxyClassTest.................");
}
}
情况2:类被aop增强,并且类中方法没有@Transactional注解
执行结果: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增强,C类没被aop增强,并且类中方法没有@Transactional注解
执行结果:类B的实例是代理类 ,类C的实例不是代理类(因为类B被aop增强而类C没被增强)。
// 类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增强,但是类中方法有@Transactional注解
执行结果: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.................");
}
}