Spring @Qualifier是在所有bean中解析name,还是只在共享限定类型的bean中解析name

bfrts1fy  于 2023-06-29  发布在  Spring
关注(0)|答案(2)|浏览(144)

我刚到Spring,想知道@Qualifier如何解决DI。
如果我有一个阅读外部数据的接口,实现了读取本地文件(例如读取配置文件)和从数据库读取(例如读取业务数据),对调用者隐藏了实际的技术细节(它是一个DB还是一个LocalFile或其他东西,接口契约是否完整并不重要)。

public interface Reader { }

@Component
@Qualifier("LocalFileReader")
public class LocalFileReader implements Reader { }

@Component
@Qualifier("DbReader")
public class DbReader implements Reader { }

当我想注入Reader实现时

public class MyService {    
   @Autowired
   @Qualifier("LocalFileReader")
   private Reader reader;    
}

当Spring尝试查找Reader实现时,它会在所有Bean的所有定义的限定符中查找,还是只在Reader实现的限定符中查找?
在第二种情况下,这是否意味着我可以在不同的、不相关的bean上使用相同的“LocalFile”限定符,例如Reader的实现和Writer的实现?

public class MyService {    
   @Autowired
   @Qualifier("LocalFile")
   private Reader reader;  

   @Autowired
   @Qualifier("LocalFile")
   private Writer writer;  
}

@Qualifier("LocalFileReader")@Qualifier("LocalFileWriter")相比,它并没有带来太多的好处,但它帮助我理解了它是如何工作的。如果到目前为止我是对的,有没有一种方法可以告诉一次“对于整个对象使用本地文件bean”?

6tdlim6h

6tdlim6h1#

当Spring尝试查找Reader实现时,它会在所有Bean的所有定义的限定符中查找,还是只在Reader实现的限定符中查找?
不,@Autowired注解只搜索所需类型的bean。如果有多个实现,@Qualifier注解有助于选择特定的一个。换句话说,如果您有多个bean共享相同的名称但类型不同(即它们中只有一个被类型限定),则不需要@Qualifier注解。
在第二种情况下,这是否意味着我可以在不同的、不相关的bean上使用相同的“LocalFile”限定符,例如Reader的实现和Writer的实现?
当然可以

xzlaal3s

xzlaal3s2#

默认情况下,Spring按类型解析autowired条目。如果容器中有多个相同类型的bean可用,但无法使用限定符或其他机制解析,则框架将抛出NoUniqueBeanDefinitionException
因此,对于您的问题,它将查找Reader的实现。
我不确定是否可以对不同的类型使用相同的限定符名称,但是,如果您想要一些类似的功能,您需要查看Spring profiles,其中每个配置文件决定您想要注入依赖项的Bean

相关问题