Spring實例化bean順序問題,導致注入失敗


我們可以通過Spring進行非常方便的管理bean,只需要在類上面加一個注解就可以進行bean的注入,也就是所謂的DI。今天碰到了個小問題,來總結一下。

問題如下:

public abstract class TestBean {
    public String str;
    
    public TestBean(){
        this.str = initStr();
    }
    
    protected abstract String initStr();
}

public class TestSon extends TestBean {

    @Resource
    public String str;

    @Override
    protected String initStr() {
        return this.str;
    }
}

但是發現這個str始終是null。

原因:在實例化TestBean的時候不能確認str已經實例化,所以是先建立對象,再進行注入str的值。那么創建對象的時候,根據構造方法創建的對象中,還沒有注入str的值,所以只能為null。

解決:我們需要確認在str已經注入進來的情況下再對父類中的str賦值,那么這個時候需要子類實現 InitializingBean 這個接口,實現其中的afterPropertiesSet()

public class TestSon extends TestBean implements InitializingBean
{

    @Resource
    public String str;

    @Override
    protected String initStr() {
        return this.str;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        super.str = this.str;
    }
}

問題成功解決。注入成功


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM