Spring boot 工厂用弹簧替代品

Spring boot 工厂用弹簧替代品,spring-boot,Spring Boot,可能是重复的,请随时标记。。。我是春天的新手 我正在实现一个UserService,用于从不同的供应商获取用户详细信息, 所以我的班级结构是 接口UserService->>UserServiceA,UserServiceB 使用哪个用户服务取决于名为provider的字段。我的代码看起来像 public interface ExternalUserService { ExternalUserDTO getUserDetail(String username); } 实施- publi

可能是重复的,请随时标记。。。我是春天的新手

我正在实现一个UserService,用于从不同的供应商获取用户详细信息, 所以我的班级结构是

接口UserService->>UserServiceA,UserServiceB

使用哪个用户服务取决于名为provider的字段。我的代码看起来像

public interface ExternalUserService {
    ExternalUserDTO getUserDetail(String username);
}
实施-

public class GoogleUserService implements ExternalUserService{
    @Override
    public ExternalUserDTO getUserDetail(String username) {
        return user;
    }
}

public class FacebookUserService implements ExternalUserService{
    @Override
    public ExternalUserDTO getUserDetail(String username) {
        return user;
    }
}
我想以这种方式在我的代码中使用它,我不知道这是否可行,但试着看看是否可行

public class ExternalUserManager(String provider) {
    String provider;
    @Autowired
    ExternalUserService service; //This is supposed to come from some factory, dont know how to get it in spring context.

    public void doSomething(String username) {
        System.out.println(service.getUserDetail(username));
    }
}


Had it been in conventional java programming, I would have created a Factory called UserServiceFactory, which would have made the things straight. 

Can someone please help me on how much it is possible with spring, and if its possible, then how can I achieve it? We use Spring boot, so no xml config. 

您可以使用范围为“prototype”的@Bean注释方法作为工厂。 只要这个bean被注入到某个地方,Spring就会调用这个方法

import org.springframework.beans.factory.config.BeanDefinition;
...
@Bean
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public ExternalUserService externalUserService(UserServiceFactory factory,UserProviderResolver resolver) {
    .. create the user service depending on resolver.getProvider()
}
UserServiceFactory用于根据提供者名称创建特定服务,如您所述

创建一个类UserProviderResolver,其中包含一个方法getProvider(),该方法返回当前请求或用户的提供程序名称


您可以在UserProviderResolver中@Autowire HttpRequest来访问当前请求。

是否可能同时存在GoogleUserService和FacebookUserService?是的。。它们应该在同一个应用程序实例中使用。就像一个用户可以将他的两个配置文件链接到他的帐户。为什么不自动连接这两个配置文件呢?我将自动连接这两个配置文件,但我没有得到的是如何基于提供者获得适当的bean?我有点困惑。ExternalUserManager是Spring组件(单例Bean)。因此,设置字段提供程序意味着每个人都有相同的提供程序。那就是:公共类ExternalUserManager(字符串提供程序)在Java中也是不可能的。