Spring IOC依赖来源
- Spring BeanDefinition
- <bean id=“name” class=“xx”>
- @Bean public Bean name(){}
- BeanDefinitionBuilder/GenericBeanDefinition
- 单例对象
- API实现
- Spring内建beanDefinition
- ref: org.springframework.context.annotation.AnnotationConfigUtils#registerAnnotationConfigProcessors(org.springframework.beans.factory.support.BeanDefinitionRegistry, java.lang.Object)
- ConfigurationClassPostProcessor: 处理Spring配置类
- AutowiredAnnotationBeanPostProcessor:处理@Autowired,@Value,(@Inject)
- CommonAnnotationBeanPostProcessor:JSR-250,@Resource,@PostConstructor,@PreDestroy
- EventListenerMethodProcessor:处理@EventListener的Spring事件监听方法
- ref: org.springframework.context.annotation.AnnotationConfigUtils#registerAnnotationConfigProcessors(org.springframework.beans.factory.support.BeanDefinitionRegistry, java.lang.Object)
- Spring内建单例对象
- ref:org.springframework.context.support.AbstractApplicationContext#prepareBeanFactory
bean名称 | bean实例 | 使用场景 |
---|---|---|
environment | Environment对象 | 外部化配置以及Profiles |
systemProperties | java.util.Properties 对象 | Java 系统属性 |
systemEnvironment | java.util.Map 对象 | 操作系统环境变量 |
messageSource | MessageSource 对象 | 国际化文案 |
lifecycleProcessor | LifecycleProcessor 对象 | Lifecycle Bean 处理器 |
applicationEventMulticaster | ApplicationEventMulticaster 对象 | Spring 事件广播器 |
非Spring容器管理的对象(无法通过ApplicationContext/BeanFactory 获取),只可以用于依赖注入。
将ApplicationContext对象作为ResourceLoader、ApplicationEventPublisher、ApplicationContext类型的bean,因此依赖注入这三个类型的bean时注入的都是同一个ApplicationContext(AnnotationConfigApplicationContext)对象
org.springframework.context.support.AbstractApplicationContext#prepareBeanFactory
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);
Bean的来源:
- 注册BeanDefinition:BeanDefinitionRegistry#registerBeanDefinition<-GenericApplicationContext
- 注册singletonBean:SingletonBeanRegistry#registerSingleton<-DefaultSingleBeanRegistry
- 单体对象无法实现Bean生命周期管理
- 无法实现延迟初始化bean
- 注册ResolvableDependency(非Spring容器管理的对象):ConfigurableListableBeanFactory#registerResolvableDependency<-DefaultListaleBeanFactory
- 无生命周期管理
- 无法实现延迟初始化bean
- 无法通过依赖查找
- 外部化配置(@Value)
- 无生命周期管理
- 无法实现延迟初始化bean
- 无法通过依赖查找
依赖查找的来源:BeanDefinition、单体对象
依赖注入的来源:BeanDefinition、单体对象、ResolvableDependency、@Value