ResourcePatternResolver接口源码分析

master
xuchengsheng 2023-11-27 16:14:31 +08:00
parent cb380b779e
commit 6f37c9030a
9 changed files with 388 additions and 92 deletions

View File

@ -68,7 +68,7 @@
- [`ResourceLoader`](spring-resources/spring-resource-resourceLoader/README.md):资源获取核心接口,实现统一加载不同位置资源的策略。<img src="https://img.shields.io/badge/Level-%E7%AE%80%E5%8D%95-0099ff"></img> - [`ResourceLoader`](spring-resources/spring-resource-resourceLoader/README.md):资源获取核心接口,实现统一加载不同位置资源的策略。<img src="https://img.shields.io/badge/Level-%E7%AE%80%E5%8D%95-0099ff"></img>
- [`ResourcePatternResolver`](spring-resources/spring-resource-resourcePatternResolver/README.md):资源模式解析接口,支持位置通配符,用于加载应用程序中的资源。<img src="https://img.shields.io/badge/Level-%E7%AE%80%E5%8D%95-0099ff"></img> - [`ResourcePatternResolver`](spring-resources/spring-resource-resourcePatternResolver/README.md):资源模式解析接口,多位置通配符支持,用于加载应用中的资源。<img src="https://img.shields.io/badge/Level-%E7%AE%80%E5%8D%95-0099ff"></img>
- [`DocumentLoader`](spring-resources/spring-resource-documentLoader/README.md)XML文档加载解析核心接口支持后台自动配置Spring应用。<img src="https://img.shields.io/badge/Level-%E7%AE%80%E5%8D%95-0099ff"></img> - [`DocumentLoader`](spring-resources/spring-resource-documentLoader/README.md)XML文档加载解析核心接口支持后台自动配置Spring应用。<img src="https://img.shields.io/badge/Level-%E7%AE%80%E5%8D%95-0099ff"></img>
- 元数据与过滤 - 元数据与过滤

View File

@ -4,38 +4,24 @@
✒️ **作者** - Lex 📝 **博客** - [掘金](https://juejin.cn/user/4251135018533068/posts) 📚 **源码地址** - [github](https://github.com/xuchengsheng/spring-reading) ✒️ **作者** - Lex 📝 **博客** - [掘金](https://juejin.cn/user/4251135018533068/posts) 📚 **源码地址** - [github](https://github.com/xuchengsheng/spring-reading)
### 、基本描述 ### 、基本描述
`AutowireCapableBeanFactory`接口是Spring框架中位于`org.springframework.beans.factory.config`包下的关键接口,扩展自`BeanFactory`主要提供了在运行时进行Bean自动装配和创建的高级功能。其核心方法`createBean`允许动态创建Bean实例并进行自动装配解决了Bean之间的依赖关系而其他方法如`autowireBean`和`applyBeanPostProcessorsBeforeInitialization`则提供了更细粒度的控制和定制点使我们能够在Bean生命周期的不同阶段进行干预实现更灵活的Bean管理和配置。这一接口的存在增强了Spring IoC容器的功能使其能够更好地适应复杂系统的需求。 `AutowireCapableBeanFactory`接口是Spring框架中位于`org.springframework.beans.factory.config`包下的关键接口,扩展自`BeanFactory`主要提供了在运行时进行Bean自动装配和创建的高级功能。其核心方法`createBean`允许动态创建Bean实例并进行自动装配解决了Bean之间的依赖关系而其他方法如`autowireBean`和`applyBeanPostProcessorsBeforeInitialization`则提供了更细粒度的控制和定制点使我们能够在Bean生命周期的不同阶段进行干预实现更灵活的Bean管理和配置。这一接口的存在增强了Spring IoC容器的功能使其能够更好地适应复杂系统的需求。
### 、主要功能 ### 、主要功能
1. **Bean的创建和初始化** 1. **Bean的创建和初始化**
+ 通过`createBean`方法可以创建一个新的Bean实例并在创建过程中执行完整的初始化包括所有适用的`BeanPostProcessor`的回调。 + 通过`createBean`方法可以创建一个新的Bean实例并在创建过程中执行完整的初始化包括所有适用的`BeanPostProcessor`的回调。
2. **自动装配** 2. **自动装配**
+ 提供了不同的自动装配模式,包括按名称、按类型、按构造函数等,通过`autowire`和`autowireBeanProperties`方法实现对Bean属性的自动注入。 + 提供了不同的自动装配模式,包括按名称、按类型、按构造函数等,通过`autowire`和`autowireBeanProperties`方法实现对Bean属性的自动注入。
3. **Bean配置和后处理器应用** 3. **Bean配置和后处理器应用**
+ 通过`configureBean`方法可以配置已存在的Bean实例应用属性值、工厂回调等同时执行所有`BeanPostProcessor`的回调。 + 通过`configureBean`方法可以配置已存在的Bean实例应用属性值、工厂回调等同时执行所有`BeanPostProcessor`的回调。
4. **定制化初始化和销毁过程** 4. **定制化初始化和销毁过程**
+ 通过`initializeBean`方法可以在Bean初始化过程中应用定制化的操作例如执行初始化回调、应用后处理器等。还提供了`destroyBean`方法用于销毁Bean实例。 + 通过`initializeBean`方法可以在Bean初始化过程中应用定制化的操作例如执行初始化回调、应用后处理器等。还提供了`destroyBean`方法用于销毁Bean实例。
5. **解析依赖** 5. **解析依赖**
+ 通过`resolveDependency`方法,可以解析指定的依赖关系,支持字段、方法、构造函数等各种依赖注入方式。 + 通过`resolveDependency`方法,可以解析指定的依赖关系,支持字段、方法、构造函数等各种依赖注入方式。
6. **Bean实例的生命周期管理**
+ 提供了应用`BeanPostProcessor`的回调允许在Bean的初始化前后应用定制的处理逻辑以及执行销毁前的操作。
7. **解析Bean**
+ 提供了解析指定类型和名称的Bean实例的方法包括通过`resolveNamedBean`解析唯一匹配的Bean实例。
8. **依赖检查:**
+ 提供`dependencyCheck`方法用于检查Bean的依赖关系是否满足要求。
9. **Bean的销毁回调**
+ 通过`destroyBean`方法允许在销毁Bean实例时执行自定义的清理和回收操作。
10. **提供Bean的属性赋值**
+ 通过`applyPropertyValues`方法支持对Bean属性进行手动赋值实现在运行时动态修改Bean的属性。
11. **提供Bean的类型转换**
+ 通过`getTypeConverter`方法,支持在运行时进行类型转换,确保属性值正确地转换为目标类型。
12. **Bean实例的后处理**
+ 通过`postProcessBeanInstance`方法允许在创建Bean实例后进行自定义的处理如更改Bean的内部状态或执行其他定制逻辑。
### 、接口源码 ### 四、接口源码
从`AutowireCapableBeanFactory`接口源码中看出它承担了创建、配置和生命周期管理Bean实例的任务。通过定义常量和方法它提供了细粒度的控制包括特定的自动装配策略、初始化过程、属性注入、后处理器应用以及销毁阶段。 从`AutowireCapableBeanFactory`接口源码中看出它承担了创建、配置和生命周期管理Bean实例的任务。通过定义常量和方法它提供了细粒度的控制包括特定的自动装配策略、初始化过程、属性注入、后处理器应用以及销毁阶段。
@ -350,10 +336,186 @@ public interface AutowireCapableBeanFactory extends BeanFactory {
} }
``` ```
### 六、主要实现 ### 五、最佳实践
### 七、最佳实践 使用`AnnotationConfigApplicationContext`创建了Spring应用程序上下文手动注册了一个后置处理器`MyBeanPostProcessor`与一个单例Bean`MyRepository`),最后获取了`AutowireCapableBeanFactory`。
### 八、与其他组件的关系 ```java
public static void main(String[] args) {
// 创建 ApplicationContext
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfiguration.class);
// 配置一个后置处理器用于验证Bean的初始化前后拦截信息打印
applicationContext.getBeanFactory().addBeanPostProcessor(new MyBeanPostProcessor());
// 注册一个MyRepository的Bean对象
applicationContext.getBeanFactory().registerSingleton("myRepository", new MyRepository());
// 获取 AutowireCapableBeanFactory
AutowireCapableBeanFactory beanFactory = applicationContext.getAutowireCapableBeanFactory();
}
```
`MyService`是一个经典的Spring Bean类通过`@Autowired`和`@Value`实现了对其他Bean和配置属性的注入。它实现了`BeanNameAware`、`InitializingBean`和`DisposableBean`接口分别在Bean分配名称、属性设置完成后和Bean销毁时执行相应的生命周期方法最后通过调用`toString()`方法提供了方便的信息展示。
```java
public class MyService implements BeanNameAware, InitializingBean, DisposableBean {
@Autowired
private MyRepository myRepository;
@Value("${java.home}")
private String javaHome;
@Override
public void setBeanName(String name) {
System.out.println("MyService.setBeanName方法被调用了");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("MyService.afterPropertiesSet方法被调用了");
}
@Override
public void destroy() throws Exception {
System.out.println("MyService.destroy方法被调用了");
}
@Override
public String toString() {
return "MyService{" +
"myRepository=" + myRepository +
", javaHome='" + javaHome + '\'' +
'}';
}
}
```
`MyBeanPostProcessor`是一个自定义的Bean后置处理器实现了Spring的`BeanPostProcessor`接口。在Bean的初始化前后它分别调用`postProcessBeforeInitialization`和`postProcessAfterInitialization`方法在这个具体的实现中我们简单地输出了一条日志显示了被处理的Bean的名称。
```java
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("MyBeanPostProcessor#postProcessBeforeInitialization方法被调用了,Bean名称 = " + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("MyBeanPostProcessor#postProcessBeforeInitialization方法被调用了,Bean名称 = " + beanName);
return bean;
}
}
```
#### createBean
通过`AutowireCapableBeanFactory`的`createBean`方法,手动创建了一个`MyService`类型的Bean实例。
```java
private static void createBean(AutowireCapableBeanFactory beanFactory) {
MyService myService = beanFactory.createBean(MyService.class);
System.out.println("调用createBean方法,创建Bean对象 = " + myService);
}
```
运行结果发现,在`MyService`的生命周期中,`setBeanName`、`afterPropertiesSet`等回调方法都被成功触发说明Bean的初始化过程正常执行。同时`MyBeanPostProcessor`的后置处理器也在初始化前后成功拦截并输出了Bean的名称。最重要的是`MyService`中的`myRepository`和通过`@Value`注解注入的`javaHome`属性都成功被注入,表明依赖注入的过程也正常进行。
```java
MyService.setBeanName方法被调用了
MyBeanPostProcessor#postProcessBeforeInitialization方法被调用了,Bean名称 = com.xcs.spring.service.MyService
MyService.afterPropertiesSet方法被调用了
MyBeanPostProcessor#postProcessBeforeInitialization方法被调用了,Bean名称 = com.xcs.spring.service.MyService
调用createBean方法,创建Bean对象 = MyService{myRepository=com.xcs.spring.repository.MyRepository@5b03b9fe, javaHome='D:\install\jdk-11'}
```
#### configureBean
通过`AutowireCapableBeanFactory`的`configureBean`方法手动配置Bean。首先通过`registerBeanDefinition`方法注册了一个名为 "myService" 的`RootBeanDefinition`表示要配置的Bean的定义。接着创建了一个新的`MyService`实例,并通过`configureBean`方法对该实例进行配置,指定了使用之前注册的 "myService" Bean 定义。在方法执行前后,分别输出了`MyService`的实例信息,观察是否成功进行了配置。
```java
private static void configureBean(AutowireCapableBeanFactory beanFactory) {
// 配置一个RootBeanDefinition
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("myService", new RootBeanDefinition(MyService.class));
MyService myService = new MyService();
System.out.println("调用configureBean前,MyService = " + myService);
beanFactory.configureBean(myService, "myService");
System.out.println("调用configureBean后,MyService = " + myService);
}
```
运行结果发现,通过`configureBean`方法配置`MyService`实例的过程与使用`createBean`方法创建实例的结果相似。在调用`configureBean`之前,`MyService`的实例信息显示属性都为null。然后`setBeanName`、`postProcessBeforeInitialization`、`afterPropertiesSet`等回调方法依次被触发表明Bean的初始化过程正常执行。最终调用`configureBean`之后,`MyService`的实例信息显示成功注入了`myRepository`和通过`@Value`注解注入的`javaHome`属性。
```java
调用configureBean前,MyService = MyService{myRepository=null, javaHome='null'}
MyService.setBeanName方法被调用了
MyBeanPostProcessor#postProcessBeforeInitialization方法被调用了,Bean名称 = myService
MyService.afterPropertiesSet方法被调用了
MyBeanPostProcessor#postProcessBeforeInitialization方法被调用了,Bean名称 = myService
调用configureBean后,MyService = MyService{myRepository=com.xcs.spring.repository.MyRepository@5b03b9fe, javaHome='D:\install\jdk-11'}
```
#### autowireBean
通过`AutowireCapableBeanFactory`的`autowireBean`方法手动进行Bean的自动装配。首先创建了一个`MyService`实例,然后通过`autowireBean`方法对该实例进行自动装配。在方法执行前后,分别输出了`MyService`的实例信息,观察是否成功进行了自动装配。
```java
private static void autowireBean(AutowireCapableBeanFactory beanFactory) {
MyService myService = new MyService();
System.out.println("调用autowireBean前,MyService = " + myService);
beanFactory.autowireBean(myService);
System.out.println("调用autowireBean后,MyService = " + myService);
}
```
运行结果发现,使用`AutowireCapableBeanFactory`的`autowireBean`方法对一个新创建的`MyService`实例进行手动的自动装配。在调用`autowireBean`之前,`MyService`的实例信息显示属性都为null。然后调用`autowireBean`方法后,`MyService`的实例信息显示成功注入了`myRepository`属性,该属性引用了`com.xcs.spring.repository.MyRepository`的实例,以及通过`@Value`注解注入的`javaHome`属性,该属性的值为'D:\install\jdk-11'。
然而,需要注意的是,使用`autowireBean`方法并没有触发`BeanNameAware`接口中的`setBeanName`方法、`InitializingBean`接口中的`afterPropertiesSet`方法,以及自定义的`MyBeanPostProcessor`后置处理器的相应回调方法。这是因为`autowireBean`方法主要关注依赖注入而不涉及到完整的Bean生命周期管理。
```java
调用autowireBean前,MyService = MyService{myRepository=null, javaHome='null'}
调用autowireBean后,MyService = MyService{myRepository=com.xcs.spring.repository.MyRepository@5b03b9fe, javaHome='D:\install\jdk-11'}
```
#### autowire
使用`AutowireCapableBeanFactory`的`autowire`方法来创建并自动装配一个`MyService`类型的Bean。通过指定`AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE`参数,表示使用类型自动装配。在方法执行后,输出了通过`autowire`方法创建的`MyService`实例的信息。
```java
private static void autowire(AutowireCapableBeanFactory beanFactory) {
Object myService = beanFactory.autowire(MyService.class, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false);
System.out.println("调用autowire方法,创建Bean对象 =" + myService);
}
```
运行结果发现,通过`autowire`方法和`autowireBean`方法获得了相似的结果。
不过,需要注意的是,虽然结果相似,但是这两个方法的使用场景略有不同。`autowireBean`是直接对一个已有实例进行自动装配,而`autowire`方法则是根据指定的类型动态创建并自动装配一个Bean。因此具体使用哪一种方法取决于实际的需求和场景。
```java
调用autowire方法,创建Bean对象 =MyService{myRepository=com.xcs.spring.repository.MyRepository@4145bad8, javaHome='D:\install\jdk-11'}
```
#### autowireBeanProperties
使用`AutowireCapableBeanFactory`的`autowireBeanProperties`方法,对一个新创建的`MyService`实例进行自动属性装配。首先,创建了一个`MyService`实例,并输出了其初始状态。然后,通过`autowireBeanProperties`方法对该实例进行自动属性装配,使用的是`AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE`规则。最后,输出了`autowireBeanProperties`后的`MyService`实例信息,观察是否成功进行了自动属性装配。
```java
private static void autowireBeanProperties(AutowireCapableBeanFactory beanFactory) {
MyService myService = new MyService();
System.out.println("调用autowireBeanProperties前,MyService = " + myService);
beanFactory.autowireBeanProperties(myService, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false);
System.out.println("调用autowireBeanProperties后,MyService = " + myService);
}
```
运行结果发现,通过`autowireBeanProperties`方法与之前的`autowireBean`和`autowire`方法相比,得到了相似的结果。在调用`autowireBeanProperties`方法之前,`MyService`的实例信息显示属性都为null。然后调用`autowireBeanProperties`方法后,`MyService`的实例信息显示成功注入了`myRepository`属性,该属性引用了`com.xcs.spring.repository.MyRepository`的实例,以及通过`@Value`注解注入的`javaHome`属性,该属性的值为'D:\install\jdk-11'。
```
调用autowireBeanProperties前,MyService = MyService{myRepository=null, javaHome='null'}
调用autowireBeanProperties后,MyService = MyService{myRepository=com.xcs.spring.repository.MyRepository@4145bad8, javaHome='D:\install\jdk-11'}
```
### 九、常见问题

View File

@ -1,10 +1,15 @@
package com.xcs.spring; package com.xcs.spring;
import com.xcs.spring.config.MyBeanPostProcessor;
import com.xcs.spring.config.MyConfiguration; import com.xcs.spring.config.MyConfiguration;
import com.xcs.spring.controller.MyController; import com.xcs.spring.repository.MyRepository;
import com.xcs.spring.service.MyService; import com.xcs.spring.service.MyService;
import com.xcs.spring.service.impl.MyServiceImpl; import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.PropertyValue;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.beans.factory.config.DependencyDescriptor;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/** /**
@ -17,26 +22,133 @@ public class AutowireCapableBeanFactoryDemo {
// 创建 ApplicationContext // 创建 ApplicationContext
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfiguration.class); AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfiguration.class);
// 配置一个后置处理器用于验证Bean的初始化前后拦截信息打印
applicationContext.getBeanFactory().addBeanPostProcessor(new MyBeanPostProcessor());
// 注册一个MyRepository的Bean对象
applicationContext.getBeanFactory().registerSingleton("myRepository", new MyRepository());
// 获取 AutowireCapableBeanFactory // 获取 AutowireCapableBeanFactory
AutowireCapableBeanFactory beanFactory = applicationContext.getAutowireCapableBeanFactory(); AutowireCapableBeanFactory beanFactory = applicationContext.getAutowireCapableBeanFactory();
// 示例:全面创建新的 bean 实例 // 创建指定Bean名称的实例
MyService myService = beanFactory.createBean(MyServiceImpl.class); // createBean(beanFactory);
System.out.println("全面创建新的 bean 实例 = " + myService);
System.out.println(); // 对给定的Bean实例进行进一步的配置
// configureBean(beanFactory);
MyController autowireBean = new MyController(); // 对给定的Bean实例进行自动装配
System.out.println("调用autowireBean方法前,MyController: " + autowireBean); // autowireBean(beanFactory);
beanFactory.autowireBean(autowireBean);
System.out.println("调用autowireBean方法后,MyController: " + autowireBean);
System.out.println(); // 使用指定的自动装配模式创建Bean实例
// autowire(beanFactory);
MyController configureBean = new MyController(); // 对给定的Bean实例的属性进行自动装配
System.out.println("调用configureBean方法前,MyController: " + configureBean); // autowireBeanProperties(beanFactory);
beanFactory.configureBean(configureBean, "myController");
System.out.println("调用configureBean方法后,MyController: " + configureBean);
// 将属性值应用到给定的Bean实例
applyBeanPropertyValues(beanFactory);
// 初始化给定的Bean实例
// initializeBean(beanFactory);
// 在初始化之前应用 Bean 后处理器
// applyBeanPostProcessorsBeforeInitialization(beanFactory);
// 初始化后应用 Bean 后处理器
// applyBeanPostProcessorsAfterInitialization(beanFactory);
// 销毁给定的Bean实例
// destroyBean(beanFactory);
// 解析Bean之间的依赖关系
// resolveDependency(beanFactory);
}
private static void createBean(AutowireCapableBeanFactory beanFactory) {
MyService myService = beanFactory.createBean(MyService.class);
System.out.println("调用createBean方法,创建Bean对象 = " + myService);
}
private static void configureBean(AutowireCapableBeanFactory beanFactory) {
// 配置一个RootBeanDefinition
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("myService", new RootBeanDefinition(MyService.class));
MyService myService = new MyService();
System.out.println("调用configureBean前,MyService = " + myService);
beanFactory.configureBean(myService, "myService");
System.out.println("调用configureBean后,MyService = " + myService);
}
private static void autowireBean(AutowireCapableBeanFactory beanFactory) {
MyService myService = new MyService();
System.out.println("调用autowireBean前,MyService = " + myService);
beanFactory.autowireBean(myService);
System.out.println("调用autowireBean后,MyService = " + myService);
}
private static void autowire(AutowireCapableBeanFactory beanFactory) {
Object myService = beanFactory.autowire(MyService.class, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false);
System.out.println("调用autowire方法,创建Bean对象 =" + myService);
}
private static void autowireBeanProperties(AutowireCapableBeanFactory beanFactory) {
MyService myService = new MyService();
System.out.println("调用autowireBeanProperties前,MyService = " + myService);
beanFactory.autowireBeanProperties(myService, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false);
System.out.println("调用autowireBeanProperties后,MyService = " + myService);
}
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);
}
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);
}
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);
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
} }
} }

View File

@ -0,0 +1,23 @@
package com.xcs.spring.config;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
* @author xcs
* @date 20231127 1131
**/
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("MyBeanPostProcessor#postProcessBeforeInitialization方法被调用了,Bean名称 = " + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("MyBeanPostProcessor#postProcessBeforeInitialization方法被调用了,Bean名称 = " + beanName);
return bean;
}
}

View File

@ -1,8 +1,5 @@
package com.xcs.spring.config; package com.xcs.spring.config;
import com.xcs.spring.service.MyService;
import com.xcs.spring.service.impl.MyServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
/** /**
@ -11,8 +8,5 @@ import org.springframework.context.annotation.Configuration;
**/ **/
@Configuration @Configuration
public class MyConfiguration { public class MyConfiguration {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
} }

View File

@ -1,27 +0,0 @@
package com.xcs.spring.controller;
import com.xcs.spring.service.MyService;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.annotation.Autowired;
/**
* @author xcs
* @date 20231124 1450
**/
public class MyController implements BeanNameAware {
@Autowired
private MyService myService;
@Override
public String toString() {
return "MyController{" +
"myService=" + myService +
'}';
}
@Override
public void setBeanName(String name) {
System.out.println("MyController.setBeanName: " + name);
}
}

View File

@ -0,0 +1,8 @@
package com.xcs.spring.repository;
/**
* @author xcs
* @date 20231127 1136
**/
public class MyRepository {
}

View File

@ -1,10 +1,48 @@
package com.xcs.spring.service; package com.xcs.spring.service;
import com.xcs.spring.repository.MyRepository;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
/** /**
* @author xcs * @author xcs
* @date 20231124 1417 * @date 20231124 1417
**/ **/
public interface MyService { public class MyService implements BeanNameAware, InitializingBean, DisposableBean {
void greet(); @Autowired
private MyRepository myRepository;
@Value("${java.home}")
private String javaHome;
@Override
public void setBeanName(String name) {
System.out.println("MyService.setBeanName方法被调用了");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("MyService.afterPropertiesSet方法被调用了");
}
@Override
public void destroy() throws Exception {
System.out.println("MyService.destroy方法被调用了");
}
public void setJavaHome(String javaHome) {
this.javaHome = javaHome;
}
@Override
public String toString() {
return "MyService{" +
"myRepository=" + myRepository +
", javaHome='" + javaHome + '\'' +
'}';
}
} }

View File

@ -1,14 +0,0 @@
package com.xcs.spring.service.impl;
import com.xcs.spring.service.MyService;
/**
* @author xcs
* @date 20231124 1417
**/
public class MyServiceImpl implements MyService {
@Override
public void greet() {
System.out.println("Hello from MyService!");
}
}