美文网首页Spring源码分析
Spring IoC:BeanFactory继承体系

Spring IoC:BeanFactory继承体系

作者: 今年五年级 | 来源:发表于2020-07-25 20:26 被阅读0次

spring提供了多个IOC容器的实现,如xmlBeanFactory(最简单最低级的容器),classPathXmlApplicationContext(高级容器),其中 XmlBeanFactory 就是针对最基本的 IOC 容器的实现, 这个 IOC 容器可以读取 XML 文件定义的 BeanDefinition

class XmlBeanFactory extends DefaultListableBeanFactory

通过xml方式或者annotation方式加载bean信息,使用ioc容器装载bean,一般bean都是单例的

BeanFactory继承体系

image.png

ApplicationContext和BeanFactory关系(重要)

ApplicationContext 继承自 BeanFactory,但是它不应该被理解为 BeanFactory 的实现类,而是说其内部持有一个实例化的 BeanFactory(DefaultListableBeanFactory)。以后所有的 BeanFactory 相关的操作其实是委托给这个实例来处理的!之所以选择这个DefaultListableBeanFactory,是因为,他是最强大的BeanFactory!

image.png

组件介绍

(1)BeanFactory

树的root根,主要方式就是根据bean名称从容器中获取单个bean,提供了最基础的功能,其他功能通过继承或者实现该顶层接口做扩展


image.png
(2)ListableBeanFactory
image.png

Extension of the {@link BeanFactory} interface to be implemented by bean factories that can enumerate all their bean instances, rather than attempting bean lookup by name one by one as requested by clients.
{@link BeanFactory}接口的扩展将由bean工厂实现可以枚举其所有bean实例,而不是按客户的要求按名称尝试查找bean。

由上面的该接口的源码文档注释的这句话可以看出来,这个接口可以获得多个bean对象,而BeanFactory接口只可以获取单个bean对象。
该接口还具有可以判断容器中是否包含指定的bean,以及根据bean类型获取所有的bean,返回容器中bean的个数等功能

(3)HierarchicalBeanFactory

Hierarchical /ˌhaɪəˈrɑːkɪkl/ adj. 分层的
非常重要的接口,通过该接口,spring实现了具有父子层级关联关系的IOC容器体系,子容器可以访问父容器中的bean,父容器无法访问子容器中的bean,父子容器在spring中使用非常广泛,比如spring mvc中的controller层所有的bean都位于一个子容器中,service和mapper层的所有的bean都位于父容器中,因此所有的controller层bean(UserController,RoleController)都可以引用service和mapper层的bean(UserService,RoleService,UserMapper,RoleMapper),而service和mapper层bean却无法访问controller层bean


image.png
(4)AutowireCapableBeanFactory

作用在于整合其它框架:能让Spring管理的Bean去按某种规则(如按名字匹配、按类型匹配等)装配和填充那些不被Spring托管的bean实例(wire and populate existing bean instances that Spring does not control the lifecycle of),比如我们有一个工具类,并不想加注解@component交给spring去管理,但是我们工具类里面可能还需要注入@value比如一些接口的某个环境的地址,或者service,mapper,如果我们自己直接创建这个对象,打印这个属性肯定是null,但是我们使用这个类就可以很强大的获取到注入的东西

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">

   <bean id="myTestBean" class="com.jerrysong.springlearn.MyTestBean"></bean>
</beans>

@Data
public class School {

    private MyTestBean myTestBean;
    private String name;

}
    @Test
    public void test1(){
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-test.xml");
        AutowireCapableBeanFactory autowireCapableBeanFactory = context.getAutowireCapableBeanFactory();
        School school = (School) autowireCapableBeanFactory.createBean(School.class, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false);
        System.out.println(school.getMyTestBean());
    }

Note that this interface is not implemented by {@link org.springframework.context.ApplicationContext} facades,as it is hardly ever used by application code. That said, it is available from an application context too, accessible through ApplicationContext's {@link org.springframework.context.ApplicationContext#getAutowireCapableBeanFactory()} method.
因为应用程序代码几乎从未使用过该接口,因此ApplicationContext类并未实现它,如果要用,使用ApplicationContext类的getAutowireCapableBeanFactory方法

image.png

核心组件
BeanFactory(接口)=>DefaultListableBeanFactory(底层实现类)
底层实现类属性

image.png image.png

spring bean的生命周期

bean就是spring管理的对象
过程:class-> 对象-> 填充属性-> 放到单例池-> bean对象

相关文章

网友评论

    本文标题:Spring IoC:BeanFactory继承体系

    本文链接:https://www.haomeiwen.com/subject/hbymlktx.html