Spring
1. Spring 是什么?
Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
2. Spring IoC
1. IoC 是什么
Ioc 全称是 Inversion of Control 即“控制反转”,一种设计思想。
Ioc就是由容器来负责控制对象的生命周期和对象间的关系。IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。
IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。
2. DI 是什么
DI 全称 Dependency Injection,即“依赖注入”,一种思想。
DI就是由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。
3. IoC 和 DI
IoC和DI由什么关系呢?其实DI是Ioc具体实现的其中一种方式。
由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的概念:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。
4. IoC 容器
IoC 容器是 Spring 框架的核心。容器可以解析XML配置文件,通过java反射机制将对象创建出来,设置它们的依赖关系,并管理它们的整个生命周期从对象创建到销毁。
Application Context 是 spring 中较高级的容器。它可以加载配置文件中定义的 bean,将所有的 bean 集中在一起,当有请求的时候分配 bean。
常用的 ApplicationContext 接口实现类:
-
FileSystemXmlApplicationContext
:从本地文件系统中加载XML文件,使用该实现类时需要指定配置文件在磁盘中的绝对路径。 -
ClassPathXmlApplicationContext
:从 CLASSPATH 环境变量加载XML文件,需指定XML文件的文件名,该实现类会从CLASSPATH中搜索,找到指定的文件。 -
WebXmlApplicationContext
:在web应用中使用,该实现类可以加载Servlet响应的XML文件。
2. Spring bean
1. Spring bean是什么
bean 是Spring IoC容器所管理的对象,在容器中被实例化,组装。bean 由XML文件的配置元数据创建。
2. bean 的xml配置
bean的基本语法:
<bean id="对象引用" class="完整类名" scope="对象作用域"></bean>
bean有以下常用属性:
-
id 和 name
都可以用来指定对象的引用名称,id和name 可以同时存在,同时存在时id的值不能为空。id或name必须指定其中的一个。
-
class
这个属性是必须的,用来指定创建的对象的完整类名。
-
scope
指定对象的作用域。有
singleton
,prototype
,request
,session
这四个值,默认值是singleton
。 -
factory-method
指定使用静态工厂方式实例化对象时调用的静态工厂方法
-
factory-bean
指定使用实例工厂方式实例化对象时使用的实例工厂类
-
autowiring
指定bean自动装配的模式。
-
lazy-init
指定是否使用延迟加载模式。
-
initialization
指定对象初始化时执行构造器后回调的方法名称。
-
destruction 方法
指定对象销毁后回调的方法名称。
4. bean 的作用域
bean的scope可以指定对象的作用域,有四种取值:
- singleton:指定对象是单例模式
- prototype:指定对象是多例模式
- request:指定对象的作用域在request请求中,在web应用中有效
- session:指定对象的作用域在session中,在web应用中有效
5. bean 的生命周期
bean 的生命周期如图所示:

生命周期执行的过程如下:
- spring对bean进行实例化,默认bean是单例
- spring对bean进行依赖注入
- 如果bean实现了BeanNameAware接口,spring将bean的id传给setBeanName()方法
- 如果bean实现了BeanFactoryAware接口,spring将调用setBeanFactory方法,将BeanFactory实例传进来
- 如果bean实现了ApplicationContextAware()接口,spring将调用setApplicationContext()方法将应用上下文的引用传入
- 如果bean实现了BeanPostProcessor接口,spring将调用它们的postProcessBeforeInitialization接口方法
- 如果bean实现了InitializingBean接口,spring将调用它们的afterPropertiesSet接口方法,类似的如果bean使用了init-method属性声明了初始化方法,改方法也会被调用
- 如果bean实现了BeanPostProcessor接口,spring将调用它们的postProcessAfterInitialization接口方法
- 此时bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁
- 若bean实现了DisposableBean接口,spring将调用它的distroy()接口方法。同样的,如果bean使用了destroy-method属性声明了销毁方法,则该方法被调用。
bean的生命周期在singleton和prototype下的不同
//TODO
网友评论