Spring Boot如何处理@Resource示例分析

 更新时间:2023年07月06日 11:34:24   作者:子瞻  
这篇文章主要为大家介绍了Spring Boot如何处理@Resource示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

先造一个测试用例

public class TransactionServiceTest {
    @Resource
    private IQrcodeAdScheduleService qrcodeAdScheduleService;
}

启动Spring Boot调用栈信息

图1

解析@Resource对应的bean信息

由上图可知,在创建完bean实例后,通过applyMergedBeanDefinitionPostProcessors()修改beanDefinition结构(针对这种场景可以理解为解析@Resource对应的bean信息)

protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {
        for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof MergedBeanDefinitionPostProcessor) {
                MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
                //执行CommonAnnotationBeanPostProcessor类postProcessMergedBeanDefinition()
                bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
            }
        }
    }

图2

CommonAnnotationBeanPostProcessor

有图2可知,处理@Resource的PostProcessor是“CommonAnnotationBeanPostProcessor”,然后看一下CommonAnnotationBeanPostProcessor的部分细节:

private InjectionMetadata buildResourceMetadata(final Class<?> clazz) {
        LinkedList<InjectionMetadata.InjectedElement> elements = new LinkedList<>();
        Class<?> targetClass = clazz;
        do {
            final LinkedList<InjectionMetadata.InjectedElement> currElements =
                    new LinkedList<>();
            ReflectionUtils.doWithLocalFields(targetClass, field -> {
                if (webServiceRefClass != null && field.isAnnotationPresent(webServiceRefClass)) {
                    if (Modifier.isStatic(field.getModifiers())) {
                        throw new IllegalStateException("@WebServiceRef annotation is not supported on static fields");
                    }
                    currElements.add(new WebServiceRefElement(field, field, null));
                }
                else if (ejbRefClass != null && field.isAnnotationPresent(ejbRefClass)) {
                    if (Modifier.isStatic(field.getModifiers())) {
                        throw new IllegalStateException("@EJB annotation is not supported on static fields");
                    }
                    currElements.add(new EjbRefElement(field, field, null));
                }
                //解析@Resource.class
                else if (field.isAnnotationPresent(Resource.class)) {
                    if (Modifier.isStatic(field.getModifiers())) {
                        throw new IllegalStateException("@Resource annotation is not supported on static fields");
                    }
                    if (!ignoredResourceTypes.contains(field.getType().getName())) {
                        currElements.add(new ResourceElement(field, field, null));
                    }
                }
            });
}

上面的代码块出现了期待已久的“Resource.class”关键字,我们就放心了。

我们再回顾一下,
其流程是这样的:在AbstractAutowireCapableBeanFactory.populateBean()->ibp.postProcessPropertyValue()->CommonAnnotationBeanPostProcessor.postProcessPropertyValue()去实例化@Resource作用的bean;

除了和处理@Autowired不是一个PostProcessor(处理@AutoWireds是用这个“AutowiredAnnotationBeanPostProcessor”PostProcessor)其他处理流程和@Autowired的处理流程一毛一样啊!

以上就是Spring Boot如何处理@Resource示例分析的详细内容,更多关于Spring Boot处理@Resource的资料请关注脚本之家其它相关文章!

相关文章

  • java web将数据导出为Excel格式文件代码片段

    java web将数据导出为Excel格式文件代码片段

    这篇文章主要为大家详细介绍了java web将数据导出为Excel格式文件代码片段,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Java8的Optional如何干掉空指针(示例详解)

    Java8的Optional如何干掉空指针(示例详解)

    这篇文章主要介绍了Java8的Optional如何干掉空指针,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • JDK动态代理原理:只能代理接口,不能代理类问题

    JDK动态代理原理:只能代理接口,不能代理类问题

    这篇文章主要介绍了JDK动态代理原理:只能代理接口,不能代理类问题。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Spring boot 整合 Okhttp3 并封装请求工具实例 详解

    Spring boot 整合 Okhttp3 并封装请求工具实例 详解

    OkHttp作为一款成熟、稳定、易用的HTTP客户端库,拥有较高的性能和多样化的功能,已被广泛应用于移动应用开发、Web服务端开发等领域,这篇文章主要介绍了Spring boot 整合 Okhttp3 并封装请求工具,需要的朋友可以参考下
    2023-08-08
  • Springboot开发OAuth2认证授权与资源服务器操作

    Springboot开发OAuth2认证授权与资源服务器操作

    这篇文章主要介绍了Springboot开发OAuth2认证授权与资源服务器操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • SpringBoot集成Druid实现多数据源的两种方式

    SpringBoot集成Druid实现多数据源的两种方式

    这篇文章主要介绍了SpringBoot集成Druid实现多数据源的两种方式,集成com.baomidou的方式和基于AOP手动实现多数据源原生的方式,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-03-03
  • SpringBoot项目加载配置文件的6种方式小结

    SpringBoot项目加载配置文件的6种方式小结

    这篇文章给大家总结了六种SpringBoot项目加载配置文件的方式,通过@value注入,通过@ConfigurationProperties注入,通过框架自带对象Environment实现属性动态注入,通过@PropertySource注解,yml外部文件,Java原生态方式注入这六种,需要的朋友可以参考下
    2023-09-09
  • 基于mybatis查询结果映射不到对象的处理

    基于mybatis查询结果映射不到对象的处理

    这篇文章主要介绍了mybatis查询结果映射不到对象的处理方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 如何使用pipeline和jacoco获取自动化测试代码覆盖率

    如何使用pipeline和jacoco获取自动化测试代码覆盖率

    这篇文章主要介绍了如何使用pipeline和jacoco获取自动化测试代码覆盖率,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • springcloud gateway设置context-path的操作

    springcloud gateway设置context-path的操作

    这篇文章主要介绍了springcloud gateway设置context-path的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论