Spring启动相关
BeanFactoryPostProcessor(Bean 工厂后置处理器)和BeanPostProcessor(Bean 后置处理器)是什么,有什么区别?
- BeanFactoryPostProcessor:在创建 Bean之前,先修改Bean 的定义信息,不直接接触实体。
- BeanPostProcessor:在Bean 实例化完成后,修改 Bean 实例,直接操作实体。
Spring 容器执行流程(辅助理解)
- 加载配置文件 / 注解,生成所有 BeanDefinition;
- 执行所有
BeanFactoryPostProcessor(修改 BeanDefinition); - 遍历 BeanDefinition,实例化 Bean(调用构造方法创建对象);
- 对每个 Bean 执行
BeanPostProcessor.postProcessBeforeInitialization; - 执行 Bean 的初始化方法(@PostConstruct、init-method);
- 对每个 Bean 执行
BeanPostProcessor.postProcessAfterInitialization; - Bean 加入容器,完成初始化。
FactoryBean和BeanFactory是什么,有什么区别?
BeanFactory:是 Spring 容器的核心接口,相当于整个「工厂」的总控台,负责管理所有 Bean 的创建、存储、获取,是所有 Bean 的「大管家」。FactoryBean:是一个特殊的 Bean,相当于工厂里的「特殊工人」—— 这个工人不直接生产产品,而是专门负责创建某一类特定的 Bean 实例,是创建 Bean 的「专用工具」。
核心方法
FactoryBean 接口定义了 3 个核心方法:
T getObject():返回创建的目标 Bean 实例;Class<?> getObjectType():返回目标 Bean 的类型;boolean isSingleton():返回目标 Bean 是否是单例(默认 true)。
FactoryBean 的特殊获取规则:
- 直接通过
getBean("beanName")获取的是FactoryBean.getObject()返回的目标 Bean; - 要获取
FactoryBean本身,需要在名称前加&,即getBean("&beanName")。
ApplicationContext 和 BeanFactory 的关系
ApplicationContext 继承并扩展了 BeanFactory 接口,是 Spring 对基础 IoC 容器的增强实现。可以理解为:
BeanFactory= Spring 容器的「基础版」(只实现核心 IoC 功能);ApplicationContext= Spring 容器的「完整版」(包含基础版所有功能 + 丰富的扩展功能)。