SpringBoot中動態代理導致的無法獲取到接口實現內容的問題

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

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章