spring–基础–02–IoC容器
代码地址
https://gitee.com/DanShenGuiZu/learnDemo.git
1、介绍
- 管理对象的生命周期,从创建到销毁。
- 使用依赖注入(DI)来管理组成一个应用程序的组件。对象被称为 Spring Beans
2、类型
2.1、BeanFactory容器
- 最简单的容器,给DI提供了基本的支持,
- 用org.springframework.beans.factory.BeanFactory接口来定义。
- BeanFactory和相关的接口,比如BeanFactoryAware、DisposableBean、InitializingBean,仍旧保留在Spring中,主要目的是向后兼容已经存在的和那些Spring整合在一起的第三方框架。
- 在Spring中,有大量对BeanFactory接口的实现。其中,最常被使用的是XmlBeanFactory类。这个容器从一个XML文件中读取配置元数据,由这些元数据来生成一个被配置化的系统或者应用。
- 一般不建议使用BeanFactory,一般使用的是ApplicationContext
- 特殊情况:在资源宝贵的移动设备或者基于applet的应用当中,BeanFactory会被优先选择。
2.2、ApplicationContext容器
- 该容器添加企业特定的功能,在org.springframework.context.ApplicationContextinterface接口中定义。
- 从属性文件中解析文本信息
- 将事件传递给所指定的监听器
- 该容器是由org.springframework.context.ApplicationContext接口定义
- 是BeanFactory的子接口,也被称为Spring 上下文。包括BeanFactory容器的所有功能。
- 可以加载配置文件中定义的bean,当有请求的时候分配bean。
- 最常被使用的ApplicationContext接口实现:
- FileSystemXmlApplicationContext
- 该容器从XML文件中加载已被定义的bean。
- 需要提供给构造器XML文件的完整路径。
- ClassPathXmlApplicationContext
- 该容器从XML文件中加载已被定义的bean。
- 不需要提供XML文件的完整路径,只需正确配置CLASSPATH环境变量即可,因为,容器会从CLASSPATH中搜索bean配置文件。
- WebXmlApplicationContext
- 该容器会在一个web应用程序的范围内加载在XML文件中已被定义的bean。
- FileSystemXmlApplicationContext
3、BeanFactory容器的使用
3.1、XmlBeanFactory
- XmlBeanFactory 去生成工厂bean
- ClassPathResource 去加载bean配置文件。
- 通过配置文件中的beanID来返回一个真正的对象
4、ApplicationContext容器的使用
4.1、FileSystemXmlApplicationContext
- 加载完指定路径下bean配置文件
- 利用框架提供的FileSystemXmlApplicationContextAPI去生成工厂beanFactory
- 通过配置文件中的beanID来返回一个真正的对象
5、Bean定义
5.1、属性(元数据),描述
- class:类的全限定名
- name:指定唯一的bean标识符
- ID:指定唯一的bean标识符
- scope:bean的作用域
- constructor-arg:构造函数(带参)
- properties:bean的属性或者字段
- value:属性来配置基本数据类型
- ref:配置对象引用
- bean:定义内部bean
- list:注入一列值
- set:注入一列值
- map注入键值对(k-v)的集合,k,v可以是任何类型。
- props:注入键值对(k-v)的集合,k,v都是字符串类型。
- autowire:自动装配注入依赖
- lazy-initialization mode:IoC容器在它第一次被请求时创建一个bean实例,而不是在启动时去创建一个bean实例。
- init-method:在bean的所有必需的属性被容器设置之后,调用回调方法。
- destroy-method:当包含该bean的容器被销毁时,使用回调方法。
5.2、Bean与Spring容器的关系
5.3、配置元数据方式
基于XML的配置文件
基于注解的配置
基于Java的配置
6、bean的作用域
6.1、类型
- singleton:
- 单例
- 默认值
- 创建容器时就同时创建了单例对象
- prototype:
- 多例,相当于new对象
- 创建容器时就没有同时创建了多例对象
- 当我们获取bean的时候才会去 new 一个对象
- request:每次HTTP请求都会创建一个新的Bean,仅用于WebApplicationContext环境
- session:同一个HTTPSession共享一个Bean,不同Session使用不同的Bean,仅用于WebApplicationContext环境
- global-session:一般用于Portlet应用环境,仅用于WebApplicationContext环境
6.2、案例
输出:
---------单例--------------
sayHello2--->helloword
hello2:2056418216
hello21:2056418216
---------多例--------------
sayHello3--->helloword
hello3:648525677
hello31:1253946629
7、Bean生命周期
Bean的定义——Bean的初始化——Bean的使用——Bean的销毁。
7.1、以前对Bean生命周期的管理
- 初始化回调:org.springframework.beans.factory.InitializingBean接口实现
- 销毁回调:org.springframework.beans.factory.DisposableBean接口实现
7.2、现在通过配置bean属性来控制
输出:
Hello4:对象初始化后动作
Hello5:对象初始化后动作
Hello5:销毁对象前动作
Hello4:销毁对象前动作
8、Bean后置处理器
- 允许在调用bean初始化方法前后对Bean进行额外的处理。
- 使用BeanPostProcessor接口来定义
- SpringIoC容器实例化一个bean实例,然后BeanPostProcessor接口进行它们的工作。
- ApplicationContext会自动检测实现BeanPostProcessor接口的bean,注册这些bean为后置处理器,然后通过在容器中创建bean,在初始化方法前后调用它。
输出:
..... Creating shared instance of singleton bean 'hello2'
所有bean 初始化方法前,执行动作
当前bean:hello2
所有bean 初始化方法后,执行动作
当前bean:hello2
..... Creating shared instance of singleton bean 'hello4'
所有bean 初始化方法前,执行动作
当前bean:hello4
Hello4:对象初始化后动作
所有bean 初始化方法后,执行动作
当前bean:hello4
..... Creating shared instance of singleton bean 'hello5'
所有bean 初始化方法前,执行动作
当前bean:hello5
Hello5:对象初始化后动作
所有bean 初始化方法后,执行动作
当前bean:hello5
9、Bean定义继承
- 与Java类的继承无关
- 继承父Bean的配置数据,子Bean可以根据需要重写一些值,或者添加其他值。
- 父bean可以作为模板,子bean就可以从父bean中继承所需的配置数据.
- 不应该指定类的属性,而应该指定带true值的抽象属性