spring的BeanFactory(IoC容器)

我们一般把BeanFactory叫做IoC容器,叫ApplicationContext 为应用上下文(或者Spring容器) BeanFactory是spring框架的核心,实现依赖注入【使个组件的依赖关系从代码中独立出来,使用配置文件即可实现这种依赖关系】和bean声明周期的管理 。

BeanFactory【IoC容器】启动过程:分为两个阶段,一个是容器启动阶段,另外一个是Bean实例化阶段 容器启动阶段:加载配置 —–》 分析配置信息 —–》装备到BeanDefinition —–》其他后处理(PostProcessor) Bean实例化阶段:实例化阶段 —–》装配阶段 —–》 生命周期回调 ——》 对象其他处理 —–》 注册回调接口

【容器启动阶段】:启动时,首先通过某种途径加载,一段依赖某种工具类(Bean Definition Reader) 对加载的配置进行解析和分析,并将分析后的信息编组为相应的BeanDefinition,最后把这些保存了bean定义必要信息的BeanDefinition。注册到相应的BeanDefinitionRegister。 【Bean实例化阶段】:当某个请求方通过容器的getBean方面明确地请求某个对象,就会触发这个阶端。首先检查所请求的对象是否初始化,如果没有则会根据注册的BeanDefinition所提供的信息实例化被请求对象,并为其注册依赖。 【干预容器的初始化】 spring提供了一种叫做BeanFactoryPostProcessor的容器扩展机制,在容器启动的第一个阶段增加一个工序。让我们可以对BeanDefinition做一些额外的操作。比如修改其中的Bean中定义的属性,为Bean定义增加其他信息等。 要自定义BeanFactoryPostProcessor。就必须要实现BeanFactoryProcessor接口,若一个容器中实现了多个BeanFactoryPostProcessor,则还需要实现Ordered接口以指定顺序。   spring内部通过JavaBean的property Editor来帮助进行String 类型的其他类型的转换工作

  指定propertyEditor:可以通过继承PropertyEditorSupport

【容器Bean实例化阶段】     getBean方法第一次被调用时,Bean实例化阶段的活动才会做触发。第二次调用则会直接房峰辉容器缓存的第一次实例化完的对象,若发现未被实例化,则通过createBean()方法来进行对象实例化、

【实例化过程】 实例化bean对象 —–>设置对象属性 —–> 检查Aware相关接口并设置相关依赖—–>BeanPostProcess前置处理,检查是否是InitializingBean以决定是否调用afterPropertiesSet方法—–>检查是否配置有自定义的init-method —–> BeanPostProcessor 后置处理 —–> 注册必要的Destruction相关回调接口 —–> 使用 —–> 是否实现DisposableBean —–> 是否配置有自定义的destory方法

【BeanFactory接口】 :采用工厂模式,,实例化和分发各种组件。实例化时自动根据配置文件applicationContext.xml(也可以其它名字)创建bean之间的依赖关系,来实现bean之间的依赖。 BeanFactory接口的5个方法,主要实现类:XMLBeanFactory boolean containsBean(String str) Object getBean(String str) Object getBean(String str,Class) boolean isSingleton(String str) String[] getAliases(String str) //别名

简单模拟BeanFactory(IoC容器)初始化package import orgimport orgimport orgimport orgimport org/** * 简单说模拟BeanFactory初始化(IoC容器) * * @author 范芳铭 */ public class EasyBeanFactory {public static void main(String[] args){ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();Resource res = resolver.getResource(“classpath:bean.xml”);BeanFactory bf = new XmlBeanFactory(res);System.out.println(“初始化 beanFactory”);Role role = bf.getBean(“role1”,Role.class);System.out.println(“role 已经准备好为使用。” + role.toString());}}

Bean.xml的配置情况 ———-

package com.spring;/** * 一个有多个构造函数的普通类 * @author 范芳铭 * * */{private String name;private String type;public Role(){System.out.println(“Role:默认构造函数”);}(String name){this.name = name;System.out.println(“Role:参数为String 的构造函数,我是私有的.”);}public String getName() {return name;}(String name) {this.name = name;}public String getType() {return type;}(String type) {this.type = type;}@Overridepublic String toString(){return “Role类被调用: “+this.name;}}

愚公因此敢移山,矢志不渝是前行,握紧拳头勇登攀,

spring的BeanFactory(IoC容器)

相关文章:

你感兴趣的文章:

标签云: