SpringIOC容器的一些简单知识笔记
Spring中的BeanFactory容器
-
最简单的容器,它主要的功能是为依赖注入(DI)提供支持
-
相关的接口,如BeanFactoryAware、DisposableBean、InitializingBean
InitializingBean 只包含AfterPropertiesSet方法,凡是继承了该方法的类,初始化bean的时候会自动执行该方法.
-
有大量对BeanFactory的实现. 其中最常用的是XmlBeanFactory类
使用懒加载的方式,只有调用的时候才会被加载
beanctory factory = new XmlBeanFactory(new ClassPathResourse("Beans.xml"));
HelloWorld helloworld = (HelloWorld)factory.getBean("helloWorld")
Spring中的ApplicationContext容器
- Application Context 是 BeanFactory 的子接口,也被称为 Spring 上下文。
- 增加了企业所需要的功能,如,从属性文件中解析文本信息和将事件传递给所指定的监听器。
- 包含有BeanFactory的所有功能,一般情况下相比于BeanFactory,ApplicationContext会更加优秀
- 接口的实现
FileSystemXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你需要提供给构造器 XML 文件的完整路径
ClassPathXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可,因为,容器会从 CLASSPATH 中搜索 bean 配置文件
WebXmlApplicationContext:该容器会在一个 web 应用程序的范围内加载在 XML 文件中已被定义的 bean - 示例代码
预加载方式,即在应用启动后就实例化所有的bean,即在FileSystemXmlApplicationContext就会检查自身
ApplicationContext context = new FileSystemXmlApplicationContext("C:/Users/ZARA/workspace/HelloSpring/src/Beans.xml")
HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
Spring Bean定义
- bean是一个实例化、组装、并通过Spring IOC容器所管理的对象
- bean定义包含称为配置元数据的信息,下述容器也需要知道配置元数据
如何创建一个Bean
Bean的生命周期详细信息
bean的依赖关系
上述数据转换为每个bean定义的属性
属性 | 描述 |
---|---|
class | 这个属性是强制性的,并且指定用来创建 bean 的 bean 类 |
name | 这个属性指定唯一的 bean 标识符。在基于 XML 的配置元数据中,你可以使用 ID 和/或 name 属性来指定 bean 标识符。 |
scope | 这个属性指定由特定的 bean 定义创建的对象的作用域 |
constructor-arg | 它是用来注入依赖关系的 |
properties | 它是用来注入依赖关系的 |
autowiring mode | 它是用来注入依赖关系的 |
lazy-initialization mode | 延迟初始化的 bean 告诉 IoC 容器在它第一次被请求时,而不是在启动时去创建一个 bean 实例 |
initialization 方法 | 在 bean 的所有必需的属性被容器设置之后,调用回调方法。 |
destruction 方法 | 当包含该 bean 的容器被销毁时,使用回调方法 |
- Bean和Spring的关系
Bean的作用域
作用域 | 描述 |
---|---|
singleton | 在Spring IOC容器中只存在一个Bean实例,Bean以单例方式存在,默认值 |
prototype | 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean() |
request | 每次Http请求都会创建一个Bean,该作用域只适用于WebApplicationContext环境 |
session | 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,仅适用于WebApplicationContext环境 |
global-session | 一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext环境 |
- singleton
singleton是spring的默认作用域,也就是说当一个bean的作用域为singleton时,并且对所有的bean请求,只要id与bean定义相同就会返回同一实例
- prototype
每次对该bean进行请求都会创建一个新的bean实例
bean的生命周期
当一个bean被初始化时,他可能执行一些方法使它变为可用状态。 当一个bean不在使用的时候,并且从容器中移除,可能需要做一些清理工作
这里只是容易理解的俩个重要生命周期回调,它在bean创建和初始化时是必须的
init-method和 destroy-method. init-method指定一个方法,在初始化的时候调用,destroy-method指定一个方法,只有在bean容器移除之后,才会调用该方法
bean的生命周期可以表达为 Bean的定义---Bean的初始化---Bean的使用---Bean的销毁
- 初始化回调
接口 InitializingBean 里面 afterPropertiesSet()方法
- 销毁回调
接口 DisposableBean 里面 destroy() 方法
Spring Bean的后置处理器
- Bean的后置处理允许在调用方法的时候对bean进行额外的处理
BeanPostProcess 接口定义回调方法,可以实现自己的依赖逻辑,也可以在Spring容器中通过插入一个或者多个BeanPostProcess的实现来完成实例化,配置和初始化后实现一些自定义的逻辑方法
通过BeanProcessJ接口提供的order属性,来控制这些接口的执行顺序
自定义的接口中要实现俩个抽象方法 postProcessBeforeInitialization(Object, String),postProcessAfterInitialization(Object, String)