关于在SpringBoot中,接口中的方法,无法获取到对应的实现,当然前提条件是因为该种实现方式是不正常的,暂时定义为反人类写法吧
具体表现如下:
定一个接口,里面定义对应的方法,如getName();
public interface ITest {
String getName();
}
定义一个抽像类:
public abstract class AbstractTest {
private String name="xiongxzh";
public final String getName(){
return name;
}
}
定义一个接口的实现类如下通过继承抽像方法:
public class TestImpl extends AbstractTest implements ITest{
}
如果采用类似于这样的方式实现的代码,在Springboot中,默认会采用jdk的动态代理进行代理类的实现,所以会在运行时,通过
@Resource
Itest test
void do(){
String xx=test.getName();
}
该段代码会返回null;
这是因为jdk的动态代理,因为是接口调用,但是TestImpl并没有实现接口的方法,所以会导到致返回null值
解决办法,不采用这种反人类的写法:
直接在实现类中,实现接口的方法,
public class TestImpl extends AbstractTest implements ITest{
public String getName(){
return suppper.getName();
}
}
推荐的写法,不在接口中定义跟抽像类同签名的方法,比如示例中改成String getMyName()
public interface ITest {
String getMyName();
}
public class TestImpl extends AbstractTest implements ITest{
public String getMyName(){
return getName(); //调用父类的方法
}
}