我想弄清楚为什么自动接线不适合我的情况如下。有人能帮助我吗?
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
答案 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);