Spring IoC 依赖来源
...大约 2 分钟
Spring IoC 依赖来源
依赖查找的来源
查找来源
| 来源 | 配置元数据 | 
|---|---|
| Spring BeanDefinition | <bean id ="user" class="xxx.xxx.User"> | 
| @Bean public User user() {...} | |
| BeanDefinitionBuilder | |
| 单例对象 | API 实现 | 
Spring 內建 BeanDefintion
| Bean 名称 | Bean 实例 | 使用场景 | 
|---|---|---|
| org.springframework.context.annotation.internalConfigurationAnnotationProcessor | ConfigurationClassPostProcessor 对象 | 处理 Spring 配置类 | 
| org.springframework.context.annotation.internalAutowiredAnnotationProcessor | AutowiredAnnotationBeanPostProcessor 对象 | 处理 @Autowired 以及 @Value 注解 | 
| org.springframework.context.annotation.internalCommonAnnotationProcessor | CommonAnnotationBeanPostProcessor 对象 | (条件激活)处理 JSR-250 注解,如 @PostConstruct 等 | 
| org.springframework.context.event.internalEventListenerProcessor | EventListenerMethodProcessor 对象 | 处理标注 @EventListener 的 Spring 事件监听方法 | 
Spring 內建单例对象
| Bean 名称 | Bean 实例 | 使用场景 | 
|---|---|---|
| environment | Environment 对象 | 外部化配置以及 Profiles | 
| systemProperties | java.util.Properties 对象 | Java 系统属性 | 
| systemEnvironment | java.util.Map 对象 | 操作系统环境变量 | 
| messageSource | MessageSource 对象 | 国际化文案 | 
| lifecycleProcessor | LifecycleProcessor 对象 | Lifecycle Bean 处理器 | 
| applicationEventMulticaster | ApplicationEventMulticaster 对象 | Spring 事件广播器 | 
依赖注入的来源
| 来源 | 配置元数据 | 
|---|---|
| Spring BeanDefinition | <bean id ="user" class="xxx.xxx.User"> | 
| @Bean public User user() {...} | |
| BeanDefinitionBuilder | |
| 单例对象 | API 实现 | 
| 非 Spring 容器管理对象 | 
Spring 容器管理和游离对象
| 来源 | Spring Bean 对象 | 生命周期管理 | 配置元信息 | 使用场景 | 
|---|---|---|---|---|
| Spring BeanDefinition | 是 | 是 | 有 | 依赖查找、依赖注入 | 
| 单体对象 | 是 | 否 | 无 | 依赖查找、依赖注入 | 
| Resolvable Dependency | 否 | 否 | 无 | 依赖注入 | 
Spring BeanDefinition 作为依赖来源
- 元数据:BeanDefinition
- 注册:BeanDefinitionRegistry#registerBeanDefinition
- 类型:延迟和非延迟
- 顺序:Bean 生命周期顺序按照注册顺序
单例对象作为依赖来源
- 要素 - 来源:外部普通 Java 对象(不一定是 POJO)
- 注册:SingletonBeanRegistry#registerSingleton
 
- 限制 - 无生命周期管理
- 无法实现延迟初始化 Bean
 
非 Spring 对象容器管理对象作为依赖来源
- 要素 - 注册:ConfigurableListableBeanFactory#registerResolvableDependency
 
- 注册:
- 限制 - 无生命周期管理
- 无法实现延迟初始化 Bean
- 无法通过依赖查找
 
外部化配置作为依赖来源
- 要素 - 类型:非常规 Spring 对象依赖来源
 
- 限制 - 无生命周期管理
- 无法实现延迟初始化 Bean
- 无法通过依赖查找
 
问题
注入和查找的依赖来源是否相同?
否,依赖查找的来源仅限于 Spring BeanDefinition 以及单例对象,而依赖注入的来源还包括 Resolvable Dependency 以及 @Value 所标注的外部化配置
单例对象能在 IoC 容器启动后注册吗?
可以的,单例对象的注册与 BeanDefinition 不同,BeanDefinition 会被 ConfigurableListableBeanFactory#freezeConfiguration() 方法影响,从而冻结注册,单例对象则没有这个限制。
Spring 依赖注入的来源有哪些?
- Spring BeanDefinition
- 单例对象
- Resolvable Dependency
- @Value外部化配置
参考资料
 Powered by  Waline  v2.15.7