1. 程式人生 > >Spring實例化bean順序問題,導致註入失敗

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

span this class 進行 exceptio exc ride 今天 end

我們可以通過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;
    }
}

問題成功解決。註入成功

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