将DAO类声明为Spring autowire的类成员或方法参数?

时间:2016-05-02 11:29:05

标签: java spring

我是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();   
  }
}

2 个答案:

答案 0 :(得分:4)

以上都不是。虽然认为你不应该使用现场注入(见thisthis)。

除非你将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)如上所述,如果失败,那么您将在启动申请时通知