Ответ 1
Встраивание конструктора и свойств дает вам возможность легко инициализировать объект даже в среде без CDI, например unit test.
В среде, отличной от CDI, вы все равно можете просто использовать объект, просто передав конструктор arg.
OtherBean b = ....;
new MyBean(b);
Если вы просто используете полевую инъекцию, вы должны использовать отражение для доступа к полю, если оно является частным, например.
Если вы используете инъекцию свойств, вы также можете написать код в установщике. Таким образом, это зависит от ваших потребностей в реализации.
Сеттер против инъекции конструктора
В объектно-ориентированном программировании объект должен находиться в допустимом состоянии после построения, и каждый вызов метода изменяет состояние на другое допустимое состояние.
Для инъекции установщика это означает, что вам может потребоваться более сложная обработка состояния, поскольку после построения объект должен находиться в правильном состоянии. Даже если сеттер еще не был вызван. Таким образом, объект должен находиться в допустимом состоянии, даже если свойство не задано. Например. используя значение по умолчанию или нулевой объект.
Если у вас есть зависимость между существованием объекта и свойством, свойство должно быть либо аргументом конструктора. Это также сделает код более чистым, потому что, если вы используете параметр конструктора, вы документируете, что зависимость необходима.
Итак, вместо написания такого класса
public class CustomerDaoImpl implements CustomerDao {
private DataSource dataSource;
public Customer findById(String id){
// Is the dataSource set?!
Connection con = dataSource.getConnection();
...
return customer;
}
public void setDataSource(DataSource dataSource){
this.dataSource = dataSource;
}
}
вам следует либо использовать конструкторскую инъекцию
public class CustomerDaoImpl implements CustomerDao {
private DataSource dataSource;
public CustomerDaoImpl(DataSource dataSource){
if(dataSource == null){
throw new IllegalArgumentException("Parameter dataSource must not be null");
}
this.dataSource = dataSource;
}
public Customer findById(String id) {
Customer customer = null;
// We can be sure that the dataSource is not null
Connection con = dataSource.getConnection();
...
return customer;
}
}
Мое заключение
- Используйте свойства для каждой дополнительной зависимости.
- Используйте конструктор args для каждой обязательной зависимости.
PS: Мой блог Разница между pojos и java beans объясняет мое заключение более подробно.