MentaContainer上的自动接线无法正常工作?

时间:2012-11-20 00:28:02

标签: java dependency-injection inversion-of-control ioc-container autowired

我想弄清楚为什么自动接线不适合我的情况如下。有人能帮助我吗?

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

2 个答案:

答案 0 :(得分:2)

这里发生的事情是容器无法知道你的bean属性是“conn”。因为你没有定义任何东西,所以它必须假设它是“连接”。从c.autowire(Connection.class)c.autowire(Connection.class, "conn")的简单更改将解决问题。或者你可以将你的财产改为“连接”,因为@SérgioMichels说这不仅有效,但在我看来它也是一个更好的命名惯例。

实际上我最喜欢的解决方法是使用构造函数注入而不是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中的构造函数(或任何方法)参数没有名称,所以容器只会尝试匹配类型,并且它会成功地将自动装配的Connection.class与构造函数参数匹配。你没有连接的DBUserDAO是不可能的。

答案 1 :(得分:1)

永远不要使用它,但查看文档,您的autowire将无法工作,因为您已将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);