java - Spring创建相同接口(interface)的bean

标签 java spring javabeans

考虑一个包,其中许多类都实现一个接口(interface)Policy。该策略有一种方法canAccess。有 100 多个策略,例如 MenNotAllowedPolicyChiledNotAllowedPolicy 等,它们都实现了 Policy

属性文件描述哪些策略应用于哪些服务,例如:

BarrowBook=MenNotAllowedPolicy
BarrowMovie=MenNotAllowedPolicy,ChiledNotAllowedPolicy

要使用这些策略,有一个简单的循环,它获取一个人的服务名称,循环属性文件并为人运行策略。这段代码的主要部分是:

public canPersonAccessService(aPerson , aService){
  //the listPolicy will be read from property file
  for(String policyClassName: listPolicy){        
      Class<?> clazz = Class.forName("foo.bar.Policies"+ policyClassName);
      Policy policy = (policy) clazz.newInstance();
      policy.canAccess(aPerson);
  }
}

虽然 Ii 可以通过捕获 Policy 类来做得更好,但我想知道是否可以使用 Spring 做得更容易?!我决定使用 ClassName 作为键,以 class 实例 作为值,但如何创建它?!

这模仿了我的问题:)

最佳答案

定义一个名为Policy的接口(interface)作为所有策略实现的基础接口(interface)

interface Policy {
    boolean canAccess(User u);
}

为每个策略实现使用一个 Spring Bean - 确保在 @Component 中命名该 Bean,并确保它与属性文件中使用的名称相匹配

@Component("MenNotAllowedPolicy")
public static class MenNotAllowedPolicy implements Policy {
    public boolean canAcces(User u) {
      ...
    }
}

使检查策略的类也成为 Spring Bean,并在其中 Autowiring Spring ApplicationContext

@Component
public static class PolicyChecker {
    ...
    @Autowired
    private ApplicationContext appContext;
    ...
    public boolean canPersonAccessService(User person, ....) {
       for(String policyName: listPolicy) { 
          Policy policy = appContext.getBean(policyName, Policy.class);
        ....
        policy.canAccess(person);
        ....
      }
    }
}

我们通过 bean 名称查找策略,同时还确保该 bean 实现了如 getBean 方法的第二个参数所指示的 Policy 接口(interface)。

希望这有帮助!

关于java - Spring创建相同接口(interface)的bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31221596/

相关文章:

java - 将不同类中的 BigInteger 写入文件

java - 用户名密码AuthenticationFilter问题

java - 在 JUnit 测试期间动态更改 bean 范围

java - 如何使用 mvc 在数据库中存储图像或任何类型的文档

Java 自省(introspection) - 奇怪的行为

java - 使用 Java SWT 在透明图像上绘图

java - "No qualifying bean of type"用于 Spring Boot 中的 JPA 存储库

java - URL连接和内容长度: how much data is download?

java - 如何使用WebClient执行同步请求?

java - Junit 5 测试,获取 java.lang.IllegalStateException : Test classes cannot include @Bean methods