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