Spring - 如何将bean注入到在运行时多次创建的类中?

时间:2011-07-27 09:56:42

标签: java spring dependency-injection

我需要在应用程序启动时初始化bean,所以我在applicationContext.xml中完成了。但是现在我需要将该bean注入到在运行时创建的对象中。例如:

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 个答案:

答案 0 :(得分:2)

更好的方法是将Handler声明为Bean - 假设已经声明了ProfileManager - 然后使用注释@Autowired在Handler bean中自动装配ProfileManager,如果您在应用程序中使用注释,或者在内部applicationContext.xml。 如何在xml中执行此操作的示例可以是:

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

如果您不想将Handler注册为bean,请将其实例化,并从spring的ApplicationContext中获取pm实例。如何在Web应用程序中获取ApplicationContext的方法显示为here

答案 1 :(得分:1)

HandlerProfileManager声明为spring bean,懒惰地初始化它们。并注入它们不要使用new Handler()让Spring执行此操作

答案 2 :(得分:1)

首先,我想知道为什么“处理程序”一遍又一遍地被反复使用。在这个例子中,使用bean并在运行时多次调用方法似乎也同样好。

除此之外,您可以使用bean本身的方面。在那里注入ProfileManager,让Aspect在创建Handler时工作,设置pm。

答案 3 :(得分:1)

我同意其他答案,说明你真的应该让Spring处理Handler的创建,但如果这不是一个选项,那么你可以将ProfileManager注入Servlet然后只需在创建Handler时将其传递给构造函数。