1 Spring简介
- 轻量级容器,提供集中式,自动配置与装配应用业务对象功能
- 提供统一的事务管理抽象,基于插件式的事务管理(声明性事务管理)能够很容易的实现事务层管理,而无需了解底层事务实现
- 提供统一的数据访问抽象,包括简单和有效率的JDBC框架,极大的改进了效率(大大减少了开发的代码量)并且减少了可能的错误
- Spring的数据访问层集成了Toplink,Hibernate,JDO,and iBATIS SQL Maps等O/R mapping解决方案,其目的是提供统一的DAO支持类实现和事务管理策略
- Spring提供了一个用标准Java编写的AOP框架(也能集成AspectJ),提供基于POJOs的声明式的事务管理和其他企业事务
- 提供可以与IoC容器集成的强大而灵活的MVCWeb框架
2 Bean对象生命周期管理
1 Spring对Bean进行实例化
相当于new Class()
2 Spring将值和Bean的引用注进Bean对应的属性
3 实现BeanNameAware接口
- Spring将Bean的ID传递给setBeanName()方法
- 实现BeanNameAware主要为了通过Bean的引用获得Bean的ID,一般业务中是很少有用到Bean的ID
4 实现BeanFactoryAware接口
- Spring将调用setBeanDactory(BeanFactory bf),并把BeanFactory容器实例作为参数传入
- 实现BeanFactoryAware 主要为了获取Spring容器,如Bean通过Spring容器发布事件
5 实现ApplicationContextAwaer接口
Spring容器将调用setApplicationContext(ApplicationContext ctx),把应用上下文作为参数传入。
与BeanFactory类似都为获取Spring容器,不同是
Spring容器在调用setApplicationContext方法时会把它自己作为setApplicationContext 的参数传入
而Spring容器在调用setBeanDactory前需要程序员自己指定(注入)setBeanDactory里的参数BeanFactory
6 BeanPostProcess接口
Spring将调用它们的postProcessBeforeInitialization(预初始化)方法,在Bean实例创建成功后对进行增强处理,如对Bean进行修改,增加某个功能。
7 InitializingBean接口
为bean提供了初始化方法的方式。
只含afterPropertiesSet方法,凡是继承该接口的类,在初始化bean时会自动执行该方法。
Spring将调用它们的afterPropertiesSet方法,作用与在配置文件中对Bean使用init-method声明初始化同效,都是在Bean的全部属性设置成功后,执行的初始化方法。
实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init-method指定的方法相对来说效率要高。但init-method方式消除了对spring的依赖
若调用afterPropertiesSet方法时产生异常,则不会再调用init-method指定的方法
package org.springframework.beans.factory; /** * 所有由BeanFactory设置的所有属性都需要响应的bean的接口:例如,执行自定义初始化,或者只是检查所有强制属性是否被设置。 * 实现InitializingBean的替代方法是指定一个自定义init方法,例如在XML bean定义中。 */ public interface InitializingBean { /** * 在BeanFactory设置了提供的所有bean属性后,由BeanFactory调用。 *这个方法允许bean实例在所有的bean属性被设置时才能执行 */ void afterPropertiesSet() throws Exception; }
若class中实现该接口,在Spring Container中的bean生成之后,自动调用函数afterPropertiesSet()。
因其实现了InitializingBean接口,其中只有一个方法,且在Bean加载后就执行。该方法可被用来检查是否所有的属性都已设置好。
8 BeanPostProcess接口
Spring将调用它们的postProcessAfterInitialization(后初始化)方法,作用与6一样,只不过6是在Bean初始化前执行,而这是在Bean初始化后执行。
经过以上工作,Bean将一直驻留在应用上下文中给应用使用,直到应用上下文被销毁。
9 DispostbleBean接口
- Spring将调用它的destory方法
- 作用与在配置文件中对Bean使用destory-method属性的作用一样,都是在Bean实例销毁前执行的方法
Spring Bean是Spring应用中最最重要的部分了。所以来看看Spring容器在初始化一个bean的时候会做那些事情,顺序是怎样的,在容器关闭的时候,又会做哪些事情。
Spring容器初始化 ===================================== 调用GiraffeService无参构造函数 GiraffeService中利用set方法设置属性值 调用setBeanName:: Bean Name defined in context=giraffeService 调用setBeanClassLoader,ClassLoader Name = sun.misc.Launcher$AppClassLoader 调用setBeanFactory,setBeanFactory:: giraffe bean singleton=true 调用setEnvironment 调用setResourceLoader:: Resource File Name=spring-beans.xml 调用setApplicationEventPublisher 调用setApplicationContext:: Bean Definition Names=[giraffeService, org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#0, com.giraffe.spring.service.GiraffeServicePostProcessor#0] 执行BeanPostProcessor的postProcessBeforeInitialization方法,beanName=giraffeService 调用PostConstruct注解标注的方法 执行InitializingBean接口的afterPropertiesSet方法 执行配置的init-method 执行BeanPostProcessor的postProcessAfterInitialization方法,beanName=giraffeService Spring容器初始化完毕 ===================================== 从容器中获取Bean giraffe Name=JavaEdge ===================================== 调用preDestroy注解标注的方法 执行DisposableBean接口的destroy方法 执行配置的destroy-method Spring容器关闭
先来看看,Spring在Bean从创建到销毁的生命周期中可能做得事情。
initialization 和 destroy
有时需要在Bean属性值set好后、Bean销毁前搞事情,比如检查Bean中某个属性是否被正常设值。
Spring提供了多种方法让我们可以在 Bean 的生命周期中执行initialization和pre-destroy方法。
1 实现InitializingBean/DisposableBean接口
这两个接口都只包含一个方法:
- 实现InitializingBean#afterPropertiesSet(),可在Bean属性值设置好后操作
- 实现DisposableBean#destroy(),可在销毁Bean前操作
案例
public class GiraffeService implements InitializingBean, DisposableBean { @Override public void afterPropertiesSet() throws Exception { System.out.println("执行InitializingBean接口的afterPropertiesSet方法"); } @Override public void destroy() throws Exception { System.out.println("执行DisposableBean接口的destroy方法"); } }
这种使用比较简单,但不推荐,会将Bean实现和Spring框架耦合。