2021-12-29 Spring中@Autowired和@Value的预解析和属性注入

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-12-29 Spring中@Autowired和@Value的预解析和属性注入相关的知识,希望对你有一定的参考价值。

参考技术A 先全局搜索Value.class,可以看到Spring中处理Value.class的就这几个类:

进入正题:
1,预解析
在AbstractAutowireCapableBeanFactory的doCreateBean方法中,applyMergedBeanDefinitionPostProcessors只是对Autowired注解,Value注解进行预解析,把信息保存在InjectionMetadata里:

以上只是预处理,并没有做属性的注入,只是把带Autowired注解和Value注解的属性和方法,保存在InjectionMetadata中。
2,属性注入
往下看populationBean方法:

Spring Boot AnnotationConfigEmbeddedWebApplicationContext无法填充动态类中的自动声明的声明字段

有一个JUnit测试如下:

内存编译器将一个字符串编译为on.the.fly类。该报告包含一些@Autowired声明的字段,如reportRepository等。

一切都按预期工作,动态类报告可以使用自动装配的字段实现其功能。

当它被放入MVC环境时,使用autowired应用程序上下文,即AnnotationConfigEmbeddedWebApplicationContext,无法填充autowired属性值。

使用debug,findCandidateNames方法return [],它应返回一个包含字段名称的数组,如测试环境中所示。请参考相关的源代码并给我一些建议。谢谢。

results =  compiler.compile("Report.java", reportClassString);

Class<?> clazz = compiler.loadClass("on.the.fly.Report", results);

IReport report = (IReport) applicationContext.getAutowireCapableBeanFactory().createBean(clazz);    
report.creatPdf(reportObject);

org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为'on.the.fly.AgreementReport'的bean时出错:通过字段'agreementReportProperties'表示不满意的依赖关系;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有类型为'com.lims.api.report.domain.dto.AgreementReportProperties'的限定bean可用:预计至少有1个bean可以作为autowire候选者。依赖注释:{org.springframework.beans.factory.annotation.Autowired(required = true)}在org.springframework的org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:587)。 beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91)位于sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)的com.lims.api.sample.web.controller.AgreementController.downloadPdfFile(AgreementController.java:161) )

答案

经过几天的研究,我找到了根本原因。只需将我的自定义类加载器作为spring上下文类加载器的子项,然后就可以成功注入依赖项。源代码如下:

class clazz = compiler.loadClass(“on.the.fly.AgreementReport”,results,context.getClassLoader());

以上是关于2021-12-29 Spring中@Autowired和@Value的预解析和属性注入的主要内容,如果未能解决你的问题,请参考以下文章

基于spring的web项目启动时预加载数据到ServletContext

用于 Spring Boot 应用程序的 JUnit @BeforeClass 非静态工作

热计算逗号并将其分隔在一个数组中?

Spring Boot AnnotationConfigEmbeddedWebApplicationContext无法填充动态类中的自动声明的声明字段

2021-12-29: 一个子序列的消除规则如下: 1在某一个子序列中,如果‘1‘的左边有‘0‘,那么这两个字符->“01“可以消除; 2 在某一个子序列中,如果‘3‘的左边有‘2‘,那么这两个字

2021-12-29: 一个子序列的消除规则如下: 1在某一个子序列中,如果‘1‘的左边有‘0‘,那么这两个字符->“01“可以消除; 2 在某一个子序列中,如果‘3‘的左边有‘2‘,那么这两个字