Spring容器中的对象都是代理对象吗?

答案:不是

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.................");
    }
}

你可能感兴趣的:(spring,java,后端)