将存储库与接口的默认方法实现结合使用

时间:2019-12-23 14:19:29

标签: java spring-boot java-8 interface

编辑: 我可以创建抽象类而不是接口,但这会使我在使用了它的多个类上进行更改。是否可以根据需要直接自动接线或在界面中使用存储库?

我已经介绍了
Java 8 and Spring 4 : Use autowiring in interface
Difference between an Interface and an Abstract class?


我有一个主要模态,根据主要模态中的类型,我们还有另外两个模态,其中一个接口由三个类实现。我有一种方法可以根据类型无关紧要的数据库中的名称查找记录。为此,我需要在接口中创建方法(...),在所有3种实现中都必须使用@Override,这对我来说是不必要的,因为我必须仅在类A1Impl中的AImpl和重写方法中编写逻辑而A2Impl则毫无用处。为了消除此问题,我通过了 Java接口默认方法,我们可以编写一些逻辑,并且不需要在所有3种实现中都实现,但是问题是我需要对进行调用使用存储库的数据库,该存储库本身是一个接口,在该接口中我无法自动装配存储库。如何在接口中自动装配或使用存储库(扩展了JPA存储库)?

模式

public abstract class A implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private String type;

    ....
}

public class A1 extends A Serializable {      
        ....
}

public class A2 extends A Serializable {      
        ....
}

界面

public interface ServiceA {
    T method(...);
}

实施

public class AImpl implements ServiceA {

   @Override    
   T method(...) {
      //business logic
   }
}

public class A1Impl implements ServiceA {

   @Override    
   T method(...) {
      //This method will never gets called
   }
}


public class A2Impl implements ServiceA {      

   @Override    
   T method(...) {
      //This method will never gets called
   }
}

当前代码:

当前,我在使用反射的接口中使用默认方法,而我正在AImpl中调用该方法(不是@Overrided)。我不确定是否是一种好方法,以及如何在界面中直接使用/自动连接存储库。

界面

public interface ServiceA {

default Object method(String name) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, ClassNotFoundException, InstantiationException {
        try {
            return AImpl.class.getDeclaredMethod("findByNameIgnoreCase",String.class).invoke(AImpl.class.getConstructor().newInstance(),name);
        }catch (InvocationTargetException e) {
            e.getCause().printStackTrace();
            return null;
        }
    }
 }

实施

public class AImpl implements ServiceA {

   T method(...) {
      //method with business logic, not @override
   }
}

public class A1Impl implements ServiceA {
   method(...) is not implemented here
}


public class A2Impl implements ServiceA {      
   method(...) is not implemented here
}

0 个答案:

没有答案