前言:
本块文章会通过连载的方式来深入了解和学习Spring相关核心技术和实现原理。包括Spring的Bean生命周期管理,声明性事务管理,AOP管理,注解应用实现,以及在其上面进行扩展的相关应用进行介绍。
本篇技术文章将作为Spring入门篇。
什么是Spring开发框架?
Spring 是一个基于Java/JavaEE的应用开发平台。其实现是由作者Rod Johnson在2002年出版《Expert One-on-One J2EE Design and Development》一书后,总结经验后,研发而成。
Spring的核心内容包括:
1. 轻量级的容器, 提供集中式,自动配置与装配应用业务对象功能。
Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spring的架构基础是基于使用POJO对象管理的 Inversion of Control(控制反转)容器,提供非侵入的方式为当前一些复杂的系统应用提供松耦合,一致性的业务对象配置管理。容器以快捷开发为出发点,方便开发中 的可测试性和部署时的可扩展性为目的。实现只针对单个业务组件在独立环境的下进行开发与测试,在部署时再集成到任意的Java SE或Java EE环境中。
2. 提供了唯一的事务管理抽象,基于插件式的事务管理(声明性事务管理)能够很容易的实现事务层管理,而无需了解各种底层事务实现,例如JTA或者 JDBC事务提供一个一致的编程模型。相对于只依赖Java EE环境的普通的JTA或EJB CMT方式, Spring就更简单轻便了。
3. 提供了唯一的数据访问抽象,包括简单和有效率的JDBC框架,极大的改进了效率(大大减少了开发的代码量)并且减少了可能的错误。基于JDBC的异常信息也是完全遵循Spring的公共DAO异常层级。
4. Spring的数据访问层集成了Toplink, Hibernate, JDO, and iBATIS SQL Maps等 O/R mapping解决方案,其目的是提供统一的DAO支持类实现和事务管理策略。尤其Hibernate对SpringIOC特性的支持,能更好的实现集 成,以更好的利用Spring的公共事务与DAO异常层级。
5. Spring提供了一个用标准Java编写的AOP框架(也能集成AspectJ),提供基于POJOs的声明式的事务管理和其他企业事务--如果你需要 还能实现你自己的aspects。这个框架足够强大,使得应用程序能够抛开EJB的复杂性,同时享受着和传统EJB相关的关键服务。当然也可以选择不支持 JTA方式的开发,尤其如不支持JTA的Tomcat服务器下开发单数据库应用。
6. 提供可以与IoC容器集成的强大而灵活的MVC Web框架. 其本身通过提供策略接口与多视图支持技术(如JSP, Velocity模块引擎, Tiles, iText和POI)实现框架的高可配置性。 Spring作为中间层也可以很容易的与其它第三方web MVC框架实现集成,如Struts,WebWork,Struct2(Struts与WebWork的集成)和Tapestry.
Spring bean对象生命周期管理
Spring bean对象的生命周期管理包括Bean的创建装配和Bean的销毁两个过程。在了解Spring bean对象生命周期管理内容之前,首先来整理一下Spring对每个Bean进行管理扩展接口有哪些?
BeanNameAware
Spring在注册当前Bean到容器中时,会把当前Bean的Id值作为参数回调用到该接口方法
BeanClassLoaderAware
Spring在注册当前Bean到容器中时,会把当前Bean Class所属的ClassLoader对象作为参数回调该接口方法
BeanFactoryAware
Spring在注册当前Bean到容器中时,会把当前Bean对象所属的BeanFactory工厂对象实例作为参数回调该接口方法
ResourceLoaderAware
Spring在注册当前Bean到容器中时,会把ResourceLoader对象实例作为参数回调该接口方法. ResourceLoader对象方便的提供基于Classpath方式的Resource文件查找和定位功能。例如:
Resource template = rl.getResource("some/resource/path/myTemplate.txt");
ApplicationEventPublisherAware
Spring在注册当前Bean到容器中时,会把ApplicationEventPublisher对象实例作为参数回调该接口方法. ApplicationEventPublisher对象用于对所有监听ApplicationListener接口事件的对象,发布ApplicationEvent事件。
MessageSourceAware
Spring在注册当前Bean到容器中时,会把MessageSource对象实例作为参数回调该接口方法. MessageSource用于处理Spring的信息资源对象,如国际化信息处理
ApplicationContextAware
Spring在注册当前Bean到容器中时,会把ApplicationContext对象实例作为参数回调该接口方法.
ServletContextAware
Spring在注册当前Bean到容器中时,会把ServletContext对象实例作为参数回调该接口方法. 这个只在基于Web的ApplicationContext才会启用
BeanPostProcessors
Spring在对Bean象进行实例化前后,回调相应的方法。
InitializingBean
Spring容器完成Bean对象所有properties属性的依赖装配后,回调该接口方法。
DisposableBean
Spring容器在执行关闭操作时,对Bean对进行销毁前,回调该接口方法
了解相关的生命周期管理接口概念后,下面就比较容易整理Spring的Bean创建和销毁的整个调用过程:
Spring Bean创建过程如下:
1 |
触发 BeanNameAware 的setBeanName方法 |
2 |
触发BeanClassLoaderAware的setBeanClassLoader方法 |
3 |
触发BeanFactoryAware's setBeanFactory |
4 |
触发ResourceLoaderAware's setResourceLoader (only applicable when running in an application context) |
5 |
触发ApplicationEventPublisherAware的setApplicationEventPublisher方法 (只在由application context启动时工作) |
6 |
触发MessageSourceAware的 setMessageSource 方法(只在由application context启动时工作) |
7 |
触发ApplicationContextAware'的setApplicationContext方法 (只在由application context启动时工作) |
8 |
触发ServletContextAware的setServletContext 方法(只web application context下启用) |
9 |
触发BeanPostProcessors的postProcessBeforeInitialization方法 |
10 |
触发InitializingBean的 afterPropertiesSet方法 |
11 |
触发用户在XML文件中配置的”init-method” 指定的方法名。不指定则跳过 |
12 |
触发BeanPostProcessors 的postProcessAfterInitialization 方法 |
Spring Bean销毁过程如下:
1 |
触发 DisposableBean的destroy方法 |
2 |
触发用户在XML文件中配置的” destroy-method” 指定的方法名。不指定则跳过 |
至此Spring Bean生命周期管理的核心内容的介绍就到这里。
本章节完 .Good Luck!
Yours Matthew!