Spring Bean LifeCycle

BeanDefinition元信息配置解析

可以通过多种BeanDefinitionReader读取BeanDefinition的配置(注解、xml、properties),并解析生成BeanDefinition,然后进行registry。

这个过程更像一个“解析”的过程,所有的信息都有(在注解、xml、properties),而不是个create的过程,所以名字叫BeanDefinitionReader,配置了几个就会读出来几个,并没有实例数目的增加。

Reader需要配置个BeanDefinitionRegistry,而默认的DefaultListableBeanFactory已经实现了此方法,如下方式:

        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        // 实例化基于 Properties 资源 BeanDefinitionReader
        PropertiesBeanDefinitionReader beanDefinitionReader = new PropertiesBeanDefinitionReader(beanFactory);
        String location = "META-INF/user.properties";
        // 基于 ClassPath 加载 properties 资源
        Resource resource = new ClassPathResource(location);
        // 指定字符编码 UTF-8
        EncodedResource encodedResource = new EncodedResource(resource, "UTF-8");
        int beanNumbers = beanDefinitionReader.loadBeanDefinitions(encodedResource);
        System.out.println("已加载 BeanDefinition 数量:" + beanNumbers);
        // 通过 Bean Id 和类型进行依赖查找
        User user = beanFactory.getBean("user", User.class);
        System.out.println(user);

堂堂一个DefaultListableBeanFactory,还需要注入到一个reader中?而不是reader注入到DefaultListableBeanFactory,DefaultListableBeanFactory依赖reader?你这DefaultListableBeanFactory已经实现了ConfigurableListableBeanFactory, BeanDefinitionRegistry接口,为什么不在实现个BeanDefinitionReader?

从实现上看,把reader于registry分开是非常有必要的,相当于reader是资源的生产,而registry是资源的消费。

如果DefaultListableBeanFactory中依赖reader,那么就需要提供一系列的针对各种不同的xml、properties的read的接口,这显然会明显的增加DefaultListableBeanFactory的接口数量,增加了DefaultListableBeanFactory的功能。而把自己作为一个registry方式给reader,自己只需要暴露一个registry接口,reader的工作完全不需要。

BeanDefinition的注册

BeanDefinition的MR

Reslove bean class

实例化前

实例化

实例化后

赋值之前

aware回调阶段、初始化前阶段

Table of Contents