[英]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);
}
}
尽管通过捕获Policy类可以使Ii变得更好,但是我想知道Spring是否可以使它更容易? 我决定将HashMap以ClassName
作为键,并将class instance
作为值,但是如何创建它呢?
这是我的问题的模仿:)
为所有策略实现定义一个称为Policy
的接口作为基本接口
interface Policy {
boolean canAccess(User u);
}
每个策略实现都有一个Spring @Component
确保在@Component
命名该bean,并确保它与属性文件中使用的名称匹配
@Component("MenNotAllowedPolicy")
public static class MenNotAllowedPolicy implements Policy {
public boolean canAcces(User u) {
...
}
}
使检查策略的类也成为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名称来查找policy,同时还要确保bean实现getBean
方法的第二个参数所指示的Policy接口。
希望这可以帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.