Spring 创建相同接口的 beans
Spring creating beans of same interface
考虑一个包,其中许多 类 都实现了一个接口 Policy
。该政策有一种方法 canAccess
。有 100 多个策略,例如 MenNotAllowedPolicy
、 ChiledNotAllowedPolicy
……它们都实现了 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 可以通过遵守政策 类 变得更好,但我想知道是否可以通过 Spring 更轻松地做到这一点?!我决定使用 ClassName
作为键和 class instance
作为值的 HashMap,但是如何创建它?!
这是对我问题的模仿 :)
定义一个名为 Policy
的接口作为所有策略实现的基础接口
interface Policy {
boolean canAccess(User u);
}
每个策略实施都有一个 Spring Bean - 确保在 @Component
中命名 bean 并确保它与属性文件中使用的名称相匹配
@Component("MenNotAllowedPolicy")
public static class MenNotAllowedPolicy implements Policy {
public boolean canAcces(User u) {
...
}
}
使检查策略的 class 也是一个 Spring Bean,并在其中自动装配 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 实现 Policy 接口,如 getBean
方法的第二个参数所示。
希望对您有所帮助!
考虑一个包,其中许多 类 都实现了一个接口 Policy
。该政策有一种方法 canAccess
。有 100 多个策略,例如 MenNotAllowedPolicy
、 ChiledNotAllowedPolicy
……它们都实现了 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 可以通过遵守政策 类 变得更好,但我想知道是否可以通过 Spring 更轻松地做到这一点?!我决定使用 ClassName
作为键和 class instance
作为值的 HashMap,但是如何创建它?!
这是对我问题的模仿 :)
定义一个名为 Policy
的接口作为所有策略实现的基础接口
interface Policy {
boolean canAccess(User u);
}
每个策略实施都有一个 Spring Bean - 确保在 @Component
中命名 bean 并确保它与属性文件中使用的名称相匹配
@Component("MenNotAllowedPolicy")
public static class MenNotAllowedPolicy implements Policy {
public boolean canAcces(User u) {
...
}
}
使检查策略的 class 也是一个 Spring Bean,并在其中自动装配 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 实现 Policy 接口,如 getBean
方法的第二个参数所示。
希望对您有所帮助!