码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-03-18 23:27:01      阅读:403      评论:0      收藏:0      [点我收藏+]

标签:beanfactory   ioc容器   好记性不如烂笔头   spring   

我们一般把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;
    }

}

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

标签:beanfactory   ioc容器   好记性不如烂笔头   spring   

原文地址:http://blog.csdn.net/ffm83/article/details/44422439

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!