【Spring揭秘】------ 第四章学习 Spring的IoC容器之BeanFactory 01

原创 2016年08月29日 10:13:13

越努力,越幸运

Spring Ioc容器是一个提供IoC支持的轻量级容器。它和IoC Service Provider所提供的服务之间存在一定的交集,如下:
Spring的IoC容器支持以及衍生了许多高级特性。
Spring提供了两种容器类型BeanFactory和ApplicationContext
BeanFatory:基础类型IoC容器,提供完整的IoC服务支持。默认采用延迟初始化策略(lazy-load)。只有当客户端对象需要访问容器中的某个受管理对象的时候,才对该受管对象进行初始化以及依赖注入操作。
ApplicationContext:基于BeanFactory,相对比较高级的容器实现。相比BeanFactory要求更多的系统资源,启动时候较长,但是拥有事件发布、国际化等高级特性。
下面是书上的BeanFactory和ApplicationContext关系图:

4.1 拥有BeanFactory之后的生活

“拉拉扯扯的事情”,以前我们的系统业务对象需要自己去“拉“所依赖的业务对象,有了BeanFactory后,需要依赖什么让BeanFactory为我们推过来。
介绍了Spring配置XMl文件后,我们就将“生产图纸”交给BeanFactory
        BeanFactory container = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
        CarFactory carFactory = (CarFactory) container.getBean("carFactory");
        carFactory.getCar();

        ApplicationContext container = new ClassPathXmlApplicationContext("spring-config.xml");
        CarFactory carFactory = (CarFactory) container.getBean("carFactory");
        carFactory.getCar();

        ApplicationContext container = new FileSystemXmlApplicationContext("spring-config.xml");
        CarFactory carFactory = (CarFactory) container.getBean("carFactory");
        carFactory.getCar();
都是最基本的配置和操作,就不细讲了

4.2 BeanFatory的对象注册于依赖绑定方式

4.1.2 直接编码方式
    public static void main(String[] args) {
        DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory();
        BeanFactory container = bindViaCode(beanRegistry);
        CarFactory carFactory = (CarFactory) container.getBean("carFactory");
        carFactory.getCar();
    }

    private static BeanFactory bindViaCode(BeanDefinitionRegistry registry) {
        AbstractBeanDefinition carFactory = new RootBeanDefinition(CarFactory.class,1,true);
        AbstractBeanDefinition sellModel = new RootBeanDefinition(Limousine.class,1,true);
        AbstractBeanDefinition carAssembly = new RootBeanDefinition(SportCarListener.class,1,true);
        // 将bean定义注册到容器中
        registry.registerBeanDefinition("carFactory",carFactory);
        registry.registerBeanDefinition("sellModel",sellModel);
        registry.registerBeanDefinition("carAssemblyListener",carAssembly);
        // 指定依赖关系
        // 1.构造方式注入
//        ConstructorArgumentValues argValues = new ConstructorArgumentValues();
//        argValues.addIndexedArgumentValue(0,carAssembly);
//        argValues.addIndexedArgumentValue(1,sellModel);
        // 2.Setter方式注入
        MutablePropertyValues propertyValues = new MutablePropertyValues();
        propertyValues.addPropertyValue(new PropertyValue("carAssemblyListener",carAssembly));
        propertyValues.addPropertyValue(new PropertyValue("sellModel",sellModel));
        carFactory.setPropertyValues(propertyValues);
        // 绑定完成
        return (BeanFactory) registry;
    }
这里使用了DefaultListableBeanFactory实现类,继承关系如下:

书上这句话讲解的很清楚:BeanDefinitionRegistry就像图书馆的书架,所有的书是放在书架上的。虽然你还书或者借书都是跟图书馆(也就是BeanFactory,或许BookFactory可能更好些)打交道,但书架才是图书馆存放各类图书的地方。所以,书架相对于图书馆来说,就是它的“BookDefinitionRegistry
4.2.2 外部配置文件方式
1.Properties配置文件的加载
carFactory.(class)=com.xservice.h3c.spring.chapter03.CarFactory
# ----------通过构造方法注入的时候-------------
carFactory.$0(ref) = sellModel
carFactory.$1(ref) = carAssembly
# ----------通过setter方法注入的时候---------
# carFactory.sellModel(ref)=sellModel
# carFactory.carAssemblyListener(ref)=carAssembly

sellModel.(class)=com.xservice.h3c.spring.chapter03.Limousine
carAssembly.(class)=com.xservice.h3c.spring.chapter03.SportCarListener
    public static void main(String[] args) {
        DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory();
        BeanFactory container = bindBiaPropertiesFile(beanRegistry);
        CarFactory car = (CarFactory) container.getBean("carFactory");
        car.getCar();
    }

    private static BeanFactory bindBiaPropertiesFile(DefaultListableBeanFactory beanRegistry) {
        PropertiesBeanDefinitionReader reader = new PropertiesBeanDefinitionReader(beanRegistry);
        reader.loadBeanDefinitions("classpath:spring-config.properties");
        return beanRegistry;
    }

2. XML配置格式的加载
XML配置格式是Spring支持最完整,功能最强大的表达方式
Spring2.x之前,XML配置文件采用DTD(Document Type Definition)、2.x之后,引入了基于XSD(XML Schema Definition)的约束方式。不过,原本基于DTD的方式仍然有效。
    <bean id="carFactory" class="com.xservice.h3c.spring.chapter03.CarFactory">
        <constructor-arg index="0">
            <ref bean="sellModel" />
        </constructor-arg>
        <constructor-arg index="1">
            <ref bean="carAssemblyListener" />
        </constructor-arg>
    </bean>

    <bean id="carAssemblyListener" class="com.xservice.h3c.spring.chapter03.SportCarListener">
    </bean>
    <bean id="sellModel" class="com.xservice.h3c.spring.chapter03.Limousine">
    </bean>
    public static void main(String[] args) {
        DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory();
        BeanFactory container = bindViaXMLFile(beanRegistry);
        FXNewsProvider newsProvider = (FXNewsProvider)container.getBean("carFactory");
        newsProvider.getAndPersistNews();
    }
    public static BeanFactory bindViaXMLFile(BeanDefinitionRegistry registry) {
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(registry);
        reader.loadBeanDefinitions("classpath:spring-config.xml");
        return(BeanFactory)registry;
    }
4.2.3 注解方式
BeanFactory“几乎”支持IoC Serivce Provider可能使用的所有方式。之说以这么说,有两个原因:
  • 在Spring2.5之前,Spring框架并没有正式支持基于注解方式的依赖的注入
  • Spring2.5发布的基于注解的依赖注入方式,如果不适用classpath-scanning功能的话,仍然部分依赖于“基于XML配置文件的”的依赖注入方式
    <context:component-scan base-package="com.xservice.h3c.spring.chapter03" />
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring-config.xml");
        CarFactory carFactory = (CarFactory) applicationContext.getBean("carFactory");
        carFactory.getCar();
    }

总结:主要讲了配置文件加载,IoC如何获得对象,基础理论,看完敲完就完了,\(^o^)/~















版权声明:本文为博主原创文章,未经博主允许不得转载。

理解spring中的BeanFactory和FactoryBean的区别与联系

首先,这俩都是个接口…实现 BeanFactory 接口的类表明此类事一个工厂,作用就是配置、新建、管理 各种Bean。而 实现 FactoryBean 的类表明此类也是一个Bean,类型为工厂Bea...
  • joenqc
  • joenqc
  • 2017年03月26日 20:51
  • 1005

spring揭秘----高清版.pdf

  • 2017年04月06日 19:49
  • 50.32MB
  • 下载

spring揭秘.pdf

  • 2015年09月12日 16:12
  • 38.94MB
  • 下载

spring揭秘 读书笔记 六 bean的一生

我们知道,Spring容器具有对象的BeanDefinition来保存该对象实例化时需要的数据。 对象通过container.getBean()方法是才会初始化该对象。 BeanFactory 我们知...
  • dlf123321
  • dlf123321
  • 2015年08月24日 16:05
  • 1837

spring揭秘 读书笔记 一 IoC初探

本文是王福强所著>一书的读书笔记 ioc的基本概念 一个例子 我们看下面这个类,getAndPersistNews方法干了四件事 1 通过newsListener获得所有的新闻id; 2 通过new...
  • dlf123321
  • dlf123321
  • 2015年08月20日 20:07
  • 1313

【Spring揭秘】------ 第一章学习 Spring框架的由来

书中自有颜如玉,书中自有黄金屋! 简介:Spring是一个轻量级的框架,相对于过去EJB时代的重量级的企业应用开发而言,Spring框架的出现为曾经阴霾的天空带来了灿烂的阳光。。 1.1 Spring...
  • tc2015
  • tc2015
  • 2016年08月24日 09:11
  • 647

spring揭秘 完整 pdf

  • 2015年01月23日 11:00
  • 38.94MB
  • 下载

Spring揭秘(让Spring之父Rod Johnson拍案叫绝的原创经典)

  • 2011年11月15日 15:50
  • 38.94MB
  • 下载

解决Feign第一次请求timeout问题

java.util.concurrent.TimeoutException: null at com.netflix.hystrix.AbstractCommand.handleTimeout...
  • w_x_z_
  • w_x_z_
  • 2017年05月15日 20:53
  • 4818

读书笔记-《Spring技术内幕》-计文柯(三):Spring MVC与We

一、SpringMVC做了什么? 1.使用SpringMVC(以及同类型框架)前: 回顾下,我们刚学完JavaWeb时是如何实现前后台数据交互的。首先,Java文件目录分为Servlet(接受参数、转...
  • qq_25498677
  • qq_25498677
  • 2017年06月28日 11:43
  • 189
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Spring揭秘】------ 第四章学习 Spring的IoC容器之BeanFactory 01
举报原因:
原因补充:

(最多只允许输入30个字)