`

Spring Bean 注入 Servlet 的方法

 
阅读更多

不使用任何知名MVC框架,仅用Servlet+jsp完成View层的开发。基于接口开发测试,要集成Spring+Hibernate,遇到Spring Bean注入Servlet的问题。

在applicationContext.xml中定义数据层访问Bean:

 

<bean id="userDao" class="test.UserDaoImpl"></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<User> list = userDao.getAll();
		out.println("<html>");
		out.println("<body>");
		out.println("<pre>ID\tNAME");
		for (User u : list) {
			out.println(u.getUserId() + "\t" + u.getUserName());
		}
		out.println("</pre>");
		out.println("</body>");
		out.println("</html>");
		out.close();
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
	}
}

 很显然,如果不加处理,下面这一行一定会抛出java.lang.NullPointerException。

 

 

		List<User> 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源码中了。

分享到:
评论

相关推荐

    spring依赖注入bean

    在 Web 应用中,Spring 通常作为 Servlet 容器的一部分工作,例如 Tomcat 或 Jetty,通过 XML 配置文件或注解来定义 Bean 的配置。然而,在非 Web 的 Java 应用程序,如桌面应用或服务,我们同样可以利用 Spring 的 ...

    Java中Spring获取bean方法小结

    - **通过代码注解**:Spring也支持通过注解来获取Bean,如`@Autowired`和`@Resource`,它们能够自动将依赖注入到目标字段或方法中,无需手动从ApplicationContext获取。 3. **静态Singleton Bean Manager** 通常...

    spring jdbcTemplate 注入到servlet

    本篇文章将深入探讨`Spring JdbcTemplate`的注入以及如何在Servlet中使用它。 首先,让我们了解一下`JdbcTemplate`的基本概念。`JdbcTemplate`的核心功能包括:执行SQL查询、更新、调用存储过程等,同时提供了一套...

    获得spring里注册Bean的四种方法

    获取 Spring 里注册的 Bean 对象可以使用四种方法:继承 BaseDispatchAction、实现 BeanFactoryAware、使用 ApplicationContext、使用 @Autowired。每种方法都有其特点和应用场景,开发者可以根据实际情况选择合适的...

    Web项目中获取SpringBean与在非Spring组件中获取SpringBean.pdf

    总的来说,获取非Spring管理组件中的SpringBean主要有两种方式:一是通过实现`ApplicationContextAware`接口并存储ApplicationContext,二是使用注解和静态内部类来注入BeanFactory。这两种方法都是Spring框架提供的...

    Spring整合Servlet练习

    3. **创建Spring配置**:在指定的`contextConfigLocation`(例如`spring-servlet.xml`)中,定义Spring的bean,包括控制器、服务层、数据访问层等。 4. **编写Servlet Controller**:在Spring MVC中,Controller...

    spring 与 servlet整合

    2. **Spring的Servlet监听器**:如ContextLoaderListener,用于初始化Spring的ApplicationContext,加载配置文件并管理bean。 3. **HandlerMapping**:负责将请求映射到相应的处理器,Spring MVC提供了多种映射策略...

    Spring 管理filter 和servlet

    开发者无需在Filter或Servlet内部硬编码bean名称,而是通过Spring容器自动注入所需的依赖,大大提升了代码的整洁度和复用性。此外,Spring提供的Filter和Servlet代理类,进一步简化了集成过程,使开发者可以专注于...

    几种spring获取bean的方法.txt

    根据提供的文件信息,我们可以总结出以下关于Spring框架中获取Bean的几种方法的相关知识点: ### Spring框架简介 Spring框架是一款开源的轻量级Java EE应用程序开发框架,它通过提供一系列强大的功能来简化Java...

    在Servlet直接获取Spring框架中的Bean.docx

    以下是如何在Servlet中直接获取Spring框架中的Bean的方法。 首先,我们理解Spring容器,即ApplicationContext,它是管理Bean的核心组件。它负责读取配置文件(如XML或Java配置),创建并初始化Bean,以及维护它们...

    servlet与spring整合例子

    我们可以在Spring配置文件中定义数据源和DAO Bean,然后在Servlet中通过依赖注入获取这些DAO对象,执行数据库操作。 7. **Spring Security** 如果涉及到权限控制,Spring Security可以很方便地与Spring MVC整合,...

    springboot注入servlet的方法

    Spring Boot 注入 Servlet 的方法 Spring Boot 框架提供了多种方式来注入 Servlet,从而实现 Web 应用程序的开发。在本文中,我们将介绍 Spring Boot 注入 Servlet 的方法,并分析为什么需要使用 ...

    特殊情况(ActionForm,Servlet, Filter, Listener)下Spring如何注入对象

    1. **Servlet**: 可以在Servlet的init()方法中,通过ApplicationContextAware接口获取Spring上下文,然后手动从上下文中获取依赖的bean。 2. **Filter**: 同样,可以在Filter的init()方法中获取ApplicationContext...

    spring+servlet 入门hello_world

    在IT领域,Spring框架和Servlet技术是Web开发中的重要组成部分,尤其对于初学者而言,"spring+servlet 入门hello_world"是一个极好的起点。这个实例将帮助你理解这两个技术的基础概念以及它们如何协同工作来构建一个...

    spring管理servlet的利器--SimpleServletHandlerAdapter

    `SimpleServletHandlerAdapter`主要适用于以下场景:你有一个已经存在的Servlet,而你不想或者不能通过Spring MVC的注解来管理它,但是又想利用Spring的依赖注入和AOP特性。通过配置`SimpleServletHandlerAdapter`,...

    原生Servlet与Spring Controller性能比较--Servlet项目

    3. **资源利用率**:Spring MVC利用IoC容器管理Bean,可减少内存占用,而原生Servlet可能创建更多的临时对象。 4. **扩展性和可维护性**:Spring MVC提供了更好的模块化和解耦,使得添加新功能、调整逻辑、单元测试...

    第一章 Spring4 简介及获取Bean

    4. **setter方法注入**:使用`@Autowired`注解在setter方法上,Spring会在运行时调用setter方法注入Bean。 **Spring框架的组件** Spring框架由多个模块组成,包括: 1. **Core Container**:包括Core和Beans模块...

    servlet+hibernate+spring实现添删改查

    【标题】"servlet+hibernate+spring实现添删改查"是一个常见的Web开发教程主题,它涵盖了Java后端开发中的三个核心框架:Servlet、Hibernate和Spring。这个主题主要针对初学者,旨在帮助他们理解如何整合这三个技术...

    详解Spring中bean的作用域

    Prototype 作用域是指每一次请求(将其注入到另一个 bean 中,或者以程序的方式调用容器的 getBean()方法)都会产生一个新的 bean 实例,相当于一个 new 的操作。对于 prototype 作用域的 bean,有一点非常重要,那...

Global site tag (gtag.js) - Google Analytics