Spring - 原理篇
基本介绍
1.什么是Spring
轻量开源的JavaEE开发框架,有如下特点
- 通过依赖注入和面向接口编程,实现代码松耦合
- 侵入性较低,配置可写成配置类或者配置文件
- 使用AOP切面编程减少模板代码量,很具有代表性
- 声明式事务,代替传统的编程式事务,代码更加优雅
2.优点有哪些
轻量级:Spring在大小和透明性方面绝对属于轻量级的,基础版本的Spring框架大约只有2MB
控制反转(IOC):Spring使用控制反转技术实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象
面向切面编程(AOP): Spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来
Bean容器:Spring包含并管理应用程序对象的配置及生命周期
MVC框架:Spring的web框架是一个设计优良的web MVC框架,很好的取代了一些web框架
事务管理:Spring对下至本地业务上至全局业务(JAT)提供了统一的事务管理接口
异常处理:Spring提供一个方便的API将特定技术的异常(由JDBC, Hibernate, 或JDO抛出)转化为一致的、Unchecked异常
3.Spring中使用的设计模式
- 工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例
- 单例模式:Bean默认为单例模式
- 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术
- 模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate
- 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener
IoC容器
1.BeanFactory和ApplicationContext的区别
BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口
-
BeanFactory
访问SpringBean容器的根接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系
-
ApplicationContext
它是BeanFactory的派生,除了有原来根接口的功能以外,还有
- 支持国际化
- 提供在监听器中注册bean的事件
- 可以同时加载多个配置文件
- 统一的资源文件访问方式
- 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
两者在加载方式上:
- BeanFactory采用懒加载方式注入Bean,缺点是只有加载时才能发现错误,优点是省内存
- ApplicationContext是饿汉加载,一次性加载完整,优点是能直接发现问题,缺点是占内存
两者在创建方式上:BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建,如使用ContextLoader
两者在注册方式上:都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册
关于注册方式中的BeanPostProcessor、BeanFactoryPostProcessor:这是一个Bean生命周期的接口
2.Bean的单例实现原理
通过单例注册表的方式进行实现,这个注册表的缓存是HashMap对象
如果配置文件中的配置信息不要求使用单例,Spring会采用新建实例的方式返回对象实例,并且对象的回收交给JVM进行管理
3.Bean的生命周期
流程图
深究Spring中Bean的生命周期 - Java知音号 - 博客园 (cnblogs.com)
容器级生命周期接口方法
- InstantiationAwareBeanPostProcessor接口:此接口可以在Bean实例化前、Bean实例化后分别进行操作(因为里面有Before和After方法),也可以对Bean实例化之后进行属性操作(为BeanPostProcessor的子接口)。
- BeanPostProcessor接口:此接口的方法可以对Bean的属性进行更改。
- InstantiationAwareBeanPostProcessorAdapter:适配器类,最终实现了
BeanPostProcessor
这个顶级接口。
工厂级生命周期
在应用上下文装配配置文件之后立即调用
默认的bean是单例的,也就是说只有spring 容器关闭的时候才会销毁这些bean对象,如果声明的bea