好记性不如烂笔头83-spring3学习(4)-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 com.spring;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
/**
* 简单说模拟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 范芳铭
*
* */
public class Role {
private String name;
private String type;
public Role(){
System.out.println("Role:默认构造函数");
}
//私有构造器
private Role(String name){
this.name = name;
System.out.println("Role:参数为String 的构造函数,我是私有的.");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public String toString(){
return "Role类被调用: "+this.name;
}
}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。