Spring Boot @Autowired @Resource属性赋值时机探究

 更新时间:2023年07月06日 10:49:27   作者:子瞻  
这篇文章主要为大家介绍了Spring Boot @Autowired @Resource属性赋值时机,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

@Resource

先贴出测试类

@Service
public class TransactionServiceTest {
    @Resource
    private IQrcodeAdScheduleService qrcodeAdScheduleService;
}

Spring Boot启动之后调用栈信息

图1

图2

由图1,图2可知InjectionMetadata.inject()执行属性织入逻辑,下面是部分细节

protected void inject(Object target, @Nullable String requestingBeanName, @Nullable PropertyValues pvs)
                throws Throwable {
            if (this.isField) {
                Field field = (Field) this.member;
                ReflectionUtils.makeAccessible(field);
                //通过反射对目标target对象也就是我们之前定义的TransactionServiceTest的属性赋值
                field.set(target, getResourceToInject(target, requestingBeanName));
            }
}

其中,CommonAnnotationBeanPostProcessor.ResourceElement的member属性存储的是Filed信息,对于本示例就是:

图3

@Autowired

对于@Autowired来说,就是AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement.inject():

protected void inject(Object bean, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable {
            Field field = (Field) this.member;
            Object value;
            if (this.cached) {
                value = resolvedCachedArgument(beanName, this.cachedFieldValue);
            }
            else {
                DependencyDescriptor desc = new DependencyDescriptor(field, this.required);
                desc.setContainingClass(bean.getClass());
                Set<String> autowiredBeanNames = new LinkedHashSet<>(1);
                Assert.state(beanFactory != null, "No BeanFactory available");
                TypeConverter typeConverter = beanFactory.getTypeConverter();
                try {
                    //递归调用createBean()实例化目标bean的属性bean实例
                    value = beanFactory.resolveDependency(desc, beanName, autowiredBeanNames, typeConverter);
                }
                catch (BeansException ex) {
                    throw new UnsatisfiedDependencyException(null, beanName, new InjectionPoint(field), ex);
                }
                synchronized (this) {
                    if (!this.cached) {
                        if (value != null || this.required) {
                            this.cachedFieldValue = desc;
                            registerDependentBeans(beanName, autowiredBeanNames);
                            if (autowiredBeanNames.size() == 1) {
                                String autowiredBeanName = autowiredBeanNames.iterator().next();
                                if (beanFactory.containsBean(autowiredBeanName) &&
                                        beanFactory.isTypeMatch(autowiredBeanName, field.getType())) {
                                    this.cachedFieldValue = new ShortcutDependencyDescriptor(
                                            desc, autowiredBeanName, field.getType());
                                }
                            }
                        }
                        else {
                            this.cachedFieldValue = null;
                        }
                        this.cached = true;
                    }
                }
            }
            if (value != null) {
                //通过field进行赋值
                ReflectionUtils.makeAccessible(field);
                field.set(bean, value);
            }
        }
}

其他的流程一毛一样啊~

以上就是Spring Boot @Autowired @Resource属性赋值时机探究的详细内容,更多关于SpringBoot @Autowired @Resource的资料请关注脚本之家其它相关文章!

相关文章

  • Java EasyExcel读写excel如何解决poi读取大文件内存溢出问题

    Java EasyExcel读写excel如何解决poi读取大文件内存溢出问题

    这篇文章主要介绍了Java EasyExcel读写excel如何解决poi读取大文件内存溢出问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • 浅谈Java springboot日志管理

    浅谈Java springboot日志管理

    这篇文章主要介绍了浅谈Java springboot日志管理,文中有非常详细的代码示例,对正在学习Java的小伙伴们有很好的帮助哟,需要的朋友可以参考下
    2021-05-05
  • SpringBoot + JPA @ManyToMany的操作要点说明

    SpringBoot + JPA @ManyToMany的操作要点说明

    这篇文章主要介绍了SpringBoot + JPA @ManyToMany的操作要点说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java线程中断的本质深入理解

    Java线程中断的本质深入理解

    Java的中断是一种协作机制。也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己,本文将详细介绍,需要了解的朋友可以参考下
    2012-12-12
  • SpringBoot在项目停止(服务停止/关闭退出)之后执行的方法

    SpringBoot在项目停止(服务停止/关闭退出)之后执行的方法

    这篇文章主要给大家介绍了SpringBoot在项目停止(服务停止/关闭退出)之后执行的两种方法,实现DisposableBean接口和使用@PreDestroy注解,文中有详细的代码讲解,具有一定的参考价值,需要的朋友可以参考下
    2023-12-12
  • Java中控制多线程顺序执行的六种实现方案

    Java中控制多线程顺序执行的六种实现方案

    在多线程编程中,线程的执行顺序本质上是不确定的,由操作系统调度器决定,但在某些业务场景中,我们需要确保线程按照特定顺序执行,所以本文介绍了Java中控制多线程顺序执行的六种实现方案,需要的朋友可以参考下
    2025-09-09
  • SpringCloud Ribbon 负载均衡的实现

    SpringCloud Ribbon 负载均衡的实现

    Ribbon是一个客户端负载均衡器,它提供了对HTTP和TCP客户端的行为的大量控制。这篇文章主要介绍了SpringCloud Ribbon 负载均衡的实现,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 详解Spring boot/Spring 统一错误处理方案的使用

    详解Spring boot/Spring 统一错误处理方案的使用

    这篇文章主要介绍了详解Spring boot/Spring 统一错误处理方案的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • java下载指定文件并返回给前端返回流文件的实现步骤

    java下载指定文件并返回给前端返回流文件的实现步骤

    在Java中我们可以根据文件地址返回一个文件流,以便对文件进行读取、写入等操作,下面这篇文章主要给大家介绍了关于java下载指定文件并返回给前端返回流文件的实现步骤,需要的朋友可以参考下
    2024-03-03
  • idea中打开项目时import project和open区别详解

    idea中打开项目时import project和open区别详解

    本文主要介绍了idea中打开项目时import project和open区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06

最新评论