简单东西-SpringMVC注入Bean的简单知识

原创 2015年01月15日 15:30:45

       近期重构项目代码,在整理基于SpringMVC技术的应用代码过程中,对SpringMVC的注解的原理进行了简单的验证。通常情况下,我们自定义的类使用SpringMVC的注解,而且没有在spring-servlet.xml配置中作任何特殊设置的话,Bean的实例化过程是怎么样的呢?

      1 单例

          默认情况下,使用@Autowire注入的类型相同的成员变量,引用的都是同一个对象,而且该成员变量的注入并不是通过调用类的setXX方法设置的。例如,具有Service注解且都引用同一个类型的两个类,经验证他们的引用成员是同一个实例(==操作为true),源码如下:

/**
 * 
 * @title       :AEventHandler
 * @description :事件处理类的顶层抽象
 * 	        它依赖一个被观察者HandlerDispatcher并且在构造时就注册添加事件
 * @update      :2015-1-15 下午1:19:05
 * @author      :wang_ll
 * @version     :1.0.0
 * @since       :2015-1-15
 */
@Service
public abstract class AEventHandler implements IEventHandler{
	@Autowired
	private HandlerDispatcher requestHandler;

	@PostConstruct
	public void initRequestHandler(){
		if(this.requestHandler!=null){
			this.requestHandler.addEventHandler(this);
			System.out.println("add msgService OK");
		}else{
			System.out.println("add msgService bad");
		}
	} 

	public void setRequestHandler(HandlerDispatcher requestHandler) {
		this.requestHandler = requestHandler;
		if(this.requestHandler!=null){
			this.requestHandler.addEventHandler(this);
		}
	}
	public HandlerDispatcher getRequestHandler() {
		return requestHandler;
	}
	
}

/**
 * 
 * @title       :AMsgHandler
 * @description :消息处理类的顶层抽象类
 * @update      :2015-1-15 下午1:22:26
 * @author      :wang_ll
 * @version     :1.0.0
 * @since       :2015-1-15
 */
public abstract class AMsgHandler implements IMsgHandler{
	@Autowired
	private HandlerDispatcher requestHandler;

	@PostConstruct
    	public void initRequestHandler(){
		if(this.requestHandler!=null){
			this.requestHandler.addMsgHandler(this);
			System.out.println("add msgService OK");
		}else{
			System.out.println("add msgService bad");
		}
	} 
	
	public HandlerDispatcher getRequestHandler() {
		return requestHandler;
	}

	public void setRequestHandler(HandlerDispatcher requestHandler) {
		this.requestHandler = requestHandler;
		if(this.requestHandler!=null){
			this.requestHandler.addMsgHandler(this);
			System.out.println("add msgService OK");
		}else{
			System.out.println("add msgService bad");
		}
	}
}

        项目启动结果表明,这两个类的成员requestHandler是同一个对象的引用;并且这个成员的初始化过程并不是通过setRequestHandler()方法完成的。注解@PostConstruct标识的方法会在整个类被实例化完成后(包括成员变量的初始化)会被执行。在initRequestHandler方法中引用成员变量requestHandler时,它已经被实例化了,所以会进入非空分支。这个注解非常好,对于依赖成员变量的操作来说。

      2 注解的范围

         Spring的配置文件applicationContext.xml中定义的bean默认是立即加载的,在Spring容器启动时,就会实例化配置文件中所有的Bean,包括组件扫描包里面的注解类;而SpringMVC配置文件中的注解类只会实例化Action即Controller注解的类及其依赖的类。如果定义spring配置文件applicationContext.xml包含如下扫描配置:

<beans>
	<context:annotation-config />
	<context:component-scan base-package="com.wood.controller" />
	<context:component-scan base-package="com.wood.dao" />
	<context:component-scan base-package="com.bh.wexin.service" />
	<context:component-scan base-package="com.bh.wexin.action" />
        <import resource="dbConfig.xml" />    
</beans>

          则容器启动时,被扫描的包中,所有具有注解的类都会被实例化的。但是,如果上述扫描配置是定义在SpringMVC的配置文件spring-servlet.xml中,则在容器启动完成时,只有Action类会被初始化并加载到内存(即@Controller注解的类及其依赖类被实例化了)。

         这说明SpringMVC的注解扫描范围和实例化的类的范围是不一样的,在项目开发中控制SpringMVC配置文件中扫描包的范围,可以避免不必要的类被初始化。

      3 继承的简单知识

         子类重写父类的方法时,不能改变方法签名包括访问权限标识、返回值、参数等,但是可以添加final修饰符,使得某些方法不能再被其子类重写。简单的例子:如A定义了方法public void a();而B继承A,且重写方法a为public final void a(),这种语义是合法的。这样的话,B的子类就不能重写该方法了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

springMVC学习(注解实现依赖注入)

上一篇博客,学习了spring的依赖注入,即利用spring容器来为类中的属性赋值,分为两种赋值方法,利用set和利用构造方法,我们都知道,如果我需要为某一个属性赋值的话,必须为该属性写上set方法,...
  • mockingbirds
  • mockingbirds
  • 2015年04月30日 21:57
  • 9774

spring注解自动注入bean

Spring mvc注解用到的配置: 这样的话,在com包及其所有子包下的所有类如果含有@Component、@Controller、@Se...
  • lmb55
  • lmb55
  • 2016年01月16日 23:05
  • 1430

Spring注解自动注入Bean

我们知道采用Spring注解时,配置如下: 这样的话,在com包及其所有子包下的所有类如果含有@Component、@Controller、@Service、@Repository等注解...
  • wangpeng047
  • wangpeng047
  • 2013年04月30日 09:10
  • 18732

如何使用spring的autowire为servlet注入bean

在应用中一般普通的JavaPojo都是由Spring来管理的,所以使用autowire注解来进行注入不会产生问题,但是有两个东西是例外的,一个是 Filter,一个是Servlet,这两样东西都是由S...
  • yaerfeng
  • yaerfeng
  • 2012年03月19日 13:34
  • 7104

springMVC的bean注入问题以及IOC容器

1. Spring的IOC容器包含了SpringMVC的IOC, 2. 使用注解可以自动将bean放入到IOC容器中...
  • Elliottx
  • Elliottx
  • 2016年12月11日 02:28
  • 1010

Spring MVC中使用@Autowired实现自动注入

本文在上篇中已经实现的基于注解的Spring MVC程序中使用@Autowired自动注入一个java bean的service对象。 1、下载并导入之前已经实现的基于注解的Spring M...
  • yxtouch
  • yxtouch
  • 2015年09月15日 16:46
  • 9112

Spring定义bean的三种方式和自动注入

前言:随着一个项目规模的增大,我们不得不引入许多Java bean对象,而这些对象一般来说是在Spring的配置文件applicationContext.xml中进行配置的,这样就声明了这是一个由Sp...
  • sinat_34596644
  • sinat_34596644
  • 2016年11月08日 10:52
  • 19026

Spring 解析httpServletRequest注入参数到Bean的拦截包装

此文并非专业文章,只是随记。相关类: BeanWrapperImplModelAttributeMethodProcessor.resolveArgument()ServletRequestData...
  • zhanlanmg
  • zhanlanmg
  • 2015年12月09日 11:05
  • 2487

spring 子类覆盖父类中注入的bean

我们在设计程序框架的时候,会设计一个抽象基类,子类继承这个基类,共有的方法放到基类中去,使用spring后使代码变的很简单,现在遇到的问题是在基类中注入bean后,子类不可能都会是有这个bean,那么...
  • u010370082
  • u010370082
  • 2016年01月19日 10:56
  • 4533

SpringMVC 源代码深度解析 IOC容器(Bean实例化和依赖注入)

SpringMVC最核心的IOC的控制反转,动态的向某个对象提供它所需要的其他对象,例如:对象A时,需要对象B时,这时不像以前我们之前要在A对象里实例化B对象,这时B对象的实例化由IOC容器会主动创建...
  • congcong68
  • congcong68
  • 2014年10月31日 14:56
  • 3987
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单东西-SpringMVC注入Bean的简单知识
举报原因:
原因补充:

(最多只允许输入30个字)