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

近期重构项目代码,在整理基于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的子类就不能重写该方法了。

时间: 2024-08-15 01:19:48

简单东西-SpringMVC注入Bean的简单知识的相关文章

使用Maven搭建简单的SpringMVC

之前想用Maven搭建个简单的SpringMVC框架,一直没成功,上网搜索了好多,不知道是自己操作的问题还是怎么,就是报错,或者运行不了. 今天偶得一篇教程,写的极好.晚上试着自己从新来一遍. 一. 安装SpringMVC所需jar包 配置pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&quo

springmvc学习笔记(11)-springmvc注解开发之简单参数绑定

springmvc学习笔记(11)-springmvc注解开发之简单参数绑定 springmvc学习笔记11-springmvc注解开发之简单参数绑定 spring参数绑定过程 默认支持的类型 简单类型 pojo绑定 自定义参数绑定实现日期类型绑定 springmvc和struts2的区别 本文主要介绍注解开发的简单参数绑定,包括简单类型.简单pojo以及自定义绑定实现类型转换 spring参数绑定过程 从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到contro

SpringMVC入门配置和简单实现

web.xml的配置 <!-- springmvc中央控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-n

简单的springmvc配置

1.配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/n

Springmvc整合tiles框架简单入门示例(maven)

Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积分下载): http://download.csdn.net/detail/zhangbing2434/9435460(这里用的是Idea,eclipse,导入的时候可能会有些差异) 1.tiles依赖的jar包:     maven代码: <dependency> <groupId>

SpringMVC注入Spring的bean

一.Spring和SpringMVC两个IOC容器有什么关系呢? Spring的IOC容器包含了SpringMVC的IOC,即SpringMVC配置的bean可以调用Spring配置好的bean,反之则不可以 如果SpringMVC想通过@Autowired注入Spring容器里的属性,即使Spring配置文件已经配置好了 <context:component-scan base-package="com.wzy"></context:component-scan&g

简单的SQL注入学习

引贴: http://blog.163.com/lucia_gagaga/blog/static/26476801920168184648754/ 首先需要编写一个php页面,讲php页面放入/opt/lampp/htdocs目录下: 解释一下这个页面: 1.通过if语句判断变量是否初始化 2.if语句中通过mysql_connect()函数连接数据库 3.连接数据库成功后,选择一个数据库 4.选择完数据库后执行一条mysql查询 5.进行查询结果的处理 6.使用echo讲查询结果输出,便于查看

简单的sql注入

另一种简单的sql注入

PHP中 简单的SQL注入分析

SQL注入原理:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 以下介绍SQL注入方式: 首先建表如下: 1 create database sqltest charset utf8 2 3 create table test ( 4 id int,5 name varchar(10), 6 age tinyint unsigned7 )engine=myisam charset=utf8 插入数据如下 我们分成字段为数值类型和