如何强制执行Spring bean的原型范围

时间:2011-12-16 19:08:10

标签: java spring scope javabeans

我有一个有状态的Spring bean。如何在我的应用程序中强制使用其原型?

如何在我的项目中阻止使用单例范围注入此bean的另一个开发者?

我知道您可以通过注释或通过xml配置来配置范围。在我看到的情况下,当使用Spring 3时,注释配置的作用域会被xml中手动定义的作用域覆盖。如何通过配置或以编程方式强制执行我的范围,以便我的bean永远不会被用作单例?

我考虑过在启动应用程序时检查bean范围,但这听起来并不像是一个优雅的解决方案。

3 个答案:

答案 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。