您的位置:首页 > 编程语言 > Java开发

好记性不如烂笔头83-spring3学习(4)-spring的BeanFactory(IoC容器)

2015-03-18 21:00 579 查看
我们一般把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容器)初始化

[code]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的配置情况

———-

[code]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;
    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: