不使用任何知名MVC框架,仅用Servlet+jsp完成View层的开发。基于接口开发测试,要集成Spring+Hibernate,遇到Spring Bean注入Servlet的问题。
在applicationContext.xml中定义数据层访问Bean:
UserDaoImpl是一个使用Hibernate访问数据库的类,包括了一些简单增删改查的方法,如getAll(),save()等
MyServlet.java代码如下:
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public MyServlet() {
super();
}
public void init(ServletConfig config) throws ServletException {
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
List list = userDao.getAll();
out.println("");
out.println("");
out.println("ID\tNAME");
for (User u : list) {
out.println(u.getUserId() + "\t" + u.getUserName());
}
out.println("
");
out.println("");
out.println("");
out.close();
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
}
}
很显然,如果不加处理,下面这一行一定会抛出java.lang.NullPointerException。
List list = userDao.getAll();
解决方法一:
在Servlet的init方法中增加以下代码,即可通知Servlet在启动时,自动查找userDao Bean并装配。
public void init(ServletConfig config) throws ServletException {
ServletContext servletContext = config.getServletContext();
WebApplicationContext webApplicationContext = WebApplicationContextUtils
.getWebApplicationContext(servletContext);
AutowireCapableBeanFactory autowireCapableBeanFactory = webApplicationContext
.getAutowireCapableBeanFactory();
autowireCapableBeanFactory.configureBean(this, "userDao");
}
可是下面这一行需要将Bean Name硬编码到java源码中,让我很不爽。
autowireCapableBeanFactory.configureBean(this, "userDao");
解决办法二(推荐):
还是在Servlet的init方法中增加以下代码。
public void init(ServletConfig config) throws ServletException {
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
config.getServletContext());
}
并且在变量userDao上一行增加@Autowired
@Autowired
private UserDao userDao;
这样,就不用硬编码Bean Name到java源码中了。
后续:
本文主要解决的是在Servlet注入Spring Bean,对于在Servlet中载入Spring Bean的方法不在考虑范围之内。
还有一些文章写的太抽象,我没能看懂:-(:
1、http://blog.csdn.net/lifetragedy/article/details/6320428
2、http://andykayley.blogspot.com/2008/06/how-to-inject-spring-beans-into.html
由于该文章寄存在blogspot.com,不幸被伟大的党“河蟹”了。所以贴在这里,期盼谁能够帮助解释一下!
http://andykayley.blogspot.com/2008/06/how-to-inject-spring-beans-into.html