我有一个包含许多servlet的大型java项目。并且每个servlet都需要 使用以下命令从同一个bean文件中获取对象:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
然后我用
context.getBean("<BEAN_NAME">);
其中一些人甚至需要获得相同的物品。
问题是,是否可以直接将我想要的对象注入servlet,而无需手动读取bean文件。
每个servlet都在web.xml中配置。
有关此问题的任何信息将不胜感激!
感谢
答案 0 :(得分:2)
您是否考虑过让您的servlet实现HttpRequestHandler?
然后你必须将你的Servlet声明为名为Spring bean并在web.xml上使用相同的名称,然后你可以简单地使用@Autowired注释在你的Servlet中注入你的Spring bean
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>
答案 1 :(得分:1)
您可以使用Servlet#init()
方法SerlvetContextListener
。当您的servlet容器创建servlet上下文时,它将在任何contextInitialized()
上调用ServletContextListener
,您可以在其中执行应用程序单例/ bean / etc的初始化。
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
}
答案 2 :(得分:1)
由于您有一个Web应用程序,我会使用WebApplicationContext
中包含的spring-web
,它在您的Web应用程序的部署时加载,并在取消部署时正确关闭。您所要做的就是在ContextLoaderListener
:
web.xml
<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之间共享。
<强>参考文献:强>