简单东西-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方法,...

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

1. Spring的IOC容器包含了SpringMVC的IOC, 2. 使用注解可以自动将bean放入到IOC容器中...

SpringMVC从request到controller过程详解

例行推广一下我的博客,喜欢这篇文章的朋友可以关注我的博客http://zwgeek.com 之前一篇文章 SpringMVC对象绑定时自定义名称对应关系 讲了如何去把request中的请求参数指定到...
  • zgzczzw
  • zgzczzw
  • 2016年12月30日 14:56
  • 4439

4种方法让SpringMVC接收多个对象

问题背景: 我要在一个表单里同时一次性提交多名乘客的个人信息到SpringMVC,前端HTML和SpringMVC Controller里该如何处理? 第1种方法:表单提交,以字段数组接收; 第2种...

springMVC项目启动时出现bean注入失败的情况:Error creating bean with name 'XXX': Injection of autowired dependencies

最近这两天我在学习springMVC的时候,遇到了一个难以解决的问题,就是在启动tomcat的时候,控制台里老是报这一句错: org.springframework.beans.factory.Bea...

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

近期重构项目代码,在整理基于SpringMVC技术的应用代码过程中,对SpringMVC的注解的原理进行了简单的验证。通常情况下,我们自定义的类使用SpringMVC的注解,而且没有在spring-s...
  • lsm135
  • lsm135
  • 2016年11月13日 23:16
  • 2230

bootstrap 下拉更换样式。

最近在写点击下拉选 更改样式。找到了bootstrap的下拉选。 首先准备工作,下载bootstrap min.js 和 bootstrap min.css 这两个文件 然后引入项目、在你...

黑马程序员_终于找全了,Eclipse使用技巧!!!

1. ctrl+shift+r:打开资源     这可能是所有快捷键组合中最省时间的了。这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如appli...

简单东西-小知识

1 上周JSP页面报异常的原因是:代码没有问题,问题是测试过程中直接操作DB插入一个用户后导致的 页面获取该用户对象的某个属性返回空指针了。不是开发环境问题。。。。。。。。。。 结论:问题的源头都...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单东西-SpringMVC注入Bean的简单知识
举报原因:
原因补充:

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