![](/img/trans.png)
[英]Spring IoC - Dependency Injection -> NullPointerException
[英]spring 3 Dependency injection( IoC) with annotation
@Named("loginDetailsService")
public class LoginDetailsServiceImpl implements LoginDetailsService {
@Inject
@Named("loginDetailsDAO")
private LoginDetailsDAO loginDetailsDAO;
public List<UserLogin> loginDetails(UserLogin login) {
return loginDetailsDAO.loginDetails(login);
}
public class LoginDetailsDAOImpl extends HomeSessionFactory implements LoginDetailsDAO {
@SuppressWarnings("unchecked")
@Transactional(readOnly = true)
public List<UserLogin> loginDetails(UserLogin login) {
session = sessionFactory.openSession();
Query query = null;
try {
// blah...
} catch(Exception e){
}
return query.list();
}
public abstract class HomeSessionFactory {
@Inject
@Named("sessionFactory")
protected SessionFactory sessionFactory;
protected Session session;
}
春天的上下文文件:
<context:component-scan base-package="com.home.app" />
在某些示例中,我发现使用setter方法将loginDetailsDAO用作setLoginDetailsDAO(...){..}
是否需要使用setter方法? 什么时候需要使用getter / setter? 如果我不怎么办? 按照spring3.x格式,上述代码是否需要任何修改?
没有设置方法,我能够连接DAO实现。
使用setter方法的好处是,您可以以编程方式在单元测试中注入模拟依赖项。 仅此而已(至少对我而言)。
如果您要使用批注-我强烈建议这样做-那么您可以批注字段,设置器或构造函数。 只需要添加注释的内容即可。 如果是字段,则将使用反射将其直接设置在字段中。 如果是setter,则将使用依赖项调用该方法。 如果构造函数(这是我强烈建议的选择),则将以所有适当的依赖项调用构造函数。
我强烈建议使用构造函数注入,因为它使我们回到Java中真正的面向对象的编程中,在Java中,构造函数的工作是在有效状态下创建对象。 如果没有提供所有必需的依赖关系,则无法在Spring之中或之外(尤其是在单元测试中)使用该类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.