Внедрение зависимостей в конструктор весной

Внедрение зависимостей в конструктор весной

1. Вступление

Возможно, одним из наиболее важных принципов разработки современного программного обеспечения являетсяDependency Injection (DI), который вполне естественно вытекает из другого критически важного принципа:Modularity.

В этой статье будет рассмотрен конкретный тип техники DI, называемыйConstructor-Based Dependency Injection в Spring, что, проще говоря, означает, что необходимые компоненты передаются в класс во время создания экземпляра.

Для начала нам нужно импортировать зависимостьspring-context в нашpom.xml:


    org.springframework
    spring-context
    5.1.4.RELEASE

Затем нам нужно настроить файлConfiguration. Этот файл может быть либо POJO, либо, если хотите, файлом XML.

Дальнейшее чтение:

Введение в инверсию управления и инжекцию зависимостей с помощью пружины

Краткое введение в концепции инверсии управления и внедрения зависимостей с последующей простой демонстрацией с использованием Spring Framework

Read more

Top Spring Framework Интервью Вопросы

Быстрое обсуждение общих вопросов о Spring Framework, которые могут возникнуть во время собеседования.

Read more

Проводка весной: @Autowired, @Resource и @Inject

В этой статье будет проведено сравнение и сопоставление использования аннотаций, связанных с внедрением зависимостей, а именно аннотаций @Resource, @Inject и @Autowired.

Read more

2. Конфигурация на основе аннотаций

Файл конфигурации Java очень похож на простой старый объект Java с некоторыми дополнительными аннотациями:

@Configuration
@ComponentScan("com.example.constructordi")
public class Config {

    @Bean
    public Engine engine() {
        return new Engine("v8", 5);
    }

    @Bean
    public Transmission transmission() {
        return new Transmission("sliding");
    }
}

Здесь мы используем аннотации для уведомления среды выполнения Spring о том, что этот класс является поставщиком определений bean-компонентов (аннотация@Bean) и что в пакетеcom.example.spring необходимо выполнить сканирование контекста для дополнительных bean-компонентов. Затем мы определяем классCar:

@Component
public class Car {

    @Autowired
    public Car(Engine engine, Transmission transmission) {
        this.engine = engine;
        this.transmission = transmission;
    }
}

Spring встретит наш классCar при сканировании пакета и инициализирует его экземпляр, вызвав аннотированный конструктор@Autowired.

ЭкземплярыEngine and Transmission будут получены путем вызова аннотированных методов@Bean классаConfig. Наконец, нам нужно загрузитьApplicationContext, используя нашу конфигурацию POJO:

ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
Car car = context.getBean(Car.class);

3. Неявная инъекция конструктора

Начиная с Spring 4.3, классы с одним конструктором могут опускать аннотацию@Autowired. Приятно немного удобства и удаления шаблонного!

Вдобавок к этому, начиная с 4.3, внедрение на основе конструктора может использоваться в аннотированных классах@Configuration. И да, если у такого класса только один конструктор, аннотацию@Autowired также можно опустить.

4. Конфигурация на основе XML

Другой способ настройки среды выполнения Spring с внедрением зависимостей на основе конструктора - использование файла конфигурации xml:


    
    



    
    



    

Обратите внимание, чтоconstructor-arg может принимать буквальное значение или ссылку на другой bean-компонент и что могут быть предоставлены необязательные явныеindex иtype. АтрибутыType иindex могут использоваться для устранения неоднозначности (например, если конструктор принимает несколько аргументов одного и того же типа).

Атрибутname также может использоваться для сопоставления переменных xml и java, но тогда ваш кодmust будет скомпилирован с включенным флагом отладки.

В этом случае контекст приложения Spring необходимо загружать с использованиемClassPathXmlApplicationContext:

ApplicationContext context = new ClassPathXmlApplicationContext("example.xml");
Car car = context.getBean(Car.class);

5. Заключение

Это краткое руководство продемонстрировало основы двух различных способов использованияConstructor-Based Dependency Injection с помощью среды Spring.

full implementation этого руководства можно найтиover on Github.