1

我想弄清楚爲什麼汽車佈線不適合我的情況。任何人都可以在這裏幫助我嗎?MentaContainer上的自動接線不工作?

public interface UserDAO { 
    // .. 
} 

public class DBUserDAO implements UserDAO { 
    private Connection conn; 

    public void setConn(Connection conn) { 
     this.conn = conn; 
    } 

    public Connection getConn() { 
     return conn; 
    } 

    // .. 
} 

Container container = new MentaContainer(); 

c.ioc(Connection.class, connFactory); 
c.ioc(UserDAO.class, DBUserDAO.class); 
c.autowire(Connection.class); 

Connection conn = c.get(Connection.class); // not NULL !!! good! 
UserDAO userDAO = c.get(UserDAO.class); 

System.out.println("CONN: " + ((DBUserDAO) userDAO).getConn()); // prints "CONN: null" 

我不知道爲什麼DBUserDAO中的連接總是空的! :(

編輯:我使用的MentaContainer

+0

什麼是MentaContainer? – JohnPristine

+0

@JohnPristine對不起!我將它添加到問題中... – chrisapotek

回答

2

這裏發生了什麼是,容器沒有辦法知道,你的bean屬性「參數conn」。因爲你沒有定義任何它必須假定它是「連接」。從c.autowire(Connection.class)c.autowire(Connection.class, "conn")一個簡單的變化將解決這個問題,或者你可以把你的房產改爲@SérgioMiche的「連線」我說這不僅僅是有效的,而且在我看來這也是一個更好的命名規則。

其實我最喜歡的解決方法是使用構造函數注入而不是setter注入。然後,你不必惹屬性名稱:

public interface UserDAO { 
    // .. 
} 

public class DBUserDAO implements UserDAO { 

    private final Connection conn; 

    public DBUserDAO(Connection conn) { 
     this.conn = conn; 
    } 

    // .. 
} 

Container container = new MentaContainer(); 

c.ioc(Connection.class, connFactory); 
c.ioc(UserDAO.class, DBUserDAO.class); 
c.autowire(Connection.class); 

因爲構造函數(或任何方法)在Java中參數沒有名字,容器將只嘗試匹配的類型,它會成功匹配autowired Connection.class添加到構造函數參數中。沒有連接就沒有DBUserDAO是不可能的。

1

不要使用它,但在看文檔,你的自動裝配是行不通的,因爲你已經把UserDAO的的背景下,所以我認爲,正確的是:

c.ioc(Connection.class, connFactory); 
c.autowire(Connection.class); //from now, every object that have connection will be autowired. 
c.ioc(UserDAO.class, DBUserDAO.class); 
+0

感謝您的幫助,但切換這些行並沒有改變任何內容。它仍然是空的。 :( – chrisapotek

+0

如果將屬性和方法的名稱更改爲'connection'而不是'conn',會發生什麼情況? –

+0

哇!這樣做!謝謝,塞爾吉奧! – chrisapotek