第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 应用,为开发者提供了一个易于使用和强大的工具。




![[TI] [Textual Inversion] An image is worth an word](https://img-blog.csdnimg.cn/147d63ebe406430ea8b20de84d666bc7.png)














