diff --git "a/2023.06.15 \343\200\214\345\260\217\351\251\254\345\223\245\346\212\200\346\234\257\345\221\250\346\212\245\343\200\215- \347\254\254\344\272\224\345\215\201\345\205\255\346\234\237\357\274\232Spring \345\256\271\345\231\250\345\271\266\350\241\214 Bean \347\224\237\345\221\275\345\221\250\346\234\237\345\244\204\347\220\206\345\256\236\347\216\260/README.md" "b/2023.06.15 \343\200\214\345\260\217\351\251\254\345\223\245\346\212\200\346\234\257\345\221\250\346\212\245\343\200\215- \347\254\254\344\272\224\345\215\201\345\205\255\346\234\237\357\274\232Spring \345\256\271\345\231\250\345\271\266\350\241\214 Bean \347\224\237\345\221\275\345\221\250\346\234\237\345\244\204\347\220\206\345\256\236\347\216\260/README.md" new file mode 100644 index 0000000..43ea382 --- /dev/null +++ "b/2023.06.15 \343\200\214\345\260\217\351\251\254\345\223\245\346\212\200\346\234\257\345\221\250\346\212\245\343\200\215- \347\254\254\344\272\224\345\215\201\345\205\255\346\234\237\357\274\232Spring \345\256\271\345\231\250\345\271\266\350\241\214 Bean \347\224\237\345\221\275\345\221\250\346\234\237\345\244\204\347\220\206\345\256\236\347\216\260/README.md" @@ -0,0 +1,128 @@ + +# 底层实现 + +## 代码实现 +项目工程 - [microsphere-spring](https://github.com/microsphere-projects/microsphere-spring)
核心代码 - [io.microsphere.spring.context.event.ParallelBeanFactoryListener](https://github.com/microsphere-projects/microsphere-spring/blob/main/microsphere-spring-context/src/main/java/io/microsphere/spring/context/event/ParallelBeanFactoryListener.java) + + +# 知识贮备 + +## Spring 可依赖对象 + +### Spring Bean 对象 + +#### Spring BeanDefinition + +##### Spring Class 级别 BeanDefinition +指定 BeanDefinition class
指定 BeanDefinition class -> FactoryBean 实现
@Component AnnotatedBeanDefinition class = 配置类 + +##### Spring 工厂方法 BeanDefinition +BeanDefinition#setFactoryBean (可选) + +- 如果存在的话,说明工厂方法是对象方法 +- 如果存在的话,说明工厂方法是类方法 + +BeanDefinition#setFactoryMethod(可选) + +- 如果存在的话,Bean 会通过工厂方法来创建 + +##### Spring @Bean BeanDefinition +Spring 3.0 +
Configuration class @Bean 方法声明
通过 AnnotatedBeanDefinition#getFactoryMethodMetadata() 获取 @Bean 方法信息 + +##### Spring Suppiler BeanDefinition +Spring 5.0 +
BeanDefinition 执行 org.springframework.beans.factory.support.AbstractBeanDefinition#setInstanceSupplier
该 Bean 通过 AbstractBeanDefinition#getInstanceSupplier() 方法返回 Supplier 来获取
+ +#### Spring 外部注册的 Singleton 对象 +SingletonBeanRegistry#registerSingleton(String,Object)
被注册 Singleton 对象的生命周期由 IoC 容器外部管理,该对象是一个已准备就绪的 Bean + +### Spring ResolvableDependency +手动注册,AbstractApplicationContext +```java + protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { + ... + beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory); + beanFactory.registerResolvableDependency(ResourceLoader.class, this); + beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this); + beanFactory.registerResolvableDependency(ApplicationContext.class, this); + ... + } +``` + +```java +public class SomeBean { + + @Autowired + private ApplicationContext context; // 非 Spring Bean,而是 ResolvableDependency + + // 非 Spring Bean,而是 ResolvableDependency + @Autowired + private ConfigurableApplicationContext applicationContext; + + @Autowired + private EchoService echoService; // EchoService Spring Bean,通过类型依赖查找 + + @Autowired + @Qualifier("userService") + private UserService userService; // UserService Spring Bean,通过 @Qualifier 查找 + + @Autowird + private Map userServices; +} +``` + +SomeBean 实际上依赖的 Spring Beans:EchoService 和 UserService,需要进一步分析出两个类型对应的 Bean 名称。 + + +```java + public MybatisAutoConfiguration(MybatisProperties properties, + ObjectProvider interceptorsProvider, + ObjectProvider typeHandlersProvider, + ObjectProvider languageDriversProvider, + ResourceLoader resourceLoader, + ObjectProvider databaseIdProvider, + ObjectProvider> configurationCustomizersProvider, + ObjectProvider> sqlSessionFactoryBeanCustomizers) { + this.properties = properties; + this.interceptors = interceptorsProvider.getIfAvailable(); + this.typeHandlers = typeHandlersProvider.getIfAvailable(); + this.languageDrivers = languageDriversProvider.getIfAvailable(); + this.resourceLoader = resourceLoader; + this.databaseIdProvider = databaseIdProvider.getIfAvailable(); + this.configurationCustomizers = configurationCustomizersProvider.getIfAvailable(); + this.sqlSessionFactoryBeanCustomizers = sqlSessionFactoryBeanCustomizers.getIfAvailable(); + } +``` +Spring Bean 类型: + +1. MybatisProperties + 1. parameter.getParameterizedType() == MybatisProperties.class +2. Interceptor - ObjectProvider + 1. parameter.getParameterizedType() == ObjectProvider> + 1. rawType = ObjectProvider.class + 2. actualTypeParameters = + 1. [0] = Interceptor[].class +3. TypeHandler - ObjectProvider + 1. parameter.getParameterizedType() == ObjectProvider> + 1. rawType = ObjectProvider.class + 2. actualTypeParameters = + 1. [0] = TypeHandler[].class +4. LanguageDriver - ObjectProvider +5. DatabaseIdProvider - ObjectProvider +6. ConfigurationCustomizer - ObjectProvider> + 1. parameter.getParameterizedType() == ObjectProvider> + 1. rawType = ObjectProvider.class + 2. actualTypeParameters = + 1. [0] = List + 1. rawType = List.class + 2. actualTypeParameters = + 1. [0] = ConfigurationCustomizer.class +7. SqlSessionFactoryBeanCustomizer - ObjectProvider> + +Spring ResovlableType: + +1. ResourceLoader + +## Bean 作用域 + +### Singleton Scope Bean +