-
[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
'Spring' 카테고리의 다른 글
[Spring] 스프링 REST서버에서 에러를 처리하는 방법 (0) 2019.06.03 [Spring] @Resource, @Inject, @Autowired (0) 2019.05.26 [Spring] 간단한 웹 MVC 프로젝트 (0) 2019.05.12 [Spring] 스프링 웹 MVC 개요 (0) 2019.05.11 [Spring] IntelliJ에서 SpringBoot 프로젝트 생성하기 (0) 2019.05.11 댓글