第23集 finishBeanFactoryInitialization处理过程
1、处理国际化,事件操作,onRresh()的操作,注册监听器。
2、finishBeanFactoryInitialization(beanFactory)核心目的
通过Spring的BeanFactory创建单例(非延迟)这些对象
3、在调用这个finishBeanFactoryInitialization方法之前,Spring的ApplicationContext做了什么呢?
1)注册BD BeanDefinition ---> @ConfiugurationClassPostProcessor ---> BeanFactoryPostProcessor
解决了顶级注解的处理 @PropertySource @ComponentScsan @Component @ImportSource @Import
2) 准备BeanPostProcessor ----> @AutowiredAnnotationBeanPostProcessor
解决了@Common
@Value @Autowired @Resource @PostConstrut @PreDestory注解 注入
4、处理类型转换器
作用
1. 处理类型转换器
String----> 对象中需要的类型
把配置文件xml或者.properties 解析成 @Value对应的值
注意
我们在通过自定义类型转换器应用时(ConversionService),id是必须要指定成 conversionService
<bean id="conversionService"
@Component("conversionService")
@Bean("conversionService")
5、类型转换的发展
PropertyEditor->Converter
6、BeanFactoy会有哪些属性呢?
BeanFactory
1. conversionService
2. singletonObjects
3. earlySingletonObjects
3. factorySingleonObj ects
4. beanDefintionMap
5. beanDefintionNames
6. BeanFactoryPostProcesses
7. BeanPostProcesses
8. embededValueResovers
7、占位符替换
8、占位符的数据信息是在哪里处理的呢?
在ConfigurationClassPostprocessor的@PropertySource中处理的。
9、冻结BD
10、创建对象和创建复杂对象
11、处理注解注入
A:判断当前是否有 AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor
B:处理@Value @Resource @Autowired注解注入,使用InjectMeta封装@Value @Resource @Autowired。
12、FactoryBean 和 BeanFactory的区别
FactoryBean 接口和 BeanFactory 的主要区别在于它们的职责和用途。简单地说,FactoryBean 主要用于创建复杂或需要在实例化前进行特定配置的对象,而 BeanFactory 是 Spring 容器的基本接口,用于定义如何管理和创建 bean。
以下是 FactoryBean 和 BeanFactory 之间的一些关键区别:
-
功能不同:
- FactoryBean: 创建定义更复杂数组的bean,通常用于创建不容易实例化的对象,比如数据源对象, 事务代理对象等。 开发者也可创建自己的 FactoryBean 类型来封装复杂的实例化逻辑。
- BeanFactory:提供依赖注入所需所有功能的核心接口,负责查找和维护bean定义、解析配置文件以及处理.bean 生命周期。
-
使用方式不同:
- FactoryBean:在
<bean>
标签中配置时, 需将引用改为factoryBean
并通过属性设置来调整。 - BeanFactory:在 applicationContext.xml 中直接引入即可(Spring 提供默认实现:
ClassPathXmlApplicationContext
和FileSystemXmlApplicationContext
)。
- FactoryBean:在
-
返回类型不同:
- FactoryBean: getObject()函数返回最后的Bean对象。
- BeanFactory: getBean()函数返回 Bean 对象的实例。
-
适用场景不同:
- FactoryBean:用于封装类的复杂创建过程,适合需要配置大量信息的 Bean。
- BeanFactory:适合维护整个 Spring 框架的bean关系。 在 ApplicationContext 中可以嵌套使用 BeanFactory 定义。
总结:
- FactoryBean 是一个强大的工厂模式实现,在 Spring 配置中创建复杂对象时非常有用。
- BeanFactory 是一个更为基础的接口,负责管理和构建不同类型的 bean。
- 虽然这两者都是工厂模式的实现,但它们在功能、使用方式和场景上都存在显著差异。 在应用程序与框架交互时,通常使用 BeanFactory 管理具体业务对象,而使用.FactoryBean 解决特定初始化问题。
13、ApplicationContext的职责
ApplicationContext
是 Spring 框架中一个重要的组件,它的主要职责如下:
-
Bean 容器:
ApplicationContext
提供了一个存储并管理 Spring 应用中所有 Bean 对象的容器。它可以创建、配置和组装与应用相关的 Bean,并确保它们之间的依赖关系得到正确解决。 -
单例模式或原型模式:
ApplicationContext
可以根据 Bean 的定义来控制其作用域(singleton, prototype 等),以满足应用程序的需求。 -
配置文件管理:
ApplicationContext
能够读取和管理不同类型的配置文件(例如:XML, Java 配置类, 属性文件等),使开发者可以使用适合项目需求的配置方式。 -
事件处理:
ApplicationContext
支持应用级别的事件发布和订阅机制,允许 Bean 组件和其他 Spring 上下文元素之间进行松耦合的通信。 -
国际化:
ApplicationContext
提供了支持多语言的消息资源管理功能,简化了开发者在开发具有国际化特性的应用时的工作。通过 ResourceBundleMessageSource 这个类可以轻松实现国际化。 -
环境抽象:
ApplicationContext
提供了一个Environment
接口,用于将环境属性(Profiles, properties 等)与 Spring 配置文件相互映射,使得应用程序可以更加灵活地应对不同的环境需求(如:开发、测试、生产等)。 -
AOP 集成:
ApplicationContext
支持 AOP 的自动代理生成和管理,从而实现分离关注点,增强应用的功能和性能。 -
资源访问:
ApplicationContext
提供了通用的 getResource() 方法来简化在文件系统、类路径、URL 等地方访问资源操作。
以上就是 ApplicationContext
在 Spring 框架中的主要职责。它作为一个中心组件,串联起整个 Spring 应用,为开发者提供了一个易于使用和强大的工具。