我的问题是:我有一个基本接口和两个实现类。
服务类依赖于基本接口,代码如下:
@Component
public interface BaseInterface {}
@Component
public class ClazzImplA implements BaseInterface{}
@Component
public class ClazzImplB implements BaseInterface{}
而配置是这样的:
@Configuration
public class SpringConfig {
@Bean
public BaseInterface clazzImplA(){
return new ClazzImplA();
}
@Bean
public BaseInterface clazzImplB(){
return new ClazzImplB();
}
}
服务类依赖于基础接口,将决定通过某些业务逻辑自动连接哪个实现。代码是这样的:
@Service
@SpringApplicationConfiguration(SpringConfig.class)
public class AutowiredClazz {
@Autowired
private BaseInterface baseInterface;
private AutowiredClazz(BaseInterface baseInterface){
this.baseInterface = baseInterface;
}
}
这个想法引发了一个例外:无法自动连线。有多个bean属于BaseInterface
类型。
虽然可以使用@Qualifier来解决这个问题,但在这种情况下,我不能选择dependencies类。
@Autowired
@Qualifier("clazzImplA")
private BaseInterface baseInterface;
我试图阅读spring文档,它提供了一个基于构造函数的依赖注入
,但我仍然对这个问题感到困惑。
有人能帮我吗?
如果使用@autowed
,Spring会搜索与要自动连线的字段类型匹配的bean。在本例中,类型为BaseInterface
的bean不止一个。这意味着Spring不能毫不含糊地挑选一个匹配的豆子。
在这种情况下,您没有其他选择来明确声明bean Spring应该使用或解决歧义。
仅使用spring框架无法解决这一问题。您提到,基于某种逻辑,您需要一个BaseInterface实例。这个用例可以使用工厂模式来解决。创建一个Bean,它实际上是BaseInterface的工厂
@Component
public class BaseInterfaceFactory{
@Autowired
@Qualifier("clazzImplA")
private BaseInterface baseInterfaceA;
@Autowired
@Qualifier("clazzImplb")
private BaseInterface baseInterfaceB;
public BaseInterface getInstance(parameters which will decides what type of instance you want){
// your logic to choose Instance A or Instance B
return baseInterfaceA or baseInterfaceB
}
}
配置(无耻地抄袭了另一条评论)
@Configuration
public class SpringConfig {
@Bean(name="clazzImplA")
public BaseInterface clazzImplA(){
return new ClazzImplA();
}
@Bean(name="clazzImplB")
public BaseInterface clazzImplB(){
return new ClazzImplB();
}
}
服务类
@Service
@SpringApplicationConfiguration(SpringConfig.class)
public class AutowiredClazz {
@Autowired
private BaseInterfaceFactory factory;
public void someMethod(){
BaseInterface a = factory.getInstance(some parameters);
// do whatever with instance a
}
}
Spring混淆了您在配置类中声明的2个bean,因此您可以使用@Qualifer
注释以及@autowled
来通过指定哪个bean将被连接来消除混淆,将这些修改应用于您的配置类
@Configuration
public class SpringConfig {
@Bean(name="clazzImplA")
public BaseInterface clazzImplA(){
return new ClazzImplA();
}
@Bean(name="clazzImplB")
public BaseInterface clazzImplB(){
return new ClazzImplB();
}
}
然后在@autowired
注释
@Service
@SpringApplicationConfiguration(SpringConfig.class)
public class AutowiredClazz {
@Autowired
@Qualifier("the name of the desired bean")
private BaseInterface baseInterface;
private AutowiredClazz(BaseInterface baseInterface){
this.baseInterface = baseInterface;
}
}
大家好,我是Spring安保和jwt的新人。我正在我的spring boot项目中实现Jwt以确保用户登录安全,我使用的是spring boot 2.1.5,我不太了解spring boot 2中的新bean限制 @自动安装用户详细信息服务jwtUserDemailsService 谚语。。。无法自动连线。用户详细信息服务类型的 bean 不止一个。 谁能解释一下这里发生了什么问题,为什么我不能自
问题内容: 我在Spring定义了这样的地图: 然后,我将该bean自动装配为定义为的属性: 这样做时,会抛出一个异常,说: `Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘DutyCreator’: Injection of autowired
试图在SpringBoot应用程序中创建bean,但出现以下错误“无法自动连线。找不到“InstructionRepository”类型的bean” InstructionRepository在jar中用@Repository注解,是一个扩展Spring数据接口的接口 ScheduleProcessor是一种方法 当我尝试通过传递基本包值来添加@ComponentScan注释时,错误消失了,但是,
我想使用Jooq在postgres数据库中插入数据这是我的服务类 但是我有这个错误 无法自动连线。找不到“DSLContext”类型的bean。
问题内容: 我有一个通过调用构造函数实例化的类(Class ABC)。ABC类又具有通过自动接线注入的辅助类(XYZ类)。 我们的是基于Spring MVC的应用程序,在服务器启动时我看不到任何异常。 但是我仍然看到XYZ类为空。是否是因为Spring Container没有实例化ABC类? 在这种情况下,如何使用自动接线? 谢谢。 问题答案: 你可以使用这种方式在非spring bean类中使用
问题内容: 需要一些帮助,我刚刚开始学习Spring,似乎无法弄清楚我们的错: Application.java-没有包 User.java-包com.mapping UserDAO.java-包com.accesors Root.java-包com.controllers 当我运行项目时,我似乎得到了以下启示 堆栈跟踪: 据我了解,这意味着@ComponentScan没有检测到软件包 问题答案: