从web.xml初始化一个spring bean

时间:2012-04-13 13:37:57

标签: spring java-ee

我正在更新使用Spring的现有Java EE Web应用程序。

在我的web.xml中,有一个servlet定义如下:

  <servlet>
    <display-name>My Example Servlet</display-name>
    <servlet-name>MyExampleServlet</servlet-name>
    <servlet-class>com.example.MyExampleServlet</servlet-class>
  </servlet>

现在,在这个课程中,我需要添加一个@Autowite注释:

class MyExampleServlet extends HttpServlet {
    @Autowired (required = true)
    MyExampleBean myExampleBean;

    [...]
}

问题是MyExampleBean是由Application Server初始化的 (在我的例子中,weblogic.servlet.internal.WebComponentContributor.getNewInstance ...)

所以,Spring并没有意识到这一点,并且Spring没有机会连接“myExampleBean”。

如何解决? 也就是说,我需要如何修改web.xml或MyExampleServlet以便MyExampleServlet获取对myExampleBean的引用?

可能是在MyExampleServlet中添加此初始化代码, 但它需要引用servletContext。如何获取对servletContext的引用?

ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
myExampleBean = (MyExampleBean) context.getBean("myExampleBean");

2 个答案:

答案 0 :(得分:2)

我看,HttpServlet / GenericServlet有一个getServletContext()方法, (并且应用程序服务器首先调用servlet的init(ServletConfig配置),config包含对servletContext的引用)。

请参阅http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/GenericServlet.html

修改了代码:

class MyExampleServlet extends HttpServlet {
    MyExampleBean myExampleBean;

    @Override
    public void init() throws ServletException {
        ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
        myExampleBean = (MyExampleBean) context.getBean("myExampleBean");
    }

    [...]
}

答案 1 :(得分:0)

在您的应用程序上下文xml中,您需要类似

的内容
<bean id="myExampleBean" class="path/to/myExampleBean">