Java 在工厂使用Spring获得具有相同接口的注入bean的最佳方法是什么?
我创建了一个工厂,根据一些条件检查来决定应该返回什么样的最佳实现Java 在工厂使用Spring获得具有相同接口的注入bean的最佳方法是什么?,java,spring,design-patterns,factory-pattern,Java,Spring,Design Patterns,Factory Pattern,我创建了一个工厂,根据一些条件检查来决定应该返回什么样的最佳实现 // Factory @Component public class StoreServiceFactory { @Autowired private List<StoreService> storeServices; public StoreService getService(){ if(isActiveSale){ return storeSe
// Factory
@Component
public class StoreServiceFactory {
@Autowired
private List<StoreService> storeServices;
public StoreService getService(){
if(isActiveSale){
return storeServices.get("PublicStoreService")
}
return storeServices.get("PrivateStoreService")
}
}
//Service Implementations
@Service
@Qualifier("PublicStoreService")
public class PublicStoreService implements StoreService {
public getStoreBalanceScore(){
Do Stuff....
}
}
@Service
@Qualifier("PrivateStoreService")
public class PrivateStoreService implements StoreService {
public getStoreBalanceScore(){
Do Stuff....
}
}
// Controller
@Autowired
StoreServiceFactory storeServiceFactory;
@Override
public StoreData getStoreBalance(String storeId) {
StoreService storeService = storeServiceFactory.getService();
return simulationService.simulate(sellerId, simulation);
}
//工厂
@组成部分
公共类存储服务工厂{
@自动连线
私人列表存储服务;
公共存储服务getService(){
如果(可激活){
return storeServices.get(“PublicStoreService”)
}
return storeServices.get(“PrivateStoreService”)
}
}
//服务实现
@服务
@限定词(“PublicStoreService”)
公共类PublicStoreService实现StoreService{
公共getStoreBalanceScore(){
做事。。。。
}
}
@服务
@限定词(“PrivateStoreService”)
公共类PrivateStoreService实现StoreService{
公共getStoreBalanceScore(){
做事。。。。
}
}
//控制器
@自动连线
StoreServiceFactory StoreServiceFactory;
@凌驾
public StoreData getStoreBalance(字符串storeId){
StoreService StoreService=storeServiceFactory.getService();
返回simulationService.simulate(sellerId,simulation);
}
这个方法好吗?如果是,我如何以优雅的方式获得服务?
我只想使用注释,不使用配置。您应该使用映射而不是列表,并将字符串参数传递给getService方法
public class StoreServiceFactory {
@Autowired
private Map<String,StoreService> storeServices = new HashMap<>();
public StoreService getService(String serviceName){
if(some condition...){
// want to return specific implementation on storeServices map, but using @Qualifier os something else
storeServices.get(serviceName)
}
}
}
如果不喜欢使用字符串,可以为支持的实现定义枚举,并将其用作映射的键。您应该使用映射而不是列表,并将字符串参数传递给getService方法
public class StoreServiceFactory {
@Autowired
private Map<String,StoreService> storeServices = new HashMap<>();
public StoreService getService(String serviceName){
if(some condition...){
// want to return specific implementation on storeServices map, but using @Qualifier os something else
storeServices.get(serviceName)
}
}
}
如果不喜欢使用字符串,可以为支持的实现定义枚举,并将其用作映射的键。您应该使用映射而不是列表,并将字符串参数传递给getService方法
public class StoreServiceFactory {
@Autowired
private Map<String,StoreService> storeServices = new HashMap<>();
public StoreService getService(String serviceName){
if(some condition...){
// want to return specific implementation on storeServices map, but using @Qualifier os something else
storeServices.get(serviceName)
}
}
}
如果不喜欢使用字符串,可以为支持的实现定义枚举,并将其用作映射的键。您应该使用映射而不是列表,并将字符串参数传递给getService方法
public class StoreServiceFactory {
@Autowired
private Map<String,StoreService> storeServices = new HashMap<>();
public StoreService getService(String serviceName){
if(some condition...){
// want to return specific implementation on storeServices map, but using @Qualifier os something else
storeServices.get(serviceName)
}
}
}
如果不喜欢使用字符串,可以为支持的实现定义枚举,并将其用作映射的键。无需在代码上创建列表或映射。您可以使用GenericBeanFactoryAccessor直接从Spring上下文检索它。这有多种方法可以根据名称、注释等检索特定的bean。这避免了不必要的复杂性
您不需要在代码上创建列表或映射。您可以使用GenericBeanFactoryAccessor直接从Spring上下文检索它。这有多种方法可以根据名称、注释等检索特定的bean。这避免了不必要的复杂性
您不需要在代码上创建列表或映射。您可以使用GenericBeanFactoryAccessor直接从Spring上下文检索它。这有多种方法可以根据名称、注释等检索特定的bean。这避免了不必要的复杂性
您不需要在代码上创建列表或映射。您可以使用GenericBeanFactoryAccessor直接从Spring上下文检索它。这有多种方法可以根据名称、注释等检索特定的bean。这避免了不必要的复杂性
这张地图是如何填写的?映射是否应该是私有映射storeServices=newhashmap();相反?我的错。改变了地图。您可以通过spring本身填充地图。。。。不接收参数并在方法内部决定是个坏主意吗?StoreService StoreService=storeServiceFactory.getService();在方法getService()中进行一些验证并返回正确的实现?这个设计糟糕吗?这个验证应该在我的控制器中进行吗?你将如何在方法内部进行验证?@PaulHenry先生你的方法如何知道在没有提供一些输入的情况下使用哪个具体的实现?你会用什么逻辑来做这件事?这张地图是如何填写的?映射是否应该是私有映射storeServices=newhashmap();相反?我的错。改变了地图。您可以通过spring本身填充地图。。。。不接收参数并在方法内部决定是个坏主意吗?StoreService StoreService=storeServiceFactory.getService();在方法getService()中进行一些验证并返回正确的实现?这个设计糟糕吗?这个验证应该在我的控制器中进行吗?你将如何在方法内部进行验证?@PaulHenry先生你的方法如何知道在没有提供一些输入的情况下使用哪个具体的实现?你会用什么逻辑来做这件事?这张地图是如何填写的?映射是否应该是私有映射storeServices=newhashmap();相反?我的错。改变了地图。您可以通过spring本身填充地图。。。。不接收参数并在方法内部决定是个坏主意吗?StoreService StoreService=storeServiceFactory.getService();在方法getService()中进行一些验证并返回正确的实现?这个设计糟糕吗?这个验证应该在我的控制器中进行吗?你将如何在方法内部进行验证?@PaulHenry先生你的方法如何知道在没有提供一些输入的情况下使用哪个具体的实现?你会用什么逻辑来做这件事?这张地图是如何填写的?映射是否应该是私有映射storeServices=newhashmap();相反?我的错。改变了地图。您可以通过spring本身填充地图。。。。不接收参数并在方法内部决定是个坏主意吗?StoreService StoreService=storeServiceFactory.getService();在方法getService()中进行一些验证并返回t