直接注入servlet而不是新的ClassPathXmlApplicationContext

时间:2013-07-10 13:41:35

标签: java applicationcontext spring-bean

我有一个包含许多servlet的大型java项目。并且每个servlet都需要 使用以下命令从同一个bean文件中获取对象:

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

然后我用

     context.getBean("<BEAN_NAME">);

其中一些人甚至需要获得相同的物品。

问题是,是否可以直接将我想要的对象注入servlet,而无需手动读取bean文件。

每个servlet都在web.xml中配置。

有关此问题的任何信息将不胜感激!

感谢

3 个答案:

答案 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之间共享。

<强>参考文献: