Spring Framework의 공부 노트【그 1】DI 컨테이너

7135 단어 자바spring

소개


  • 이번 내용
  • Spring Framework의 기초 중 하나, DI 컨테이너 정보
  • 필자의 해석에 의한 보완이 가득하므로, 지적 있으면 꼭 부탁드립니다


  • 소재


  • 다음 인터페이스와 각 구현 클래스.
  • 사용자 등록 업무 수행 UserService
  • 영속 또는 처리 UserRep
  • 비밀번호 해시 PasswdEnc

  • 클래스 다이어그램을 그리면 다음과 같은 느낌.



  • 종속성 주입(Dependency Injection, DI)


  • UserService 클래스의 생성자가 UserRepPasswdEnc 각각의 구현을 인수로 취한다고 가정합니다.
  • 이 때 UserServiceImpl 클래스의 사용예는 이하와 같다.
  • PasswdEnc passwdEnc = new PasswdEncImpl();
    UserRep userRep = new UserRepImpl();
    UserService userService = new UserServiceImpl(passwdEnc, userRep);
    
  • 따라서 클래스 초기화에 필요한 구성 요소를 설정하는 것을 종속성 주입 (DI)이라고합니다.

  • DI를 자동으로 수행하는 기반을 DI 컨테이너라고합니다.
  • 「자동으로 실시한다」란 무엇인가?
  • (나 나 해석) 어느 인터페이스형의 인스턴스를 초기화할 때에, 매회 부르고 싶은 구현을 미리 설정해 두는 것으로, 인터페이스 사용시의 기술을 편하게 하는 것.

  • Bean 정의 파일


  • "미리 설정하십시오"는 ...
  • @Configuration 어노테이션이 부여 된 클래스 (Bean 정의 파일)에서 정의를 수행합니다.
  • @Bean 어노테이션이 부여 된 구성 요소를 부여하여 매번 호출하려는 구현을 지정합니다.
  • 이러한 구성 요소는 다른 구성 요소에 주입 될 수도 있습니다.

  • @Configuration
    public class AppConfig{
      @Bean
      UserRep userRep(){
        return new UserRepImpl();
      }
    
      @Bean
      PasswdEnc passwdEnc(){
        return new PasswdEncImpl();
      }
    
      @Bean
      UserService userService(){
        return new UserServiceImpl(userRep(), passwdEnc());
      }
    }
    
  • 위와 같이 미리 설정해 두면, UserService 인터페이스형의 초기화는 DI 컨테이너를 경유해 편하게 실현할 수 있다.
  • ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); 
    // DIコンテナを生成
    
    UserService userService = context.getBean(UserService.class) 
    // DIコンテナを経由してあらかじめ設定した実装を取得
    
  • 즉, DI 컨테이너의 이용은 다음의 3개의 페이즈로 대별된다.
  • Bean 정의에 구성 요소 등록
  • Bean 정의에서 DI 컨테이너 생성
  • DI 코텐나와 Bean을 지정하여 의도 한 구현 호출 (룩업)


  • 컴포넌트 스캔


  • Bean 등록의 방법에는, Bean 정의 파일에의 기술 이외에, 컴퍼넌트 스캔이라고 하는 것이 있다.
  • 구현 클래스에 직접 @Component 어노테이션을 부여해 Bean 등록해, 다른 컴퍼넌트로부터 호출하고 싶을 때는 @Autowired 어노테이션을 부여한다.
  • @Component // 自身をBean登録する
    public class UserRepImpl implemente UserRep {
      // 省略
    }
    
    @Component // 自身をBean登録する
    public class PasswdEncImpl implemente PasswdEnc {
      // 省略
    }
    
    @Component // 自身をBean登録するとともに...
    public class UserServiceImpl implemente UserService {
      @Autowired // 他のBeanを注入する
      public UserServiceImpl(UserRep userRep, PasswdEnc passwdEnc)
    }
    
  • @Autowired (은)는 디폴트로 대상의 형태가 일치하는 Bean 를 DI 컨테이너로부터 찾는다.
  • 컴포넌트 스캔을 수행 할 때, 다음과 같이 빈 정의 파일에서 컴포넌트 스캔을 원하는 패키지를 명시해야합니다.
  • @Configuration
    @ComponentScan("com.example.hoge")
    public class AppConfig{
    }
    
  • 조회는 Bean 정의 파일을 사용할 때와 유사합니다.
  • ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); 
    // DIコンテナを生成
    
    UserService userService = context.getBean(UserService.class) 
    // DIコンテナを経由してあらかじめ設定した実装を取得
    

    계속



    참고문헌


  • NTT 데이터 (2016) "Spring 철저한 입문 Spring Framework에 의한 Java 어플리케이션 개발"쇼에이샤
  • 좋은 웹페이지 즐겨찾기