我有一个包含许多servlet的大型java项目。并且每个servlet都需要使用以下命令从同一个bean文件中获取对象:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
然后我用
context.getBean("<BEAN_NAME">);
其中一些甚至需要得到相同的对象。
问题是,是否可以将我想要的对象直接注入servlet,而无需手动读取bean文件。
每个servlet都在web.xml中配置。
任何有关该问题的信息都将不胜感激!
感谢
您是否考虑过让servlet实现HttpRequestHandler?
然后,您必须将Servlet声明为名为Springbean,并在web.xml上使用相同的名称,然后您可以简单地使用@Autowired注释在Servlet 中注入Springbean
更多信息,请访问http://www.codeproject.com/Tips/251636/How-to-inject-Spring-beans-into-Servlets
样本代码:
@Component("myServlet")
public class MyServlet implements HttpRequestHandler {
@Autowired
private MyService myService;
...
示例web.xml
<servlet>
<display-name>MyServlet</display-name>
<servlet-name>myServlet</servlet-name>
<servlet-class>org.springframework.web.context.support.HttpRequestHandlerServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/myurl</url-pattern>
</servlet-mapping>
由于您有一个web应用程序,我会使用包含在spring-web
中的WebApplicationContext
,它在web应用程序的部署时加载,并在取消部署时正确关闭。您所要做的就是在web.xml
:中声明ContextLoaderListener
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
然后,您可以从任何servlet访问ApplicationContext
:
ApplicationContext ctx = WebApplicationContextUtils
.getRequiredWebApplicationContext(getServletContext());
MyBean myBean = (MyBean) ctx.getBean("myBean");
myBean.doSomething();
优点是,您的上下文在所有servlet之间共享。
参考文献:
- 如何获取默认的WebApplicationContext
- ContextLoaderListener的集成
- WebApplicationContextUtils Javadoc
您可以将SerlvetContextListener
与Servlet#init()
方法一起使用。当servlet容器创建servlet上下文时,它将在任何ServletContextListener
上调用contextInitialized()
,您可以在其中初始化应用程序singletons/beans/等。
public class YourServletContextListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent event) {
// clear context
}
@Override
public void contextInitialized(ServletContextEvent event) {
// initialize spring context
event.getServletContext().setAttribute("context", springContext);
}
}
该上下文(servlet上下文)中的所有servlet都可以访问这些属性。
在Servlet init()
方法中,您只需获得属性
public class YourServlet implements Servlet {
@Override
public void init(ServletConfig config) {
config.getServletContext().getAttribute("context");
// cast it (the method returns Object) and use it
}
// more
}