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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值