Spring - как внедрить компонент в класс, который создается много раз во время выполнения? - PullRequest
1 голос
/ 27 июля 2011

Мне нужно было инициализировать bean-компонент при запуске приложения, поэтому я сделал это в applicationContext.xml. Но теперь мне нужно внедрить этот компонент в объект, который создается во время выполнения. Пример:

Servlet

...
void doPost(...) {
    new Handler(request); 
}
...

Handler

public class Handler {

    ProfileManager pm; // I need to inject this ???

    Handler(Request request) {
        handleRequest(request);
    }

    void handleRequest(Request request) {
        pm.getProfile(); // example
    }
}

Ответы [ 4 ]

2 голосов
/ 27 июля 2011

Лучшим подходом было бы также объявить обработчик как компонент - при условии, что ProfileManager уже объявлен - и затем автоматически связать ProfileManager в компоненте обработчика либо с аннотацией @Autowired, если вы используете аннотации в своих приложениях, либо внутри applicationContext.xml. Пример того, как это сделать в xml, может быть:

<bean id="profileManager" class="pckg.ProfileManager" />
<bean id="handler" class="pckg.Handler" >
 <property name="pm" ref="profileManager" />
</bean>

Если вы НЕ хотите регистрировать Handler как бин, создайте его экземпляр, как вы, и возьмите экземпляр pm из SpringConfision ApplicationContext. Способ получения ApplicationContext внутри веб-приложения показан здесь

1 голос
/ 27 июля 2011

Я согласен с другими ответами о том, что вы действительно должны позволить Spring обработать создание Handler, но если это не вариант, вы можете вставить ProfileManager в Servlet, а затем просто передать его в конструктор когда вы создаете Handler.

1 голос
/ 27 июля 2011

Прежде всего, мне интересно, почему «Обработчик» используется снова и снова. Использование bean-компонента и многократный вызов метода во время выполнения, похоже, также хорошо в этом примере.

Кроме того, вы можете использовать аспект, который является самим бобом. Вставьте туда ProfileManager и дайте Aspect поработать над созданием обработчика, установив pm.

1 голос
/ 27 июля 2011

Объявите Handler и ProfileManager как боб весны, инициализируйте их лениво. и вводить их не используйте new Handler() пусть Spring сделает это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...