У меня есть класс, который принимает следующий конструктор
public Student(int id, String name, Map<String, List<String>> mapInject) {
super();
this.id = id;
this.name = name;
this.mapInject = mapInject;
}
И из Spring Java Config я ввожу аргументы конструктора, как показано ниже.
@Configuration
public class JavaConfig {
@Bean
public Employee getEmployeeBean() {
Map<String,List<String>> mapInject = new HashMap<String,List<String>>();
//Add map element
return new Employee(3123,"John",mapInject);
}
}
Я делаю здесь инъекцию конструктора? Это правильный способ?
Я бы не стал использовать Spring для создания этого bean-компонента, если только вы не хотите, чтобы ВСЕ сотрудники имели одинаковый идентификатор и имя, в чем я сомневаюсь.
Сила Spring - это внедрение зависимостей (DI), в котором вы определяете bean-компоненты для поставщиков, таких как менеджеры баз данных, службы и т. д., И вставляете их в свои компоненты. Определение @Bean, как у вас, бесполезно, поскольку теперь вы можете вводить только сотрудников с идентификатором 3123 и именем John.
Важно понимать, что то, что вы используете Spring, не означает, что ВСЕ нужно обрабатывать как bean-компонент - вам всегда будут нужны стандартные POJO для размещения и передачи состояния (например, ваш класс Employee), который не должен имеют какое-либо отношение к весне.
Внизу у вас может быть EmployeeService, например, который содержит бизнес-логику для извлечения сотрудников из базы данных или чего-то еще, затем его можно настроить как bean-компонент, чтобы его можно было внедрить в приложение.
РЕДАКТИРОВАТЬ
@Configuration
public class JavaConfig {
@Bean
@Autowired //assuming a sessionfactory been is configured elsewhere
public EmployeeService employeeService(final SessionFactory sessionfactory) {
return new EmployeeService(sessionFactory);
}
}
Затем вы можете ввести это где угодно (например, в контроллер):
@RestController
public class EmployeeController {
private final EmployeeService employeeService;
@Autowired
public EmployeeController(final EmployeeService employeeService) {
this.employeeService = employeeService;
}
}
Если EmployeeController не должен знать или заботиться о том, что userService имеет соединение с БД, и ему не нужно беспокоиться о его настройке, поскольку Spring все это обработает.
Это хорошо объясняет! Можете ли вы представить какой-либо сценарий, в котором нам может потребоваться ввести список или карту? Я не мог придумать такой сценарий, где это могло бы быть полезно. Полагаю, чаще всего мы внедряем объекты, а не коллекцию (или) примитивных типов. Это?
Правильно, обычно вы не хотите вводить состояние (например, список или карту), поскольку это действительно не имеет смысла - в идеале, если есть какое-либо предварительно определенное состояние, с которого должен начинаться класс, которое должно быть определено в конструкторе. Если вас устраивает ответ, примите его / проголосуйте за него
Я уже сделал это: D, но моя репутация меньше 15, и это не влияет на мой голос :(
Здесь EmployeeService, определенный в контроллере, является интерфейсом?
Это может быть, но не обязательно - это может быть конкретная реализация или интерфейс. В этом примере это не так, как я определяю для него bean-компонент и называю new EmployeeService(...)
И последнее, пожалуйста, уточнение. Правильно ли следующее утверждение? «EmployeeService зависит от SessionFactory, поэтому sessionFactory вводится в EmployeeService. А EmployeeController зависит от EmployeeService, и поэтому EmployeeService вводится в EmployeeController»
Правильно - при загрузке контекста приложения в рамках сканирования компонентов он идентифицирует все компоненты (контроллер, службу и фабрику сеанса) и определяет порядок, в котором должны быть созданы экземпляры объектов, чтобы соблюдались все зависимости.
Отличное объяснение. Одно уточнение, можете ли вы уточнить, «затем это можно настроить как bean-компонент, чтобы его можно было внедрить в приложение». Кроме того, правильный ли мой код для инъекции конструктора?