Bean解析
IOC介绍
- 松耦合
- 灵活性
- 可维护
注解方式配置Bean
- 实现方式1:
@Component
声明,直接类上进行添加注解, 同时保证包扫描能扫到即可 - 实现方式2: 配置类中使用
@Bean
@Configuration
public class BeanConfiguration implements SuperConfiguration{
@Bean("dog")
Animal getDog() {
return new Dog();
}
}
- 实现方式3: 实现
FactoryBean
@Component
public class MyCat implements FactoryBean<Animal> {
@Override
public Animal getObject() throws Exception {
return new Cat();
}
@Override
public Class<?> getObjectType() {
return Animal.class;
}
}
使用时:
@Autowired
@Qualifier("myCat")
private Animal animal;
- 实现方式4: 实现
BeanDefinitionRegistryPostProcessor
@Component
public class MyBeanRegister implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
rootBeanDefinition.setBeanClass(Monkey.class);
registry.registerBeanDefinition("monkey", rootBeanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
}
- 实现方式5: 实现
ImportBeanDefinitionRegistrar
public class MyBeanImport implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
rootBeanDefinition.setBeanClass(Bird.class);
registry.registerBeanDefinition("bird", rootBeanDefinition);
}
}
框架核心refresh方法解析
- Bean配置读取加载入口
- spring框架启动流程
- 重点面试
方法核心流程
粗略图:
详解图:
prepareRefresh
- 设置容器状态
- 初始化属性设置
- 检查一下必备属性是否存在
obtainFreshBeanFactory
- 设置beanFactory序列化id
- 获取beanFactory
prepareBeanFactory
- 设置beanFactory的一些属性
- 添加后置处理器
- 设置忽略的自动装配接口
- 注册一些组件
postProcessBeanFactory
- 子类重写以在BeanFactory完成创建后做进一步设置
invokeBeanFactoryPostProcessors
步骤1:
步骤2:
步骤3: 基本跟步骤2一致
步骤4:
总结:
- 调用
BeanDefinitionRegistryPostProcessor
实现向容器内添加bean的定义 - 调用
BeanFactoryPostProcessor
实现向容器内bean的定义的添加属性
registerBeanPostProcessors
- 找到所有的
BeanPostProcessors
的实现 - 按照排序的接口排序后依次实现注册到容器内
initMessageSource
- 初始化国际化相关属性
initApplicationEventMulticaster
- 初始化事件广播器注册到容器中
onRefresh
不同的子类作用不一样, 例如ServletWebServerApplicationContext
的onRefresh
方法只做一件事情就是创建Web容器
registerListeners
- 向事件广播器进行注册事件监听器
- 派发早期事件
finishBeanFactoryInitialization
- 初始化所有剩下的单实例bean
finishRefresh
- 初始化生命周期处理器
- 调用生命周期处理器onRefresh方法
- 发布ContextRefreshedEvent事件
- JMX相关的处理
resetCommonCaches
- 事后的清理工作
Bean实例化流程解析
主要是在refresh
方法中的finishBeanFactoryInitialization
实现的
BeanDefinition介绍
- 一个对象在Spring中描述,RootBeanDefinition是其常见实现
- 通过操作BeanDefinition来完成bean实例化和属性注入
自定义创建bean
一般不需要,了解即可
@Component
public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
if (beanName.equals("worker")) {
return new Worker();
}
return null;
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
if (beanName.equals("worker")) {
Worker worker = (Worker) bean;
worker.setName("wangwu");
}
return false;
}
}
面试题
- 介绍一下ioc思想?
- springboot中bean有哪几种配置方式分别介绍下?
- bean的配貴你喜欢哪种方式?
- 介绍下refresh方法流程?
- 请介绍一个refresh中你比较熟悉的方法说出其作用?
- 介绍下bean实例化的流程?
- 说几个bean实例化的扩展点及其作用?