Как реализовать прототип в области Spring bean - PullRequest
2 голосов
/ 16 декабря 2011

У меня есть боб Springing с состоянием. Как я могу принудительно применить область его использования к прототипу в моем приложении?

Как я могу запретить другому разработчику в моем проекте вводить этот компонент с помощью синглтона?

Я знаю, что вы можете настроить область видимости либо с помощью аннотации, либо через конфигурацию xml. Из того, что я видел, при использовании Spring 3 область, настроенная аннотацией, переопределяется областью, определенной вручную в xml. Как я могу применить свою область видимости, конфигурацию или программно, чтобы мой компонент никогда не использовался в качестве одиночного?

Я думал о проверке области действия bean-компонента при запуске приложения, но это не похоже на элегантное решение.

Ответы [ 3 ]

3 голосов
/ 17 декабря 2011

Это не элегантно, но 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");
    }
}
0 голосов
/ 16 декабря 2011

Если вы не хотите полагаться на то, что пользователь API будет делать то, что от него ожидается, выставьте компонент на фабрику.

0 голосов
/ 16 декабря 2011

Документ это? У него нет возможности узнать, хранит ли кто-то ссылку на bean-компонент и использует его повторно или делится им между потоками, когда им следовало использовать getBean() для получения прототипа.

Spring не может помешать вашим коллегам писать просто некорректный код, и это все, что такое использование.

...