核心

作者: Jesse_996 | 来源:发表于2023-06-04 11:28 被阅读0次

BeanDefinition

容器中的每一个 bean 都会有一个对应的 BeanDefinition 实例,该实例负责保存bean对象的所有必要信息,包括 bean 对象的 class 类型、是否是抽象类、构造方法和参数、其它属性等等。

BeanDefinitionRegistry和 BeanFactory就是菜谱(记录这道菜怎么做出来的)

BeanDefinitionRegistry 抽象出 bean 的注册逻辑,而 BeanFactory 则抽象出了 bean 的管理逻辑,而各个 BeanFactory 的实现类就具体承担了 bean 的注册以及管理工作

DefaultListableBeanFactory

实现BeanFactory接口 ,它同时也实现了 BeanDefinitionRegistry 接口

IOC容器的工作流程

  1. 容器启动阶段
    容器启动时,会通过某种途径加载 ConfigurationMetaData(xml的配置文件)。除了代码方式比较直接外,在大部分情况下,容器需要依赖某些工具类,比如: BeanDefinitionReader,BeanDefinitionReader 会对加载的 ConfigurationMetaData(xml的配置文件)进行解析和分析,并将分析后的信息组装为相应的 BeanDefinition,最后把这些保存了 bean 定义的 BeanDefinition,注册到相应的 BeanDefinitionRegistry,这样容器的启动工作就完成了。
  2. Bean的实例化阶段
    经过第一阶段,所有 bean 定义都通过 BeanDefinition 的方式注册到 BeanDefinitionRegistry 中,当某个请求通过容器的 getBean 方法请求某个对象,或者因为依赖关系容器需要隐式的调用 getBean 时,就会触发第二阶段的活动:容器会首先检查所请求的对象之前是否已经实例化完成。如果没有,则会根据注册的 BeanDefinition 所提供的信息实例化被请求对象,并为其注入依赖。当该对象装配完毕后,容器会立即将其返回给请求方法使用。
    BeanFactory 只是 Spring IoC 容器的一种实现,如果没有特殊指定,它采用采用延迟初始化策略:只有当访问容器中的某个对象时,才对该对象进行初始化和依赖注入操作。而在实际场景下,我们更多的使用另外一种类型的容器: ApplicationContext,它构建在 BeanFactory 之上,属于更高级的容器,除了具有 BeanFactory 的所有能力之外,还提供对事件监听机制以及国际化的支持等。它管理的 bean,在容器启动时全部完成初始化和依赖注入操作。(🥇 BeanFactory在被请求getBean要获取bean时才实例化,而如果说BeanFactory是Spring的心脏,那么ApplicationContext就是完整的躯体了,ApplicationContext由BeanFactory派生而来,比它强大)

JavaConfig (@Configuration @Bean)

上面我们提到bean的定义和相互间是用xml描述的,因为产生了许多的xml文件因此人们对它不满,所以完善了用Annotation来注册bean就是我们所见的@注释

@ComponentScan

注解用于导入配置类,比如配置类中的bean依赖于另一个别的类的bean,那么就可以借助@import把依赖的那个bean引进配置类
通过 basePackages等属性来指定 @ComponentScan自动扫描的范围,如果不指定,默认从声明 @ComponentScan所在类的 package进行扫描。正因为如此,SpringBoot的启动类都默认在 src/main/java下

@Import

用于导入配置类,比如配置类中的bean依赖于另一个别的类的bean,那么就可以借助@import把依赖的那个bean引进配置类

例子:

@Configuration
public class MoonBookConfiguration {
    @Bean
    public BookService bookService() {
        return new BookServiceImpl();
    }
}

现在有另外一个配置类,比如: MoonUserConfiguration,这个配置类中有一个bean依赖于 MoonBookConfiguration中的bookService,如何将这两个bean组合在一起?借助 @Import即可:

@Configuration
// 可以同时导入多个配置类,比如:@Import({A.class,B.class})
@Import(MoonBookConfiguration.class)
public class MoonUserConfiguration {
    @Bean
    public UserService userService(BookService bookService) {
        return new BookServiceImpl(bookService);
    }
}

在4.2之前, @Import注解只支持导入配置类,但是在4.2之后,它支持导入普通类,并将这个类作为一个bean的定义注册到IOC容器中

@Conditional

表示在满足某种条件后才初始化一个bean或者启用某些配置

@ConfigurationProperties与@EnableConfigurationProperties

当某些属性的值需要配置的时候,我们一般会在 application.properties文件中新建配置项,然后在bean中使用 @Value注解来获取配置的值。
使用 @Value注解注入的属性通常都比较简单,如果同一个配置在多个地方使用,也存在不方便维护的问题(考虑下,如果有几十个地方在使用某个配置,而现在你想改下名字,你改怎么做?)。对于更为复杂的配置,Spring Boot提供了更优雅的实现方式,那就是 @ConfigurationProperties注解。

相关文章

  • 挤进核心,成为核心

    没想到生平第一次用Skype,会是一场跨国面试。 结果是,初面挺好的,Skype的使用体验也不错。除了中途网络原因...

  • 核心——核心才是关键

    瑜伽老师讲,我们练习瑜伽最关键的是核心,只有核心稳定了,能量强大了,其他的便会与之环绕。这便是瑜伽的智慧,她充分了...

  • 156/365 研修 素养为纲,育人为本——课标研制思路

    跨学科核心素养包括: 语文核心素养,历史核心素养,物理核心素养,数学核心素养。 什么是学科核心素养? 个体在面对复...

  • 核心?核心肌群?核心稳定性?核心力量?这几个你分清楚了吗?

    平板支撑练核心!稳定核心!收紧核心!这样的说法你应该总能听见。那么核心究竟是什么?核心肌群、核心稳定性、核心力量又...

  • 酒店的核心产品是什么?答案你想象不到!(上)

    核心产品是什么,核心定位、核心设计、核心文化,还有核心管理、核心价值,这是酒店我认为是几个比较重要的方面, 酒店...

  • 核心

    古交给排水公司党总支部,下设机关、自来水厂、污水处理厂、净化水厂四个党支部,共有60余名党员。多年来,公司充分发挥...

  • 核心

    在瑜伽体式中;经常有“守好核心”这样的口令提醒;身体需要核心力量的支持和稳定;联想到内在如是… 每个人都在寻找平衡...

  • 核心

    本网讯(通讯员任智琪 许唯佳)3月28日下午,武汉市东湖新技术开发区疾控中心刘丽、姜丹两位专家应邀在图书馆3号报告...

  • 核心

    被动给予和主动索求的含义完全不一样!要如何了解别人的真实需求,也需要从不同的方向出发! 成交一个陌生人是很难的,因...

  • 核心

    不要想,直接去做

网友评论

      本文标题:核心

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