在HttpServlet上自动装配

时间:2014-07-07 19:31:06

标签: java spring servlets

我想在扩展HttpServlet的类上注入DAO依赖,这是否可能?我不想手动从Application Context获取依赖关系,但是如果可能的话,我可以在我的Servlet实例上获得真正的依赖注入。我尝试用@Controller注释我的Servlet:

@Controller
public class ItemsController extends HttpServlet {

    @Autowired
    private IItemDAO itemDAO;


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<Item> items= itemDAO.getItems();
        req.setAttribute("items", items);
        gotoPage("/jsp/itemList.jsp", req, resp);
    }

    protected void gotoPage(String address, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(address);
        dispatcher.forward(request, response);
    }

}

我的申请背景:

<context:annotation-config />
    <context:component-scan base-package="com.test.controller" />
    <bean id="itemsController" class="com.test.controller.ItemsController " />
    <bean id="itemDAO" class="com.test.dao.ItemDAO" />

现在我的理解我的Servlet(在web.xml中定义)不是由Spring管理的,所以我的DAO依赖关系没有被正确注入,我怎样才能让Spring管理这个bean?

2 个答案:

答案 0 :(得分:2)

  

现在我的理解是我的Servlet(在web.xml中定义)不受管理   通过Spring,我的DAO依赖性没有被正确注入

那是对的。 Servlet是由Servlet容器管理的组件。 @Controller bean是由Spring管理的组件。它们是两个(通常)相互矛盾的概念。你应该将它们分开。

由于@Controller只是一个注释,因此您可以拥有类型为@Controller的{​​{1}} bean,但Servlet容器不会管理或使用它(反之亦然)。

如果您想要一个具有注射目标的HttpServlet,您可以使用提供的解决方案here

答案 1 :(得分:0)

另一种更轻量级的解决方案基于HttpRequestHandler。有关详细讨论,请参阅this blog