1

私は、自動配線が私の状況で機能しない理由を以下で理解しようとしています。誰かがここで私を助けることができますか?

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内で接続が常にnullである理由がわかりません。:(

編集:私はMentaContainerを使用しています

4

2 に答える 2

2

ここで起こったことは、コンテナがあなたのBeanプロパティが「conn」であることを知る方法がないということです。何も定義しなかったので、それが「接続」であると想定する必要があります。c.autowire(Connection.class)からに変更するだけで問題が解決します。または、@SérgioMichelsが言ったように、プロパティを「接続」に変更することもできます。これは、機能するだけでなく、私の意見ではより適切な命名規則でもあります。c.autowire(Connection.class, "conn")

実際、私のお気に入りの修正は、セッターインジェクションの代わりにコンストラクターインジェクションを使用することです。次に、プロパティ名をいじる必要はありません。

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のコンストラクター(または任意のメソッド)パラメーターには名前がないため、コンテナーは型の照合のみを試み、autowiredConnection.classとコンストラクターの引数の照合に成功します。また、接続なしでDBUserDAOを使用することはできません。

于 2012-11-20T01:24:59.817 に答える
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);
于 2012-11-20T00:45:17.820 に答える