孙哥Spring源码第23集

第23集 finishBeanFactoryInitialization处理过程

【视频来源于:B站up主孙帅suns Spring源码视频】【微信号:suns45】
image-20230515152543966

image-20230515152553680

1、处理国际化,事件操作,onRresh()的操作,注册监听器。

image-20230515150436435

2、finishBeanFactoryInitialization(beanFactory)核心目的

通过Spring的BeanFactory创建单例(非延迟)这些对象

3、在调用这个finishBeanFactoryInitialization方法之前,Spring的ApplicationContext做了什么呢?

image-20230515150805130
1)注册BD BeanDefinition  ---> @ConfiugurationClassPostProcessor ---> BeanFactoryPostProcessor
						解决了顶级注解的处理 @PropertySource @ComponentScsan @Component  @ImportSource 											  @Import

2)  准备BeanPostProcessor ----> @AutowiredAnnotationBeanPostProcessor
                        解决了@Common 
						@Value  @Autowired  @Resource @PostConstrut @PreDestory注解 注入

4、处理类型转换器

image-20230515151542429

作用

1. 处理类型转换器
  		String----> 对象中需要的类型 
 		把配置文件xml或者.properties 解析成 @Value对应的值

注意

我们在通过自定义类型转换器应用时(ConversionService),id是必须要指定成 conversionService 
<bean id="conversionService"
@Component("conversionService")
@Bean("conversionService")

5、类型转换的发展

PropertyEditor->Converter

image-20230515152041191

6、BeanFactoy会有哪些属性呢?

BeanFactory 
     1. conversionService
     2. singletonObjects 
     3. earlySingletonObjects
     3. factorySingleonObj	ects
     4. beanDefintionMap
     5. beanDefintionNames
     6. BeanFactoryPostProcesses
     7. BeanPostProcesses
     8. embededValueResovers 

7、占位符替换

image-20230515152127205

8、占位符的数据信息是在哪里处理的呢?

在ConfigurationClassPostprocessor的@PropertySource中处理的。

9、冻结BD

image-20230515153511547

10、创建对象和创建复杂对象

image-20230515152335833

11、处理注解注入

image-20230515161526385

A:判断当前是否有 AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor
B:处理@Value @Resource @Autowired注解注入,使用InjectMeta封装@Value @Resource @Autowired。

image-20230515161706256

12、FactoryBean 和 BeanFactory的区别

FactoryBean 接口和 BeanFactory 的主要区别在于它们的职责和用途。简单地说,FactoryBean 主要用于创建复杂或需要在实例化前进行特定配置的对象,而 BeanFactory 是 Spring 容器的基本接口,用于定义如何管理和创建 bean。

以下是 FactoryBean 和 BeanFactory 之间的一些关键区别:

  1. 功能不同

    • FactoryBean: 创建定义更复杂数组的bean,通常用于创建不容易实例化的对象,比如数据源对象, 事务代理对象等。 开发者也可创建自己的 FactoryBean 类型来封装复杂的实例化逻辑。
    • BeanFactory:提供依赖注入所需所有功能的核心接口,负责查找和维护bean定义、解析配置文件以及处理.bean 生命周期。
  2. 使用方式不同

    • FactoryBean:在 <bean> 标签中配置时, 需将引用改为 factoryBean 并通过属性设置来调整。
    • BeanFactory:在 applicationContext.xml 中直接引入即可(Spring 提供默认实现:ClassPathXmlApplicationContextFileSystemXmlApplicationContext)。
  3. 返回类型不同

    • FactoryBean: getObject()函数返回最后的Bean对象。
    • BeanFactory: getBean()函数返回 Bean 对象的实例。
  4. 适用场景不同

    • FactoryBean:用于封装类的复杂创建过程,适合需要配置大量信息的 Bean。
    • BeanFactory:适合维护整个 Spring 框架的bean关系。 在 ApplicationContext 中可以嵌套使用 BeanFactory 定义。

总结:

  • FactoryBean 是一个强大的工厂模式实现,在 Spring 配置中创建复杂对象时非常有用。
  • BeanFactory 是一个更为基础的接口,负责管理和构建不同类型的 bean。
  • 虽然这两者都是工厂模式的实现,但它们在功能、使用方式和场景上都存在显著差异。 在应用程序与框架交互时,通常使用 BeanFactory 管理具体业务对象,而使用.FactoryBean 解决特定初始化问题。

13、ApplicationContext的职责

ApplicationContext 是 Spring 框架中一个重要的组件,它的主要职责如下:

  1. Bean 容器: ApplicationContext 提供了一个存储并管理 Spring 应用中所有 Bean 对象的容器。它可以创建、配置和组装与应用相关的 Bean,并确保它们之间的依赖关系得到正确解决。

  2. 单例模式或原型模式: ApplicationContext 可以根据 Bean 的定义来控制其作用域(singleton, prototype 等),以满足应用程序的需求。

  3. 配置文件管理: ApplicationContext 能够读取和管理不同类型的配置文件(例如:XML, Java 配置类, 属性文件等),使开发者可以使用适合项目需求的配置方式。

  4. 事件处理: ApplicationContext 支持应用级别的事件发布和订阅机制,允许 Bean 组件和其他 Spring 上下文元素之间进行松耦合的通信。

  5. 国际化: ApplicationContext 提供了支持多语言的消息资源管理功能,简化了开发者在开发具有国际化特性的应用时的工作。通过 ResourceBundleMessageSource 这个类可以轻松实现国际化。

  6. 环境抽象: ApplicationContext 提供了一个 Environment 接口,用于将环境属性(Profiles, properties 等)与 Spring 配置文件相互映射,使得应用程序可以更加灵活地应对不同的环境需求(如:开发、测试、生产等)。

  7. AOP 集成: ApplicationContext 支持 AOP 的自动代理生成和管理,从而实现分离关注点,增强应用的功能和性能。

  8. 资源访问: ApplicationContext 提供了通用的 getResource() 方法来简化在文件系统、类路径、URL 等地方访问资源操作。

以上就是 ApplicationContext 在 Spring 框架中的主要职责。它作为一个中心组件,串联起整个 Spring 应用,为开发者提供了一个易于使用和强大的工具。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值