【spring启动过程】

文章目录

  • spring启动
  • BeanFactoryPostProcessor
  • BeanDefinitionRegistryPostProcessor
  • 如何理解refresh()

spring启动

Spring启动,就是构造ApplicationContext对象以及调用refresh()方法的过程。
首先,Spring启动过程主要做了这么几件事情:

  1. 构造一个BeanFactory对象
  2. 解析配置类,得到BeanDefinition,并注册到BeanFactory中
    i. 解析@ComponentScan,此时就会完成扫描
    ii. 解析@Import
    iii. 解析@Bean
    iv. …
  3. 因为ApplicationContext还支持国际化,所以还需要初始化MessageSource对象
  4. 因为ApplicationContext还支持事件机制,所以还需要初始化ApplicationEventMulticaster对
  5. 把用户定义的ApplicationListener对象添加到ApplicationContext中,等Spring启动完了就要
    发布事件了
  6. 创建非懒加载的单例Bean对象,并存在BeanFactory的单例池中。
  7. 调用Lifecycle Bean的start()方法
  8. 发布ContextRefreshedEvent事件
    由于Spring启动过程中要创建非懒加载的单例Bean对象,那么就需要用到BeanPostProcessor,所
    以Spring在启动过程中就需要做两件事:
  9. 生成默认的BeanPostProcessor对象,并添加到BeanFactory中
    i. AutowiredAnnotationBeanPostProcessor:处理@Autowired、@Value
    ii. CommonAnnotationBeanPostProcessor:处理@Resource、@PostConstruct、
    @PreDestroy
    iii. ApplicationContextAwareProcessor:处理ApplicationContextAware等回调
  10. 找到外部用户所定义的BeanPostProcessor对象(类型为BeanPostProcessor的Bean对象),
    并添加到BeanFactory中

BeanFactoryPostProcessor

BeanPostProcessor表示Bean的后置处理器,是用来对Bean进行加工的,类似的,
BeanFactoryPostProcessor理解为BeanFactory的后置处理器,用来用对BeanFactory进行加工的。

Spring支持用户定义BeanFactoryPostProcessor的实现类Bean,来对BeanFactory进行加工

如:
@Component
public class ZhouyuBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(“userService”);
beanDefinition.setAutowireCandidate(false);
}
}
以上代码,就利用了BeanFactoryPostProcessor来拿到BeanFactory,然后获取BeanFactory内的某
个BeanDefinition对象并进行修改,注意这一步是发生在Spring启动时,创建单例Bean之前的,所
以此时对BeanDefinition就行修改是会生效的。
注意:在ApplicationContext内部有一个核心的DefaultListableBeanFactory,它实现了
ConfigurableListableBeanFactory和BeanDefinitionRegistry接口,所以ApplicationContext和
DefaultListableBeanFactory是可以注册BeanDefinition的,但是
ConfigurableListableBeanFactory是不能注册BeanDefinition的,只能获取BeanDefinition,然后
做修改。
所以Spring还提供了一个BeanFactoryPostProcessor的子接口:
BeanDefinitionRegistryPostProcessor

BeanDefinitionRegistryPostProcessor

BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor接口,并新
增了一个方法,注意方法的参数为BeanDefinitionRegistry,所以如果我们提供一个类来实现
BeanDefinitionRegistryPostProcessor,那么在postProcessBeanDefinitionRegistry()方法中就可
以注册BeanDefinition了。

如何理解refresh()

ConfigurableApplicationContext接口上refresh()方法的注释,意思是:加载或刷新持久化的
配置,可能是XML文件、属性文件或关系数据库中存储的。由于这是一个启动方法,如果失败,它应
该销毁已经创建的单例,以避免暂用资源。换句话说,在调用该方法之后,应该实例化所有的单例,
或者根本不实例化单例 。
有个理念需要注意:ApplicationContext关闭之后不代表JVM也关闭了,ApplicationContext是
属于JVM的,说白了ApplicationContext也是JVM中的一个对象。
在Spring的设计中,也提供可以刷新的ApplicationContext和不可以刷新的ApplicationContext。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值