proxy-target-class="true"对Spring实例创建的影响

 

我明明把volunteer这个BEAN设置成单实例的,但加载后却发现Spring容器创建了两个实例。

PS:Volunteer是如下红色背景接口的实现类。

当我把标黄代码注释掉后,无论我获取多少次volunteer实例,都是首次加载时创建的实例,即只执行了一次构造函数。

这是什么原因呢?首先要知道proxy-target-class="true"的作用是什么?它是告诉Sprig容器,创建的动态代理要基于类的,不要基于接口的。

当声明proxy-target-class="true"时,在加载配置时,会为Volunteer创建一个实例,在生成动态代理时,又会为Volunteer创建一个实例。

 

以上结论全是猜的,并未查阅相关资料,通过实践猜出的结论的。

关于动态代理,大家可以看看JAVA基础书籍,里面会有介绍。看过之后,你就会大概了解切面技术是如何实现的了。

 

<bean id="volunteer" scope="singleton" class="com.springinaction.springidol.Volunteer" />
 
 <aop:config proxy-target-class="true"
  
  <aop:aspect ref="magician">
   <aop:pointcut id="thinking"
    expression="execution(*
       com.springinaction.springidol.Thinker.thinkOfSomething(String))
       and args(thoughts)" />
   <aop:before pointcut-ref="thinking"
               method="interceptThoughts"
               arg-names="thoughts"/>
  </aop:aspect>
  

 </aop:config>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值