關於在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(); //調用父類的方法
}
}