【问题标题】:Spring alternative for Factory工厂的弹簧替代品
【发布时间】:2017-09-02 15:40:52
【问题描述】:

可能是重复的,请随意标记...我是 Spring 的新手。

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

接口用户服务->>用户服务A,用户服务B

使用哪个用户服务取决于一个名为 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. 

【问题讨论】:

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

标签: spring-boot


【解决方案1】:

您可以将具有“原型”范围的@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 用于根据提供者名称创建特定服务,正如您已经描述的那样。

使用 getProvider() 方法创建一个 UserProviderResolver 类,该方法返回当前请求或用户的提供者名称。

您可以在 UserProviderResolver 中 @Autowire HttpRequest 以获取对当前请求的访问权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    相关资源
    最近更新 更多