我是Spring autowire的初学者,并且已经看到了不同类型的autowire实现。
如下所示,有两种常用方法可以将持久层自动装配到服务层。
哪种方法可以将持久层自动装配到服务层?
@Service
public class SomeServiceImpl {
@Autowired
private CustomerDAO customerDAO;
public List<Customer> getAllCustomer() {
return customerDAO.getAllCustomer();
}
}
VS
@Service
public class SomeServiceImpl {
@Autowired
public List<Customer> getAllCustomer(CustomerDAO customerDAO) {
return customerDAO.getAllCustomer();
}
}
答案 0 :(得分:4)
以上都不是。虽然认为你不应该使用现场注入(见this和this)。
除非你将CustomerDAO
传递给自己,否则第二个人甚至不会工作。
而是创建字段final
并使用基于构造函数的注入。
@Service
public class SomeServiceImpl {
private final CustomerDAO customerDAO;
@Autowired
public SomeServiceImpl(CustomerDAO customerDAO) {
this.customerDAO= customerDAO;
}
}
仍然很容易测试,将dao传递给构造函数,无需传递它。没有什么是隐藏的(更少魔法),你仍然遵守OO规则(一个物体在施工后应该处于有效状态)。
您甚至可以在构造函数中进行验证,以检查传入的参数是否不是null
。
答案 1 :(得分:1)
一般来说,好的做法是将@Autowired放在构造函数而不是方法上。如果将它放在构造函数上,则可以验证注入的bean不是null并且在尝试启动应用程序时快速失败并在需要实际使用bean时避免NullPointerException。
没有优势
@Autowired
private CustomerDAO customerDAO;
1)您可以将它用于整个服务类。
2)如上所述,如果失败,那么您将在启动申请时通知