• Spring之Bean生命周期


    Spring Bean的创建过程中,依赖BeanDefinition中的信息处理bean的生成。

    先简单的了解下BeanDefinition
    编程试定义Bean,直接通过BeanDefinition

    AnnotationConfigApplicationContext context = new
    AnnotationConfigApplicationContext(AppConfig.class);
    // 生成一个BeanDefinition对象,并设置beanClass为User.class,并注册到ApplicationContext中
    AbstractBeanDefinition beanDefinition =
    BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
    beanDefinition.setBeanClass(User.class);
    context.registerBeanDefinition("user", beanDefinition);
    System.out.println(context.getBean("user"));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    同时,还可以通过BeanDefinition设置一个Bean的其他属性

    beanDefinition.setScope("prototype"); // 设置作用域
    beanDefinition.setInitMethodName("init"); // 设置初始化方法
    beanDefinition.setLazyInit(true); // 设置懒加载
    
    • 1
    • 2
    • 3

    AnnotatedBeanDefinitionReader,可以直接把某个类转换为BeanDefinition,并且会解析该类上的注解。

    AnnotationConfigApplicationContext context = new
    AnnotationConfigApplicationContext(AppConfig.class);
    AnnotatedBeanDefinitionReader annotatedBeanDefinitionReader = new
    AnnotatedBeanDefinitionReader(context);
    // 将User.class解析为BeanDefinition
    annotatedBeanDefinitionReader.register(User.class);
    System.out.println(context.getBean("user"));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    它能解析的注解是: @Conditional,@Scope,@Lazy。

    ClassPathBeanDefinitionScanner是扫描器,扫描宝路径,对扫描到的类进行解析。

    合并BeanDefinition
    通过扫描得到的BeanDefinition之后,就可以根据BeanDefinition创建Bean对象了,主要依靠下面三个子类实现

    • ChildBeanDefinition:要指定父类。实例化的时候一定要是父BeanDefinition,永远只能作为一个子BeanDefinition。
    • RootBeanDefinition: spring 2.5的首选 一般表示。 作为父beanDefinition出现也可以作为普遍的bd 但是不能设置父beanDefinition即 不能作为子bd。
    • GenericBeanDefinition:spring 2.5 以后出现的 常用的 可以 替换 ChildBeanDefinition 但是不能替换 RootBeanDefinition。可以完成RootBeanDefinition和ChildBeanDefinition 两种的功能。
    public class MergedBeanDefinitionDemo {
     
        public static void main(String[] args) {
            DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
            // 基于 XML 资源 BeanDefinitionReader 实现
            XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
            String location = "META-INF/dependency-lookup-context.xml";
            // 基于 ClassPath 加载 XML 资源
            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);
     
            User superUser = beanFactory.getBean("superUser", User.class);
            System.out.println(superUser);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    每日一练 | 网络工程师软考真题Day40
    06【Redis事务与分布式锁】
    JVM内存管理模型(初步)
    堆排序——向下调整
    【BUG】ServerHttpResponseDecorator失效
    Tomcat IP白名单/黑名单配置
    二叉树层序遍历及判断完全二叉树
    PHREEQC 水文地球化学模拟流程与方法
    python使用pandas中的read_csv函数读取csv数据为dataframe、查看dataframe数据中是否包含重复数据
    OpenHarmony教程指南—ArkUI中组件、通用、动画、全局方法的集合
  • 原文地址:https://blog.csdn.net/qq_35529931/article/details/127837884