同时注册了AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor 后处理器,spring容器会先解析@Autowired还是@Resource注解
时间: 2024-02-07 18:33:14 浏览: 23
如果同时注册了@AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor后处理器,Spring容器会先解析@Autowired注解。因为@AutowiredAnnotationBeanPostProcessor在CommonAnnotationBeanPostProcessor之前被注册到容器中。所以会先处理@Autowired注解,然后是@Resource注解。但是需要注意的是,如果存在@Qualifier注解,则会按照属性名称和@Qualifier注解的名称来选择注入的Bean。
相关问题
@autowired @resource 源码对比
@Autowire和@Resource都是Spring框架中的注解,用于自动装配bean对象。
@Autowire注解是按照类型进行自动装配,即根据类型来自动注入实例对象。如果发现多个同类型对象,则根据标注@Primary的对象进行注入。当然,如果没有指定@Primary,则根据属性名字的字典顺序进行注入。
@Resource注解是按照名称进行自动装配,即根据bean的名称来自动注入实例对象。如果找不到对应名称的对象,则根据类型注入。如果属性没有指定名称,则属性名作为bean对象的名称进行注入。
对于源码实现上,@Autowire注解是使用AutowiredAnnotationBeanPostProcessor这个后置处理器进行处理的,而@Resource注解是使用CommonAnnotationBeanPostProcessor后置处理器进行处理的。
@AutowiredAnnotationBeanPostProcessor的实现类上使用了@Order注解来控制其执行顺序,该注解表示需要先于CommonAnnotationBeanPostProcessor执行。同时,该处理器基于Java的反射机制来实现bean的自动装配。
CommonAnnotationBeanPostProcessor的实现类上使用了@Component注解来表明该类是一个组件,同时使用了@PostConstruct和@PreDestroy注解来标注初始化和销毁方法。该处理器则是基于Java EE的注解实现的,即常用的@Inject、@EJB和@Resource等注解。
总的来说,两者的区别主要在于自动装配的方式和所依赖的注解不同。具体的使用需要根据具体情况进行选择。
@Autowired注解原理
@Autowired注解的原理是通过AutowiredAnnotationBeanPostProcessor类实现的。该类实现了MergedBeanDefinitionPostProcessor接口,并且通过实现接口中的postProcessMergedBeanDefinition方法,实现了注入类型的预解析。具体来说,@Autowired注解将需要依赖注入的属性信息封装到InjectionMetadata类中,该类中包含了需要注入的元素以及元素要注入到的目标类。而在InjectionMetadata类中,有两个子类AutowiredFieldElement和AutowiredMethodElement用于处理字段注入和方法注入。在Spring容器启动时,会遍历所有注册过的BeanPostProcessor接口实现类的实例,如果实例属于InstantiationAwareBeanPostProcessor类型的,则执行实例类的postProcessPropertyValues方法。而AutowiredAnnotationBeanPostProcessor继承了InstantiationAwareBeanPostProcessorAdapter类,间接实现了InstantiationAwareBeanPostProcessor接口,在该类的postProcessPropertyValues方法中完成对@Autowired注解的处理。