Инверсия управления (Inversion of Control - IoC) является распространенным явлением, с чем сталкиваются при расширении фреймворков. И действительно, она часто рассматривается как определяющая характеристика фреймворка. IoC также известна как принцип Голливуда ("Don't call us, we'll call you"). Самый легкий пример IoC - JUnit, код фреймворка вызывает методы setUp и tearDown для создания и очистки ваших классов для проведения тестирования. Эти методы вызываются JUnit, ваш код реагирует, так что управление инверсированно.
В Фреймворке Java Spring бин сам контролирует реализацию и расположение своих зависимостей, используя, например, прямое создание классов.
Очень хорошо по IoC написано здесь: https://martinfowler.com/bliki/InversionOfControl.html
Внедрение зависимостей (DI или Dependency Injection) — это одна из реализаций этого принципа (помимо этого есть еще Factory Method, Service Locator). Каждое сложное java приложение состоит из многих классов, и они должны быть как можно более независимы друг от друга. Что это даёт: увеличение возможности повторного использования и возможность написания unit – тестов. DI помогает «склеивать» эти классы в runtime.
IoC-контейнер — это какая-то библиотека, фреймворк, программа если хотите, которая позволит вам упростить и автоматизировать написание кода с использованием данного подхода на столько, на сколько это возможно. В Spring интерфейс ApplicationContext представляет IoC-контейнер и является ответственным за создание, конфигурирование и сборку бинов (объектов).
Пример, который всё это показывает.
Структура проекта
1. Add dependency pom.xml (maven )
фев 28, 2017 9:44:29 PM org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@1a6c5a9e: startup date [Tue Feb 28 21:44:29 MSK 2017]; root of context hierarchy
Greeting, user!
Внедрение зависимостей (DI или Dependency Injection) — это одна из реализаций этого принципа (помимо этого есть еще Factory Method, Service Locator). Каждое сложное java приложение состоит из многих классов, и они должны быть как можно более независимы друг от друга. Что это даёт: увеличение возможности повторного использования и возможность написания unit – тестов. DI помогает «склеивать» эти классы в runtime.
IoC-контейнер — это какая-то библиотека, фреймворк, программа если хотите, которая позволит вам упростить и автоматизировать написание кода с использованием данного подхода на столько, на сколько это возможно. В Spring интерфейс ApplicationContext представляет IoC-контейнер и является ответственным за создание, конфигурирование и сборку бинов (объектов).
Пример, который всё это показывает.
Структура проекта
1. Add dependency pom.xml (maven )
2. Make GreetingService and implementation lessons.services.GreetingServicespring-projects.lessons di-example 1.0-SNAPSHOT org.springframework spring-context RELEASE
package lessons.services;
public interface GreetingService {
String sayGreeting();
}
lessons.services.GreetingServiceImpl
package lessons.services;
public class GreetingServiceImpl implements GreetingService {
@Override
public String sayGreeting() {
return "Greeting, user!";
}
}
3. Define bean
lessons.DiExConfiguration
package lessons; import lessons.services.GreetingService; import lessons.services.GreetingServiceImpl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** @Configuration - Annotating a class with @Configuration indicates that its primary purpose is as a source of bean definitions. @Bean annotation is used to indicate that a method instantiates, configures and initializes a new object to be managed by the Spring IoC container its like bean xml4. Inject Bean in start class.*/ @Configuration public class DiExConfiguration { @Bean public GreetingService greetingService() { return new GreetingServiceImpl(); } }
package lessons.starter;
import lessons.DiExConfiguration;
import lessons.services.GreetingService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Starter {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(DiExConfiguration.class);
GreetingService greetingService = context.getBean(GreetingService.class);
System.out.println(greetingService.sayGreeting()); // "Greeting, user!"
}
}
5. Outputфев 28, 2017 9:44:29 PM org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@1a6c5a9e: startup date [Tue Feb 28 21:44:29 MSK 2017]; root of context hierarchy
Greeting, user!

Комментариев нет:
Отправить комментарий