Внедрение конструктора Spring с использованием конфигурации java

У меня есть класс, который принимает следующий конструктор

    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);
}
}

Я делаю здесь инъекцию конструктора? Это правильный способ?

1
0
1 236
1

Ответы 1

Я бы не стал использовать 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 все это обработает.

Отличное объяснение. Одно уточнение, можете ли вы уточнить, «затем это можно настроить как bean-компонент, чтобы его можно было внедрить в приложение». Кроме того, правильный ли мой код для инъекции конструктора?

rakesh mehra 02.11.2018 09:33

Это хорошо объясняет! Можете ли вы представить какой-либо сценарий, в котором нам может потребоваться ввести список или карту? Я не мог придумать такой сценарий, где это могло бы быть полезно. Полагаю, чаще всего мы внедряем объекты, а не коллекцию (или) примитивных типов. Это?

rakesh mehra 02.11.2018 10:10

Правильно, обычно вы не хотите вводить состояние (например, список или карту), поскольку это действительно не имеет смысла - в идеале, если есть какое-либо предварительно определенное состояние, с которого должен начинаться класс, которое должно быть определено в конструкторе. Если вас устраивает ответ, примите его / проголосуйте за него

Markoorn 02.11.2018 10:29

Я уже сделал это: D, но моя репутация меньше 15, и это не влияет на мой голос :(

rakesh mehra 02.11.2018 10:37

Здесь EmployeeService, определенный в контроллере, является интерфейсом?

rakesh mehra 02.11.2018 13:03

Это может быть, но не обязательно - это может быть конкретная реализация или интерфейс. В этом примере это не так, как я определяю для него bean-компонент и называю new EmployeeService(...)

Markoorn 02.11.2018 13:54

И последнее, пожалуйста, уточнение. Правильно ли следующее утверждение? «EmployeeService зависит от SessionFactory, поэтому sessionFactory вводится в EmployeeService. А EmployeeController зависит от EmployeeService, и поэтому EmployeeService вводится в EmployeeController»

rakesh mehra 02.11.2018 15:36

Правильно - при загрузке контекста приложения в рамках сканирования компонентов он идентифицирует все компоненты (контроллер, службу и фабрику сеанса) и определяет порядок, в котором должны быть созданы экземпляры объектов, чтобы соблюдались все зависимости.

Markoorn 02.11.2018 20:02

Другие вопросы по теме