我有一个有状态的Spring bean。如何在我的应用程序中强制使用其原型?
如何在我的项目中阻止使用单例范围注入此bean的另一个开发者?
我知道您可以通过注释或通过xml配置来配置范围。在我看到的情况下,当使用Spring 3时,注释配置的作用域会被xml中手动定义的作用域覆盖。如何通过配置或以编程方式强制执行我的范围,以便我的bean永远不会被用作单例?
我考虑过在启动应用程序时检查bean范围,但这听起来并不像是一个优雅的解决方案。
答案 0 :(得分:3)
这不优雅,但AFAIK这是实现您所寻找的唯一途径
public class MyStatefulBean implements InitializingBean, ApplicationContextAware, BeanNameAware {
private String myName;
private ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;
}
@Override
public void setBeanName(String s) {
this.myName = s;
}
@Override
public void afterPropertiesSet() throws Exception {
if(this.context.isSingleton(this.myName))
throw new RuntimeException("Bean CANNOT be singleton");
}
}
答案 1 :(得分:0)
记录下来吗?它没有办法知道是否有人在保留对bean的引用并重新使用它或在线程中共享它时应该使用getBean()
来获取原型。
Spring无法阻止你的同行编写完全不正确的代码,这就是这样的用法。
答案 2 :(得分:0)
如果您不想依赖API用户执行预期的操作,请通过工厂公开bean。