java – 未填充spring单例bean字段
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 未填充spring单例bean字段,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1831字,纯文字阅读大概需要3分钟。
内容图文
![java – 未填充spring单例bean字段](/upload/InfoBanner/zyjiaocheng/710/33028bdef3e44d619d6642df146a582a.jpg)
我需要一个服务(单身适合)和一些内部字段,比如挂起的线程列表(是的,所有内容都写成线程安全的)问题是,如果我@autowire这个bean,字段看起来是空的.调试我看到代理正确绑定到实例(字段CGLIB $CALLBACK_X正确链接到填充的bean),填充字段,但它提供的字段为空.
以下几行代码概括了我正在谈论的内容.
@Service
public class myService{
@Autowired
private Monitor monitor;
public List getSomething(){
return monitor.getList();
}
}
@Service
public class myStatefulService{
//This field will be populated for sure by someone before getSomething() is called
private List list;
public synchronized List getSomething(){
return this.list;
}
//Called by other services that self inject this bean
public synchronized void addToList(Object o){
this.list.add(o);
}
}
我得到的getList调用期间调试变量监视器
monitor => instance of correct class
fields:
CGLIB$BOUND => true
CGLIB$CALLBACK_0.advised => proxyFactory (correct)
CGLIB$CALLBACK_1.target (reference to the correct instance of myStatefulService class)
fields:
list => [.........] (correctly populated)
CGLIB$CALLBACK_2 .....
......
......
......
list => [] (the list that would be populated is empty instead)
解决方法:
你好奇还是有一些真正的问题?不过这里有一个解释.
当使用CGLIB代理类时,Spring将创建一个名为myService $EnhancerByCGLIB的子类.此增强类将覆盖一些(如果不是全部)业务方法,以应用实际代码的横切关注点.
这真是一个惊喜.这个额外的子类不会调用基类的超类方法.相反,它会创建myService的第二个实例并委托给它.这意味着您现在有两个对象:您的真实对象和指向(包装)它的CGLIB增强对象.
增强类只是一个虚拟代理.它仍然具有与基类相同的字段(从中继承)但不使用它们.当你在myService $EnhancerByCGLIB对象上调用addToList()时,它将首先应用一些AOP逻辑,调用myService的addToList()(它包装)并在返回时应用剩余的AOP逻辑.永远不会触及myService $EnhancerByCGLIB.list字段.
为什么Spring不能使用同一个类并通过super委托?我想简单一点:首先创建“原始”bean然后在后处理期间应用AOP代理.
内容总结
以上是互联网集市为您收集整理的java – 未填充spring单例bean字段全部内容,希望文章能够帮你解决java – 未填充spring单例bean字段所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。