• 如何真正理解Spring的核心思想 ?


    整理了一下Spring的核心概念

    BeanDefinition

    BeanDefinition表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点。比如:

    • class,表示Bean类型
    • scope,表示Bean作用域,单例或原型等
    • lazyInit:表示Bean是否是懒加载
    • initMethodName:表示Bean初始化时要执行的方法
    • destroyMethodName:表示Bean销毁时要执行的方法
    • 还有很多...

    在Spring中,我们经常会通过以下几种方式来定义Bean:

    1. @Bean
    2. @Component(@Service,@Controller)

    这些,我们可以称之申明式定义Bean

    我们还可以编程式定义Bean,那就是直接通过BeanDefinition,比如:

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

    我们还可以通过BeanDefinition设置一个Bean的其他属性

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

    和申明式事务、编程式事务类似,通过,@Bean,@Component等申明式方式所定义的Bean,最终都会被Spring解析为对应的BeanDefinition对象,并放入Spring容器中。

    BeanDefinitionReader

    接下来,我们来介绍几种在Spring源码中所提供的BeanDefinition读取器(BeanDefinitionReader),这些BeanDefinitionReader在我们使用Spring时用得少,但在Spring源码中用得多,相当于Spring源码的基础设施。

    AnnotatedBeanDefinitionReader

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

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

    注意:它能解析的注解是:@Conditional,@Scope、@Lazy、@Primary、@DependsOn、@Role、@Description

    XmlBeanDefinitionReader

    可以解析标签

    1. AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    2. XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(context);
    3. int i = xmlBeanDefinitionReader.loadBeanDefinitions("spring.xml");
    4. System.out.println(context.getBean("user"));

    ClassPathBeanDefinitionScanner

    ClassPathBeanDefinitionScanner是扫描器,但是它的作用和BeanDefinitionReader类似,它可以进行扫描,扫描某个包路径,对扫描到的类进行解析,比如,扫描到的类上如果存在@Component注解,那么就会把这个类解析为一个BeanDefinition,比如:

    1. AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
    2. context.refresh();
    3. ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(context);
    4. scanner.scan("com.bethmeta");
    5. System.out.println(context.getBean("userService"));

    BeanFactory

    BeanFactory表示Bean工厂,所以很明显,BeanFactory会负责创建Bean,并且提供获取Bean的API。

    而ApplicationContext是BeanFactory的一种,在Spring源码中,是这么定义的:

    public interf
  • 相关阅读:
    代码随想录算法训练营第一天(C)| 704. 二分查找 27. 移除元素
    最新ChatGPT商业运营系统源码+支持GPT4/支持ai绘画+支持Midjourney绘画
    A+B 输入输出练习I(c++基础)
    Zlib和Zstd 性能对比评测
    SQLSmith: Databend 如何利用随机化测试检测 Bug
    Yakit工具篇:专项漏洞检测的配置和使用
    思维导图:MindManager Professional 22.0 Crack
    《数据结构》队列
    maven打包时和 deploy时候将不会 依赖包含在生成的项目 jar中方法
    精华推荐 | 【深入浅出RocketMQ原理及实战】「性能原理挖掘系列」透彻剖析贯穿RocketMQ的系统服务底层原理以及高性能存储设计挖掘深入
  • 原文地址:https://blog.csdn.net/m0_67698950/article/details/126753609