一。问题描述

1.调用自主平台定时器的时候,注入失败。——被调用的类已经有@Component ,且相关的注入类已经有@Autowired  可是调用以后依旧为空。

2.Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected single matching bean but found 2: h2DataSource1,h2DataSource2

二。主要记录

问题1.

调用自主平台定时器的时候,注入失败。——被调用的类已经有@Component ,且相关的注入类已经有@Autowired  可是调用以后依旧为空。

 

————》百度说法,注入失败是因为如果是通过new实例化的对象,脱离了Spring的管理,所以获取不到Spring注解的属性值。

————》需要确定我定时器启动的时候,这个类是不是被new 了,于是我重写了被定时器调用方法所在类的构造方法,发现构造方法打印,说明的确是百度说的情况。

————》解决方案1:通过构造方法传入已有的注入对象,这种情况适用于 类A 调用类B的方法(B如果没有传入已经注入对象,那么会null),但是我的定时器方法是平台封装的,所以这个解决方法对我来说不合适()

————》解决方案2:在类A方法被调用的时候,用原始的方法,读取配置文件中注入的bean。一开始我由于不知道自动装配的时候,bean名是什么,于是在原有自动装配的情况下,加入了手动注入,在项目启动的时候,报错,于是引发了下面的第二个问题

————》第二个问题解决完以后,我先是使用原始方法ClassPathXmlApplicationContext读取配置文件中的bean。但是一个新的问题出现。由于我的配置文件关联了其他的配置文件,所以通过这种方法,关联了其他配置文件的参数均报错。

————》那么既然项目启动的时候就已经将bean开启加载了,那么我能不能读取已经加载的bean? 百度结果的确有 :ContextLoad.getCurrentWebApplicationContext().getbean()处理成功

 

问题2:Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected single matching bean but found 2: h2DataSource1,h2DataSource2(简单来说,就是spring配置了两个bean  h2DataSource1和h2DataSource2,这两个bean实现了同样的接口类(class 一样都为DataSource),于是在其他类注入的时候,发现对于同一个接口类DataSource,有两个bean, 不知道要选哪一个)

具体分析可参考:https://yq.aliyun.com/articles/616544

————》解决方案1:在注入的时候,使用@Qualifier表明使用哪一个bean.

@Autowired
@Qualifier(h2DataSource1)
Private datesoure DataSource;
 
@Autowired
@Qualifier(h2DataSource2)
Private datesoure DataSource;


所以我将原来有注入的都加上了@Qualifier .