BeanFactory 接口的默认实现类 DefaultBeanFactory 注入 Bean 属性的方法 populateBean(BeanDefinition, Object) 改动如下:
/** * @author mghio * @since 2021-03-07 */ public class DefaultBeanFactory extends DefaultSingletonBeanRegistry implements ConfigurableBeanFactory, BeanDefinitionRegistry { ... private final List<BeanPostProcessor> beanPostProcessors = new ArrayList<>(); private void populateBean(BeanDefinition bd, Object bean) { for (BeanPostProcessor postProcessor : this.getBeanPostProcessors()) { if (postProcessor instanceof InstantiationAwareBeanProcessor) { ((InstantiationAwareBeanProcessor) postProcessor).postProcessPropertyValues(bean, bd.getId()); } } ... } ... }总的来说整个使用 processor 的过程分为两步,首先在 AbstractApplicationContext 构造方法中注册我们自定义的 processor,然后再 DefaultBeanFactory 中调用其 postProcessPropertyValues 方法进行注入,至此使用在类字段上的 @Autowired 注解实现完成。
总结本文简要介绍了实现 Spring 的 @Autowired 注解(使用在类字段上的方式),其中比较麻烦的步骤是数据结构抽象部分,需要考虑到后期的扩展性和内部操作对使用者尽量透明,限于篇幅,只列出了部分核心实现代码,完整代码已上传至 GitHub ,感兴趣的朋友可以查看完整代码。