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 中的连接总是为空!:(

编辑:我正在使用MentaContainer

4

2 回答 2

2

这里发生的事情是容器无法知道您的 bean 属性是“conn”。因为您没有定义任何内容,所以必须假定它是“连接”。c.autowire(Connection.class)从到的简单更改将解决问题。或者,您可以像@Sérgio Michels 所说的那样将您的属性更改为“连接”,这不仅有效,而且在我看来也是一个更好的命名约定。c.autowire(Connection.class, "conn")

实际上,我最喜欢的解决方法是使用构造函数注入而不是 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。

于 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 回答