直接注入servlet,而不是新的ClassPathXmlApplicationContext



我有一个包含许多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

您可以将SerlvetContextListenerServlet#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
}

相关内容

  • 没有找到相关文章

最新更新