Spring-BeanFactory解读

简介: Spring-BeanFactory解读

BeanFactory和ApplicationContext


Spring通过一个配置文件描述Bean和Bean之间的依赖关系,利用Java反射功能实例化Bean,并建立Bean之间的依赖关系。


Spring的IOC容器在完成这些底层工作的基础上,还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载等高级服务。


BeanFactory是Spring框架最核心的接口,它提供了高级IOC的配置机制。


ApplicationContext建立在BeanFactory的基础上,提供了更多面向应用的功能, 它提供了国际化支持和框架事件体系。


我们一般称BeanFactory为IoC容器,而称ApplicationContext为应用上下文,但有时候为了行文方便,我们也将ApplicationContext称为Spring容器。


对于BeanFactory 和 ApplicationContext的用途:


BeanFactory是Spring框架的基础设施,面向Spring本身

ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合都可以直接使用Application而非底层的BeanFactory.


BeanFactory概述


BeanFactory是一个类的通用工厂,可以创建并管理各种类的对象。

这些被创建和管理的对象,并无特别之处,仅仅是一个POJO,Spring称这些被创建和管理的Java对象为bean.

所有可以被Spring容器实例化并管理的Java类都可以成为Bean。


解读BeanFactory的类体系结构


20170710115012538.jpg

20170710114906773.jpg


20170710115319703.png

BeanFactory的主要方法是 getBean(String beanName). 该方法从容器中返回特定名称的Bean.


BeanFactory的功能通过其他接口得到不断的扩展,主要有以下几个接口


ListableBeanFactory 定义了访问容器Bean中的若干方法。


20170710122426791.jpg


HierarchicalBeanFactory 父子级联IoC容器的接口,子容器可以通过 接口方法访问父容器

ConfigurableBeanFactory 重要接口,增强了IoC容器的可定制性

AutowireCapableBeanFactory 定义了容器中的Bean按照某种规则进行自动装配的方法

SingletonBeanRegistry 定义了允许在运行期间向容器注册单实例Bean的方法

20170710123004973.jpg


  • BeanDefinitionRegistry:Spring配置文件中的每个<bean>节点元素在Spring中通过一个BeanDefinition对象表示,它描述了Bean的配置信息,该接口提供了向容器手工注册BeanDefinition的方法。


初始化BeanFactory


20170710220057274.jpg


Plane.java

package com.xgj.master.ioc.beanfactory;
public class Plane {
    private String brand;
    private String color;
    private int maxSpeed;
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public int getMaxSpeed() {
        return maxSpeed;
    }
    public void setMaxSpeed(int maxSpeed) {
        this.maxSpeed = maxSpeed;
    }
    public void introduce(){
        System.out.println("Plane brand:" + brand + " ,Color:" + color + ",maxSpeed:" + maxSpeed);
    }
}


bean-plane.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
    <bean id="plane" class="com.xgj.master.ioc.beanfactory.Plane"
        p:brand="A380" p:color="Blue" p:maxSpeed="700" />
</beans>


BeanFactoryTest.java

package com.xgj.master.ioc.beanfactory;
import java.io.IOException;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
public class BeanFactoryTest {
    public static void main(String[] args) throws IOException {
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        Resource resource = resolver.getResource("classpath:com/xgj/master/ioc/beanfactory/bean-plane.xml");
        System.out.println(resource.getURL());
        //BeanFactory factory = new XmlBeanFactory(resource);  被废弃,不建议使用
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
        reader.loadBeanDefinitions(resource);
        System.out.println("inti BeanFactory successfully");
        Plane plane = beanFactory.getBean("plane",Plane.class);
        System.out.println("Plane Bean  is ready to use");
        plane.introduce();
    }
}


20170710220235037.jpg

解读:


XmlBeanDefinitionReader 通过Resource装载Spring配置信息并启动IOC容器,然后就可以通过BeanFactory#getBean(beanName)方法从IOC容器中获取bean。


通过BeanFactory启动IOC,初始化动作发生在第一调用时。


对于单实例singleton的bean来将,BeanFactory会缓存bean实例, 所以第二次使用getBean()时,将直接从IOC容器的缓存中获取Bean实例。


Spring在DefaultSingletonBeanRegistry类中提供了一个用户缓存单实例bean的缓存器, 是一个HashMap实现的缓存器。 beanName作为键保存在map中。


20170710221142276.jpg


20170710221320367.jpg

20170710221407106.jpg

相关文章
|
10月前
|
XML Java 数据格式
Spring中BeanFactory和FactoryBean详解
Spring中BeanFactory和FactoryBean详解
241 1
|
XML 人工智能 Java
Spring中的BeanFactory和ApplicationContext介绍
Spring中的BeanFactory和ApplicationContext介绍
|
Java 容器 Spring
Spring获取FactoryBean本身
可从容器中获取相应的bean对象. 若beanName对应的是一个FactroyBean,容器会自动调用FactoryBean的getObject()方法来加工生成一个bean。
81 0
|
XML Java 数据格式
掌握 Spring 必须知道的 BeanDefinition(上)
什么是 BeanDefinition? BeanDefinition 直译为 bean 定义,描述了一个 bean 实例具有的构造方法参数和属性值等信息。与 Java 中的 Class 类似,Class 是类文件在内存中的表现形式,BeanDefinition 是 Spring Bean 配置元信息在内存中的表现形式,各种配置元信息最后都会被转换为 BeanDefinition ,Spring 根据 BeanDefinition 实例化、初始化 bean,BeanDefinition 涉及到 Spring Bean 的整个生命周期。
199 0
掌握 Spring 必须知道的 BeanDefinition(上)
|
XML Java 数据格式
Spring IoC之BeanFactory
Spring IoC之BeanFactory
176 0
|
XML Java 数据格式
掌握 Spring 必须知道的 BeanDefinition(下)
xml 配置解析 xml 配置文件的解析由 XmlBeanDefinitionReader 来完成。XmlBeanDefinitionReader 加载 BeanDefinition 的入口方法如下。
87 0
|
Java Spring 容器
Spring BeanFactory、FactoryBean、ObjectFactory 有何不同?
前言 前面两篇文章 Spring基础容器BeanFactory 和 Spring FactoryBean 源码分析 已经详细的介绍了BeanFactory和FactoryBean,Spring中还存在一个ObjectFactory,它们之间不仅名称非常相似,事实上功能也有一些区别和联系。初学Spring的小伙伴可能很难区分它们之间有什么区别,这篇文章将简单对它们加以区分。
297 0
|
Java 程序员 API
spring的BeanFactory和ApplicationContext
在Spring框架中,BeanFactory和ApplicationContext都是大名鼎鼎,BeanFactory是基础ApplicationContext是扩展这句话怎么理解?请随本文一同去了解它们
204 0
spring的BeanFactory和ApplicationContext
|
存储 Java 程序员
深入理解 Spring BeanPostProcessor
回顾上一篇博客中,在AbstractApplicationContext这个抽象类中,Spring使用invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor,通过回调Spring自己添加的ConfigurationClassPostProcessor以及用户添加的bean工厂的后置处理器,完成了包扫描以及对主配置类代理的工作 本篇博文将继续往下跟进
140 0
|
安全 Java 关系型数据库
Spring5系列(五) | 聊聊FactoryBean
Spring5系列(五) | 聊聊FactoryBean
198 0
Spring5系列(五) | 聊聊FactoryBean