Spring注入Servlet [英] Spring injection Into Servlet
问题描述
所以我看到这个问题:
,并且想知道我的方法是否可行。
and was wondering if my method will work out.
1)在我的Spring应用程序上下文中声明bean
1) Declare beans in my Spring application context
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="initialSize" value="${jdbc.initialSize}" />
<property name="validationQuery" value="${jdbc.validationQuery}" />
<property name="testOnBorrow" value="${jdbc.testOnBorrow}" />
</bean>
<bean id="apiData" class="com.mydomain.api.data.ApiData">
<property name="dataSource" ref="dataSource" />
<property name="apiLogger" ref="apiLogger" />
</bean>
<bean id="apiLogging" class="com.mydomain.api.data.ApiLogger">
<property name="dataSource" ref="dataSource" />
</bean>
2)覆盖我的servlet的init方法,如图所示:
2) Override my servlet's init method as shown:
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
this.apiData = (ApiData)ac.getBean("apiData");
this.apiLogger = (ApiLogger)ac.getBean("apiLogger");
}
这个工作还是Spring还没准备好将bean发送到我的servlet这一点在Web应用程序中部署?我必须做一些更传统的东西,比如将豆放在 web.xml
中。
Will this work or is Spring not yet ready to deliver beans to my servlet at this point in the web applications deployment? Do I have to do something more traditional like putting the beans in web.xml
?
推荐答案
你要做的是使每个 Servlet
有自己的 ApplicationContext
实例。也许这是你想要的,但我怀疑。一个 ApplicationContext
应该是应用程序唯一的。
What you are trying to do will make every Servlet
have its own ApplicationContext
instance. Maybe this is what you want, but I doubt it. An ApplicationContext
should be unique to an application.
正确的方法是设置你的 ApplicationContext
在 ServletContextListener
。
The appropriate way to do this is to setup your ApplicationContext
in a ServletContextListener
.
public class SpringApplicationContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
sce.getServletContext().setAttribute("applicationContext", ac);
}
... // contextDestroyed
}
现在所有servlet都可以通过 ServletContext
属性访问相同的 ApplicationContext
。
Now all your servlets have access to the same ApplicationContext
through the ServletContext
attributes.
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
ApplicationContext ac = (ApplicationContext) config.getServletContext().getAttribute("applicationContext");
this.apiData = (ApiData)ac.getBean("apiData");
this.apiLogger = (ApiLogger)ac.getBean("apiLogger");
}
这篇关于Spring注入Servlet的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!