依赖来源主要包括:依赖查找的来源和 依赖注入的来源。其中依赖注入的来源比依赖查找来源多一个非Spring 容器管理对象(也可以叫游离对象)
一、依赖查找的来源
1.1、Spring BeanDefinition 和单例对象
1.2、Spring 內建BeanDefintion
1.3、Spring 內建单例对象
二、依赖注入来源
依赖注入的来源包括 自定义Spring BeanDefinition 、单例对象、Spring 內建BeanDefintion、Spring 內建单例对象以及非Spring 容器管理对象(也可以叫游离对象)
Spring容器管理和游离对象
三 、Spring IOC的三种依赖来源
Spring IOC的三种依赖来源,自定义注册的Spring bean、内建的Spring bean以及内建的可注入的依赖,其中自定义注册的Spring bean基本上是通过xml、注解或者api注册BeanDefination创建的,内建的Spring bean是通过registerSingleton()创建的,内建的可注入的依赖是通过registerResolveDependency()创建的,后续如果我们需要往Spring容器里放入一些非Spring托管的bean但又可以被依赖注入的, 可以通过registerResolveDependency() API实现。
3.1 Spring BeanDefinition 作为依赖来源
要素
• 元数据:BeanDefinition
• 注册:BeanDefinitionRegistry#registerBeanDefinition
用来注册bean
• 类型:延迟和非延迟
• 顺序:Bean 生命周期顺序按照注册顺序
3.2 单例对象作为依赖来源
•要素
• 来源:外部普通 Java 对象(不一定是 POJO)
• 注册:SingletonBeanRegistry#registerSingleton
• 限制
• 无生命周期管理
• 无法实现延迟初始化 Bean
3.3 非 Spring 容器管理对象作为依赖来源
•要素
• 注册:ConfigurableListableBeanFactory#registerResolvableDependency
• 限制
• 无生命周期管理
• 无法实现延迟初始化 Bean
• 无法通过依赖查找
/**
* ResolvableDependency 作为依赖来源
*
*
* @since
*/
public class ResolvableDependencySourceDemo {
@Autowired
private String value;
@PostConstruct
public void init() {
System.out.println(value);
}
public static void main(String[] args) {
// 创建 BeanFactory 容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
// 注册 Configuration Class(配置类) -> Spring Bean
applicationContext.register(ResolvableDependencySourceDemo.class);
applicationContext.addBeanFactoryPostProcessor(beanFactory -> {
// 注册 Resolvable Dependency
beanFactory.registerResolvableDependency(String.class, "Hello,World");
});
// 启动 Spring 应用上下文
applicationContext.refresh();
// 显示地关闭 Spring 应用上下文
applicationContext.close();
}
}
总结:注册非spring管理的依赖对象时,可以通过两种方式实现
1.通过ApplicationContext.getBeanFactory()获取AnnotationConfigApplicationContext创建时初始化的DefaultListableBeanFactory对象,然后调用registryResolveableDependency来注册
2.通过addBeanFactoryPostProcessor回调方式实现,因为当refresh()方法执行invokeBeanFactoryPostProcessors()时会遍历已创建的beanFactoryPostProcessors集合对象来执行postProcessBeanFactory()方法