diff --git a/README.md b/README.md
index 7ed902e..d310326 100644
--- a/README.md
+++ b/README.md
@@ -71,6 +71,7 @@
- [`ResourcePatternResolver`](spring-resources/spring-resource-resourcePatternResolver/README.md):资源模式解析接口,用于灵活加载应用中的多种资源。
- [`DocumentLoader`](spring-resources/spring-resource-documentLoader/README.md):XML文档加载解析核心接口,支持后台自动配置Spring应用。
+
- 元数据与过滤
- [`MetadataReader`](spring-metadata/spring-metadata-metadataReader/README.md):类元数据获取核心,支持组件扫描、条件化注解、AOP等高级功能。
@@ -80,6 +81,7 @@
- [`TypeFilter`](spring-metadata/spring-metadata-typeFilter/README.md):组件扫描时自定义类筛选,支持复杂条件和精确过滤。
- [`Condition`](spring-metadata/spring-metadata-condition/README.md):条件判断,决定Bean创建和配置的灵活机制。
+
- Bean定义与注册
- [`BeanDefinition`](spring-beans/spring-bean-beanDefinition/README.md):详细描述Bean,支持依赖注入、AOP、作用域控制等核心功能。
@@ -87,6 +89,7 @@
- [`BeanDefinitionHolder`](spring-beans/spring-bean-beanDefinitionHolder/README.md):管理和操作BeanDefinition的关键类。
- [`BeanDefinitionRegistry`](spring-beans/spring-bean-beanDefinitionRegistry/README.md):Bean定义注册管理关键接口,处理Bean元数据。
+
- Bean定义读取与扫描
- [`XmlBeanDefinitionReader`](spring-beans/spring-bean-xmlBeanDefinitionReader/README.md):加载解析XML配置,构建IOC容器,注册Bean定义。
@@ -115,6 +118,7 @@
- `ImportSelector`:运行时动态导入配置类,实现条件选择和灵活配置。
- `DeferredImportSelector`:运行时动态导入配置,支持条件选择和按组别延迟加载。
+
- Bean工厂
- `BeanFactory`:Spring的核心接口,提供对Bean的配置、创建、管理的基本功能。
@@ -124,11 +128,16 @@
- `HierarchicalBeanFactory`:支持父子容器关系,实现Bean定义的层次结构。
- `ConfigurableBeanFactory`:提供对BeanFactory配置的扩展,如属性编辑器、作用域等。
+
+ + [`AutowireCapableBeanFactory`](spring-factory/spring-factory-autowireCapableBeanFactory/README.md):Bean创建、初始化、注入、销毁的核心功能接口。
+ + `ConfigurableListableBeanFactory`:支持配置和列表操作的可配置Bean工厂接口。
+
- 基于Java的配置
- `ConfigurationClassPostProcessor`:处理@Configuration注解,关键容器启动后置处理器。
- `ConfigurationClassParser`:解析@Configuration,提取Config信息,支持@Bean和条件化配置。
+
- 容器上下文
- [`ClassPathXmlApplicationContext`](spring-context/spring-context-classPathXmlApplicationContext/README.md):类路径(classpath)加载 XML 配置文件的上下文。
@@ -136,6 +145,7 @@
- [`AnnotationConfigApplicationContext`](spring-context/spring-context-annotationConfigApplicationContext/README.md):注解配置类中加载配置信息的上下文。
- `GenericApplicationContext`:支持多种配置方式,XML、注解、手动注册的上下文。
+
- Bean生命周期
- [`Bean的定义注册过程`](spring-core/spring-core-registerBeanDefinition):加载与解析配置文件,注册解析Bean定义,类名、作用域、属性等。
@@ -145,6 +155,7 @@
- [`Bean的依赖解析过程`](spring-core/spring-core-resolveDependency/README.md):声明依赖,查找依赖,注入依赖,处理循环依赖,延迟依赖解析。
- [`Bean的销毁过程`](spring-core/spring-core-destroyBean/README.md):销毁方法调用,接口回调,后处理清理,通知触发,GC回收资源。
+
- Bean初始化与扩展点
- [`InitializingBean`](spring-interface/spring-interface-initializingBean/README.md):提供Bean初始化时执行自定义逻辑的接口。
@@ -166,6 +177,7 @@
- [`SmartInstantiationAwareBeanPostProcessor`](spring-interface/spring-interface-smartInstantiationAwareBeanPostProcessor/README.md):提供更智能的实例化控制。
- [`SmartInitializingSingleton`](spring-interface/spring-interface-smartInitializingSingleton/README.md):在所有单例Bean初始化完成后,执行自定义逻辑。
+
- Aware接口系列
- [`BeanNameAware`](spring-aware/spring-aware-beanNameAware/README.md):让Bean获取自身在容器中的名字。
@@ -189,6 +201,7 @@
- [`ApplicationContextAware`](spring-aware/spring-aware-applicationContextAware/README.md):允许Bean获取应用程序上下文。
- [`ImportAware`](spring-aware/spring-aware-importAware/README.md):允许被导入的配置类获取导入它的类的信息。
+
- 核心注解
- [`@Configuration`](spring-annotation/spring-annotation-configuration/README.md):声明类为配置类,定义Bean和Bean之间的依赖关系。
@@ -220,6 +233,7 @@
- `@Indexed`: 标记Bean用于索引。
- `@Order`:指定Bean的加载顺序。
+
- JSR规范
- [`@Inject`](spring-jsr/spring-jsr330-inject/README.md):JSR-330标准的依赖注入注解。
diff --git a/spring-factory/spring-factory-autowireCapableBeanFactory/README.md b/spring-factory/spring-factory-autowireCapableBeanFactory/README.md
index faff909..b9e22ca 100644
--- a/spring-factory/spring-factory-autowireCapableBeanFactory/README.md
+++ b/spring-factory/spring-factory-autowireCapableBeanFactory/README.md
@@ -1,5 +1,24 @@
## AutowireCapableBeanFactory
+- [AutowireCapableBeanFactory](#autowirecapablebeanfactory)
+ - [一、基本信息](#一基本信息)
+ - [二、基本描述](#二基本描述)
+ - [三、主要功能](#三主要功能)
+ - [四、接口源码](#四接口源码)
+ - [五、主要实现](#五主要实现)
+ - [五、最佳实践](#五最佳实践)
+ - [createBean](#createbean)
+ - [configureBean](#configurebean)
+ - [autowireBean](#autowirebean)
+ - [autowire](#autowire)
+ - [autowireBeanProperties](#autowirebeanproperties)
+ - [applyBeanPropertyValues](#applybeanpropertyvalues)
+ - [initializeBean](#initializebean)
+ - [destroyBean](#destroybean)
+ - [resolveDependency](#resolvedependency)
+ - [常见问题](#常见问题)
+
+
### 一、基本信息
✒️ **作者** - Lex 📝 **博客** - [掘金](https://juejin.cn/user/4251135018533068/posts) 📚 **源码地址** - [github](https://github.com/xuchengsheng/spring-reading)
@@ -336,6 +355,30 @@ public interface AutowireCapableBeanFactory extends BeanFactory {
}
```
+### 五、主要实现
+
++ `AbstractAutowireCapableBeanFactory`
+ + `AbstractAutowireCapableBeanFactory`是`AutowireCapableBeanFactory`接口的抽象实现,为Spring框架提供了核心的Bean创建、初始化和销毁功能。它实现了`createBean`方法,支持对Bean的依赖注入、属性值应用、后置处理器的应用,以及初始化和销毁阶段的生命周期管理。
+
+~~~mermaid
+classDiagram
+ direction BT
+ class ResourceLoader {
+ <>
+ }
+
+ class ResourcePatternResolver {
+ <>
+ }
+
+ class PathMatchingResourcePatternResolver {
+ }
+
+ ResourcePatternResolver --|> ResourceLoader
+ PathMatchingResourcePatternResolver ..|> ResourcePatternResolver
+
+~~~
+
### 五、最佳实践
使用`AnnotationConfigApplicationContext`创建了Spring应用程序上下文,手动注册了一个后置处理器(`MyBeanPostProcessor`)与一个单例Bean(`MyRepository`),最后获取了`AutowireCapableBeanFactory`。
@@ -519,3 +562,116 @@ private static void autowireBeanProperties(AutowireCapableBeanFactory beanFactor
调用autowireBeanProperties后,MyService = MyService{myRepository=com.xcs.spring.repository.MyRepository@4145bad8, javaHome='D:\install\jdk-11'}
```
+#### applyBeanPropertyValues
+
+使用`AutowireCapableBeanFactory`的`applyBeanPropertyValues`方法,手动为`MyService`类型的Bean配置自定义属性值。首先,创建了一个`PropertyValue`实例,表示要设置的属性名为"javaHome",属性值为"这里是我自定义的javaHome路径配置"。接着,通过`MutablePropertyValues`构建了属性值的集合,并将之前创建的`PropertyValue`添加到集合中。然后,创建了一个`RootBeanDefinition`,并将属性值集合设置到该Bean定义中。最后,通过`registerBeanDefinition`方法注册了一个名为 "myService" 的Bean定义。在调用`applyBeanPropertyValues`方法之前,创建了一个新的`MyService`实例,并输出了其初始状态。然后,调用`applyBeanPropertyValues`方法后,输出了`applyBeanPropertyValues`后的`MyService`实例信息,观察是否成功应用了自定义的属性值。
+
+```java
+private static void applyBeanPropertyValues(AutowireCapableBeanFactory beanFactory) {
+ PropertyValue propertyValue = new PropertyValue("javaHome", "这里是我自定义的javaHome路径配置");
+ MutablePropertyValues propertyValues = new MutablePropertyValues();
+ propertyValues.addPropertyValue(propertyValue);
+
+ RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(MyService.class);
+ rootBeanDefinition.setPropertyValues(propertyValues);
+ // 配置一个RootBeanDefinition
+ ((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("myService", rootBeanDefinition);
+
+ MyService myService = new MyService();
+ System.out.println("调用applyBeanPropertyValues前,MyService = " + myService);
+ beanFactory.applyBeanPropertyValues(myService, "myService");
+ System.out.println("调用applyBeanPropertyValues后,MyService = " + myService);
+}
+```
+
+运行结果发现,调用`applyBeanPropertyValues`方法后,并没有触发`BeanNameAware`接口中的`setBeanName`方法、`InitializingBean`接口中的`afterPropertiesSet`方法,以及自定义的`MyBeanPostProcessor`后置处理器的相应回调方法。这是因为`applyBeanPropertyValues`方法主要专注于属性值的应用,而不涉及完整的Bean初始化和生命周期管理。最终的运行结果显示`myRepository`属性为null,表明`applyBeanPropertyValues`方法并没有进行依赖注入。
+
+```java
+调用applyBeanPropertyValues前,MyService = MyService{myRepository=null, javaHome='null'}
+调用applyBeanPropertyValues后,MyService = MyService{myRepository=null, javaHome='这里是我自定义的javaHome路径配置'}
+```
+
+#### initializeBean
+
+使用`AutowireCapableBeanFactory`的`initializeBean`方法,手动初始化`MyService`类型的Bean。首先,创建了一个新的`MyService`实例,并输出了其初始状态。然后,通过`initializeBean`方法对该实例进行初始化,指定了Bean的名称为 "myService"。在调用方法之后,输出了`initializeBean`后的`MyService`实例信息,观察是否成功进行了初始化。
+
+```java
+private static void initializeBean(AutowireCapableBeanFactory beanFactory) {
+ MyService myService = new MyService();
+ System.out.println("调用initializeBean前,MyService = " + myService);
+ beanFactory.initializeBean(myService, "myService");
+ System.out.println("调用initializeBean前,MyService = " + myService);
+}
+```
+
+运行结果发现,`myRepository`和`javaHome`的值都显示为`null`,这是因为在调用`initializeBean`方法时,并没有提供属性值的注入。`initializeBean`方法主要用于手动触发Bean的初始化阶段,包括调用`afterPropertiesSet`方法和应用Bean后置处理器,但它并不负责属性的注入。
+
+```java
+调用initializeBean前,MyService = MyService{myRepository=null, javaHome='null'}
+MyService.setBeanName方法被调用了
+MyBeanPostProcessor#postProcessBeforeInitialization方法被调用了,Bean名称 = myService
+MyService.afterPropertiesSet方法被调用了
+MyBeanPostProcessor#postProcessBeforeInitialization方法被调用了,Bean名称 = myService
+调用initializeBean前,MyService = MyService{myRepository=null, javaHome='null'}
+```
+
+#### destroyBean
+
+使用`AutowireCapableBeanFactory`的`destroyBean`方法,手动销毁(destroy)一个`MyService`类型的Bean实例。通过传递新创建的`MyService`实例作为参数,调用了`destroyBean`方法。
+
+```java
+private static void destroyBean(AutowireCapableBeanFactory beanFactory) {
+ beanFactory.destroyBean(new MyService());
+}
+```
+
+运行结果发现,在调用`destroyBean`方法后,`MyService`实例的销毁方法 `destroy` 被成功调用。这表明`destroyBean`方法有效地触发了Bean的销毁阶段,执行了实现了`DisposableBean`接口的`destroy`方法。
+
+```java
+MyService.destroy方法被调用了
+```
+
+#### resolveDependency
+
+使用`AutowireCapableBeanFactory`的`resolveDependency`方法,手动解析一个依赖关系。通过创建一个`DependencyDescriptor`对象,表示`MyService`类中的`myRepository`属性,然后调用`resolveDependency`方法,尝试解析这个依赖关系。最后,输出解析得到的依赖对象。
+
+```java
+private static void resolveDependency(AutowireCapableBeanFactory beanFactory) {
+ try {
+ DependencyDescriptor dependencyDescriptor = new DependencyDescriptor(MyService.class.getDeclaredField("myRepository"), false);
+ Object resolveDependency = beanFactory.resolveDependency(dependencyDescriptor, "myRepository");
+ System.out.println("resolveDependency = " + resolveDependency);
+ } catch (NoSuchFieldException e) {
+ e.printStackTrace();
+ }
+}
+```
+
+运行结果发现,通过调用`resolveDependency`方法成功解析了依赖关系,将`myRepository`属性的依赖解析为`MyRepository`的实例。
+
+```java
+resolveDependency = com.xcs.spring.repository.MyRepository@37654521
+```
+
+### 常见问题
+
+1. **createBean() 和 configureBean()**
+ - `createBean()` 用于创建Bean的实例,即进行Bean的实例化。它是Bean创建过程中的第一步。
+ - `configureBean()` 则是在Bean实例创建之后,进行进一步的配置,如应用BeanPostProcessors等。这是在Bean实例化后、初始化之前的阶段。
+2. **autowireBean() 和 autowire()**
+ - `autowireBean()` 用于对现有的Bean实例进行自动装配,将依赖注入到Bean中。
+ - `autowire()` 是在创建Bean实例时使用指定的自动装配模式,用于生成新的Bean实例。
+3. **autowireBeanProperties() 和 applyBeanPropertyValues()**
+ - `autowireBeanProperties()` 主要用于对Bean实例的属性进行自动装配。
+ - `applyBeanPropertyValues()` 则是将属性值应用到Bean实例,包括在XML或注解中配置的属性值。
+4. **initializeBean()、applyBeanPostProcessorsBeforeInitialization() 和 applyBeanPostProcessorsAfterInitialization()**
+ - `initializeBean()` 是Bean生命周期中的最后一步,包括初始化和应用BeanPostProcessors等。
+ - `applyBeanPostProcessorsBeforeInitialization()` 用于在初始化之前应用BeanPostProcessors。
+ - `applyBeanPostProcessorsAfterInitialization()` 用于在初始化之后应用BeanPostProcessors。
+5. **destroyBean()**
+ - `destroyBean()` 用于销毁给定的Bean实例,释放资源等。通常在容器关闭时调用。
+6. **resolveNamedBean() 和 resolveBeanByName()**
+ - `resolveNamedBean()` 主要用于解析指定名称的Bean并返回Bean实例。
+ - `resolveBeanByName()` 则是解析指定名称的Bean定义,而不是直接返回Bean实例。
+7. **resolveDependency()**
+ - `resolveDependency()` 主要用于解析Bean之间的依赖关系,特别是在自动装配时。在`AbstractAutowireCapableBeanFactory`的`doResolveDependency()`方法中调用。
\ No newline at end of file
diff --git a/spring-factory/spring-factory-autowireCapableBeanFactory/src/main/java/com/xcs/spring/AutowireCapableBeanFactoryDemo.java b/spring-factory/spring-factory-autowireCapableBeanFactory/src/main/java/com/xcs/spring/AutowireCapableBeanFactoryDemo.java
index 8ee15f0..90f9297 100644
--- a/spring-factory/spring-factory-autowireCapableBeanFactory/src/main/java/com/xcs/spring/AutowireCapableBeanFactoryDemo.java
+++ b/spring-factory/spring-factory-autowireCapableBeanFactory/src/main/java/com/xcs/spring/AutowireCapableBeanFactoryDemo.java
@@ -46,17 +46,11 @@ public class AutowireCapableBeanFactoryDemo {
// autowireBeanProperties(beanFactory);
// 将属性值应用到给定的Bean实例
- applyBeanPropertyValues(beanFactory);
+ // applyBeanPropertyValues(beanFactory);
// 初始化给定的Bean实例
// initializeBean(beanFactory);
- // 在初始化之前应用 Bean 后处理器
- // applyBeanPostProcessorsBeforeInitialization(beanFactory);
-
- // 初始化后应用 Bean 后处理器
- // applyBeanPostProcessorsAfterInitialization(beanFactory);
-
// 销毁给定的Bean实例
// destroyBean(beanFactory);
@@ -121,29 +115,12 @@ public class AutowireCapableBeanFactoryDemo {
System.out.println("调用initializeBean前,MyService = " + myService);
}
- private static void applyBeanPostProcessorsBeforeInitialization(AutowireCapableBeanFactory beanFactory) {
- MyService myService = new MyService();
- System.out.println("调用applyBeanPostProcessorsBeforeInitialization前,MyService = " + myService);
- beanFactory.applyBeanPostProcessorsBeforeInitialization(myService, "myService");
- System.out.println("调用applyBeanPostProcessorsBeforeInitialization后,MyService = " + myService);
- }
-
- private static void applyBeanPostProcessorsAfterInitialization(AutowireCapableBeanFactory beanFactory) {
- MyService myService = new MyService();
- System.out.println("调用applyBeanPostProcessorsAfterInitialization前,MyService = " + myService);
- beanFactory.applyBeanPostProcessorsAfterInitialization(myService, "myService");
- System.out.println("调用applyBeanPostProcessorsAfterInitialization后,MyService = " + myService);
- }
-
private static void destroyBean(AutowireCapableBeanFactory beanFactory) {
beanFactory.destroyBean(new MyService());
}
private static void resolveDependency(AutowireCapableBeanFactory beanFactory) {
try {
- // 配置一个MyRepository,用于被依赖对象注入使用
- ((DefaultListableBeanFactory) beanFactory).registerSingleton("myRepository", new MyRepository());
-
DependencyDescriptor dependencyDescriptor = new DependencyDescriptor(MyService.class.getDeclaredField("myRepository"), false);
Object resolveDependency = beanFactory.resolveDependency(dependencyDescriptor, "myRepository");
System.out.println("resolveDependency = " + resolveDependency);