java – 在抽象类中提供DI方法

在大多数情况下,我有很多组件具有由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
   }      
}

我想将ServiceC的setter和executeSomethingDependendOnServiceC()方法移动到抽象类.但是在Osgi中它与Bnd注释有什么关系呢?只是使用@Component注释该类是不起作用的,因为A和D将创建抽象类的不同实例,而@Component是alsp创建实例.

也许有人遇到同样的问题,并给我一些建议如何解决方案.至少一个最佳实践解决方案也会很好:)

解决方法

DS注释必须位于为组件实例化的类上.不支持超类上的注释.有人建议在未来的规范版本中进行更改.

你可以做的是将方法移动到超类,但是你需要简单地重写子类中的方法,以便可以在子类中对它进行注释.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...