我有不同类型的Provider
(界面)类,例如ProviderA
,ProviderB
等等。在正常的世界中,我会创建一个名为ProviderFactory
的类,以便
public class ProviderFactory{
public Provider getProviderByName(String providerName){
for (Provider provider : availableProviders){
if (provider.getName.equalIgnoreCase(providerName)){
return provider;
}
}
return null;
}
}
现在,我想知道有没有提供annotations
来帮助我以单身方式使用这个工厂类?这些工厂本质上是静态的,可以在应用程序运行时配置它们。所以我在这里寻找单身实现。
答案 0 :(得分:1)
@Component
/ @Service
/ @Repository
/ @Controller
/ @RestController
正在使用单一作用域。
答案 1 :(得分:0)
您可以在Spring中实现工厂模式,如下所示:
@Component
public class ProviderFactory {
@Autowired
private ProviderA providerA;
@Autowired
private ProviderB providerB;
public static Provider getProviderByName(String providerName) {
if (providerName.equalsIgnoreCase("providerA")) {
return providerA;
} else if (providerName.equalsIgnoreCase("providerB")) {
return providerB;
}
}
}
答案 2 :(得分:0)
如果您使用其中一个刻板印码注释(Provider
,@Component
,@Service
,@Repository
或@Controller
对每个@RestController
类进行注释,然后你可以@Autowire
进入你的工厂:
@Component
public class ProviderFactory {
@Autowired
private List<Provider> availableProviders;
public Provider getProviderByName(String providerName) {
for (Provider provider : availableProviders) {
if (provider.getName.equalIgnoreCase(providerName)){
return provider;
}
}
return null;
}
}
但是,如果您打算在其他Spring bean中使用Provider
实例,我建议将@Qualifier
与@Autowire
结合使用,让Spring解决使用哪个实例,例如
@Component
public class ClassThatDependsOnSpecificProvider {
@Autowired
@Qualifier("providerA")
private Provider providerA;
}
有关@Qualifier
的更多信息,请参阅Spring参考文档的Fine-tuning annotation-based autowiring with qualifiers章节。