一、基本使用
- 主要是三个注解的使用,@Autowired,@Value,@Resource
二、实现步骤
- 拦截bean的创建
要想拦截bean,就需要处理spring bean生命周期事件,spring通过一些接口来处理事件,实现属性注入,需要 InstantiationAwareBeanPostProcessor接口来完成。 - 找到注解的字段,并注入值
获取被注解bean,然后从bean容器中中寻找响应类型的bean注入。
三、@Autowired,@Value是如何实现的
- 拦截bean的创建
- AutowiredAnnotationBeanPostProcessor实现了InstantiationAwareBeanPostProcessor接口
- spring-boot 在启动的时候向容器中注入了AutowiredAnnotationBeanPostProcessor
- 找到注解的字段,并注入值
- 通过AutowiredAnnotationBeanPostProcessor.postProcessProperties()和AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition()两个方法完成
- 每一个需要依赖注入的bean都被封装成了InjectionMetadata对象,每个要备注入的字段被封装成了AutowiredFieldElement对象
三、@Resource是如何实现的
- 拦截bean的创建
- CommonAnnotationBeanPostProcessor实现了InstantiationAwareBeanPostProcessor接口
- spring-boot 在启动的时候向容器中注入了CommonAnnotationBeanPostProcessor
- 找到注解的字段,并注入值
- CommonAnnotationBeanPostProcessor.postProcessProperties()和CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition()两个方法完成
- 每一个需要依赖注入的bean都被封装成了InjectionMetadata对象,每个要备注入的字段被封装成了ResourceElement对象