ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] 자바 코드로 설정 가능한 빈 의존성 주입
    Spring 2019. 5. 11. 01:55

    스프링에서 빈을 DI(주입)하는 방법 중 자바 코드 설정으로 가능한 다음 세가지를 살펴본다.

    • 컴포넌트 스캔
    • 오토와이어링
    • 설정 클래스

    컴포넌트 스캔

    어노테이션을 통해서 자동으로 빈이 스캔 되려면 아래 두 어노테이션을 설정해야 한다.

    • @Component - 스캔 대상 빈에 붙여주는 어노테이션
    • @ComponentScan - @Component 어노테이션이 붙은 클래스를 찾아 스캔 기능을 사용하기 위해 붙여주는 어노테이션
    package com.tistory.hilucky.springboottest;
    
    @Configuration
    @ComponentScan
    public class SpringComponentScanApp {
      private static ApplicationContext applicationContext;
    
      @Bean
      public ExampleBean exampleBean() {
        return new ExampleBean();
      }
    
      public static void main(String [] args) {
        applicationContext = new AnnotationConfigApplicationContext(SpringComponentScanApp.class);
    
        for (String beanName : applicationContext.getBeanDefinitionNames()) {
          System.out.println(beanName);
        }
      }
    }
    package com.tistory.hilucky.springboottest.animals;
    
    @Component
    public class Cat {
    }
    package com.tistory.hilucky.springboottest.animals;
    
    @Component
    public class Dog {
    }
    package com.tistory.hilucky.springboottest.flowers;
    
    @Component
    public class Rose {
    }

    컴포넌트 스캔의 대상

    • 기본적으로 @ComponentScan 어노테이션을 붙인 클래스와 같은 패키지에 속한 컴포넌트
    springComponentScanApp
    cat
    dog
    rose
    exampleBean
    • basePackages 옵션 기본값은 @ComponentScan을 설정한 빈과 같은 클래스로 아래와 같음
    @ComponentScan(basePackages = "com.tistory.hilucky.springboottest")

    오토와이어링

    • 애플리케이션 컨텍스트 내의 빈들 간의 의존성을 주입
    • @Autowired 어노테이션 사용
    @Component("HelloCat")
    public class Cat {
      @Autowired
      private Hello hello;
    }
    • 필드에 @Autowired 사용 시 해당 빈을 자동으로 주입
      public static void main(String [] args) {
        applicationContext = new AnnotationConfigApplicationContext(SpringComponentScanApp.class);
    
        Cat cat = (Cat) applicationContext.getBean("HelloCat");
        System.out.println(cat);

    @Autowired

    • 필드, 생성자, 세터 메소드, 일반 메소드에 사용 가능
    • 여러 개의 빈이 동시에 매칭될 경우 예외 발생
    • @Autowired는 스프링에서 정의한 어노테이션이며 자바 표준으로 @Inject 어노테이션 사용 가능

    설정 클래스

    • @Configuration 어노테이션을 통해 설정 클래스 지정
    • 빈을 선언하기 위해 원하는 클래스 타입의 인스턴스 생성 메소드를 만들고 @Bean 어노테이션 지정
    @Configuration
    public class TestConfig {
      @Bean
      public Hello hello() {
        return new Hello();
      }
    
      @Bean
      public Cat helloCat(Hello hello) {
        return new Cat(hello);
      }
    }
    • 기본적으로 빈은 메소드명과 동일한 ID를 사용하며 다른 ID를 사용하고 싶은 경우 name 애트리뷰트를 정의
    • @Bean이 붙은 메소드에 대해 스프링은 한 개의 객체 생성(싱글톤)

    출처

    https://www.baeldung.com/spring-component-scanning

     

    댓글

Designed by Tistory.