01.03.2017

IoC, DI Spring Example

Инверсия управления (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 )

    spring-projects.lessons
    di-example
    1.0-SNAPSHOT
    
        
            org.springframework
            spring-context
            RELEASE
        
    

2. Make GreetingService and implementation lessons.services.GreetingService
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 xml
 
    
 
*/

@Configuration
public class DiExConfiguration {
    @Bean
    public GreetingService greetingService() {
        return new GreetingServiceImpl();
    }
}
4. Inject Bean in start class.
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!

Комментариев нет:

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