Внедрение зависимостей в конструктор весной
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
Top Spring Framework Интервью Вопросы
Быстрое обсуждение общих вопросов о Spring Framework, которые могут возникнуть во время собеседования.
Проводка весной: @Autowired, @Resource и @Inject
В этой статье будет проведено сравнение и сопоставление использования аннотаций, связанных с внедрением зависимостей, а именно аннотаций @Resource, @Inject и @Autowired.
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.