我想在扩展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?
答案 0 :(得分:2)
现在我的理解是我的Servlet(在web.xml中定义)不受管理 通过Spring,我的DAO依赖性没有被正确注入
那是对的。 Servlet
是由Servlet容器管理的组件。 @Controller
bean是由Spring管理的组件。它们是两个(通常)相互矛盾的概念。你应该将它们分开。
由于@Controller
只是一个注释,因此您可以拥有类型为@Controller
的{{1}} bean,但Servlet容器不会管理或使用它(反之亦然)。
如果您想要一个具有注射目标的HttpServlet
,您可以使用提供的解决方案here。
答案 1 :(得分:0)
另一种更轻量级的解决方案基于HttpRequestHandler
。有关详细讨论,请参阅this blog。