我需要在应用程序启动时初始化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
}
}
答案 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)
将Handler
和ProfileManager
声明为spring bean,懒惰地初始化它们。并注入它们不要使用new Handler()
让Spring执行此操作
答案 2 :(得分:1)
首先,我想知道为什么“处理程序”一遍又一遍地被反复使用。在这个例子中,使用bean并在运行时多次调用方法似乎也同样好。
除此之外,您可以使用bean本身的方面。在那里注入ProfileManager,让Aspect在创建Handler时工作,设置pm。
答案 3 :(得分:1)
我同意其他答案,说明你真的应该让Spring处理Handler
的创建,但如果这不是一个选项,那么你可以将ProfileManager
注入Servlet
然后只需在创建Handler
时将其传递给构造函数。