编辑: 我可以创建抽象类而不是接口,但这会使我在使用了它的多个类上进行更改。是否可以根据需要直接自动接线或在界面中使用存储库?
我已经介绍了
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
}