在大多数情况下,我有很多组件具有由OSGi声明服务注入的相同类.这些服务将用于执行某些逻辑,这些逻辑对于所有派生组件都是相同的.因此,为避免重复代码,最好使用抽象类.是否有可能将DI引用方法(set/unset)移动到抽象类.我正在使用Bnd.
例如:
@Component
public class B implements IA {
private ServiceC sc;
@Reference
public void setServiceC(ServiceC sc) {
this.sc = sc;
}
public void execute() {
String result = executeSomethingDependendOnServiceC();
// do something with result
}
protected String executeSomethingDependendOnServiceC() {
// execute some logic
}
}
@Component
public class D implements IA {
private ServiceC sc;
@Reference
public void setServiceC(ServiceC sc) {
this.sc = sc;
}
public void execute() {
String result = executeSomethingDependendOnServiceC();
// do something different with result
}
protected String executeSomethingDependendOnServiceC() {
// execute some logic
}
}
Run Code Online (Sandbox Code Playgroud)
我想将setter ServiceC和方法移动executeSomethingDependendOnServiceC()到抽象类.但是在OSGi中它与Bnd注释有什么关系呢?只是使用@Component注释该类不起作用,因为A并且D将创建抽象类的不同实例,并且@Component是alsp创建实例.
也许有人遇到同样的问题,并给我一些建议如何解决方案.至少一个最佳实践解决方案也会很好:)
DS批注必须在要为该组件实例化的类上。不支持超类的注释。有建议在将来的规范版本中进行更改。
您可以做的是将方法移到超类,但是您将需要在子类中平凡地重写该方法,以便可以在子类中对其进行注释。