简单东西-SpringMVC注入Bean的简单知识
来源:互联网 发布:卖家淘宝账目在哪里 编辑:程序博客网 时间:2024/05/17 00:52
近期重构项目代码,在整理基于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 */@Servicepublic abstract class AEventHandler implements IEventHandler{@Autowiredprivate HandlerDispatcher requestHandler;@PostConstructpublic 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{@Autowiredprivate 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注入Bean的简单知识
- 简单东西-SpringMVC注入Bean的简单知识
- 简单东西-小知识
- Spring中Bean的简单属性注入
- Springmvc注解注入的简单demo
- 大牛的博客里面好东西简单易用长知识
- 简单模拟spring装载注入bean原理
- springMVC注入bean的流程,源码
- 简单的参数注入
- 简单的故障注入
- 简单的DLL注入
- Spring的简单注入
- 简单的sql注入
- 使用XPath解析xml实现简单的Spring IOC完成bean的依赖注入
- 越来越喜欢简单的东西
- 简单东西-String的format
- 简单的分东西算法
- [Java] Spring 3.0 /id.vs.name/简单属性的注入/bean中的scope属性/集合注入/自动装配/生命周期/
- android动画-Property Animation
- Android:用ViewPager实现广告栏
- 围棋棋手、电影、境界层次
- iOS横竖屏设置
- 简单介绍SQL Server中索引使用及维护
- 简单东西-SpringMVC注入Bean的简单知识
- 【Serious Game】笔记1
- Java NIO、NIO.2学习笔记
- OC 解决NSArray、NSDictionary直接打印中文出现乱码的问题
- 控制台IO操作函数
- nginx---配置文件中根据来源IP,定向访问
- [开心学php100天]第五天:与基本功搞一搞基(上)
- UDP广播原理简介
- Eclipse或MyEclipse不能编译java文件