2.스프링 ApplicationContext와 다양한 빈 설정 방법

고전적인 빈 생성방법

application.xml의 등장

리소스에 application.xml을 생성하고

안에 을 생성한다

1
2
3
4
5
6
7
<beans .....>
<bean id="bookService" class="xxxxxx" >
<property name="bookRepository" ref="bookRepository"/>
</bean>

<bean id="bookRepository" class="bookRepository"/>
</beans>

해당 방법은 번거롭다!

그래서 등장한것이 바로 컴포넌트 스캔

component-scan의 등장

1
2
3
4
<beans ...>
<context:component-scan base-package="xxxxxxxx"/>

</beans>

이 경우 @Componet라는 어노테이션을 클래스 위에 붙여줌으로써 빈을 생성할 수 있다.

위의 두 경우(xml로 빈생성) ClassPathXmlApplicationContext 클래스를 통해 ApplicationContext 인스턴스를 생성한다.

빈을 xml말고 자바로 빈을생성 할 수 없을까? 있다
ApplicationConfig

자바로 빈생성 할래 . ApplicationConfig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Configuration
public class ApplicationConfig{
@Bean
public BookRepository bookRepository() {
return new BookRepository();
}

@Bean
public BookService bookService(){
BookService bookService = new BookService();
bookService.setBookRepository(bookRepository());
return bookService;
}

위 메소드는 아래 메소드와 동일
@Bean
public BookService bookService(BookRepository bookRepository){
BookService bookService = new BookService();
bookService.setBookRepository(bookRepository);
return bookService;
}

두번째 것을 아래 메소드로 할 경우 BookService내 bookRepository에 Autowired를 넣어주면 주입이 된다.
//생성자로 주입받아야 할 경우에는 Autowired로 어떻게 할 수 가 없다.
@Bean
public BookService bookService(){
return new BookService();
}
}

자바로 할 땐 오히려 xml보다 불편한다 다른 편한방법없나? 있다
ComponentScan 어노테이션

좀더 편하게 자바로 빈생성할래 @ComponentScan

1
2
3
4
5
6
7
@Configuration
@ComponentScan(basePackageClasses = XXX.class)
//XXX 클래스가 위치한 곳부터 스캐닝을 함
public class ApplicationConfig{

}

@SpringBootApplication

위의 과정을 하나의 어노테이션으로 해결해주는 어노테이션이 바로 @SpringBootApplication 이다.

위의 두 경우(java로 빈생성) AnnotationConfigApplicationContext 클래스를 통해 ApplicationContext 인스턴스를 생성한다.

Share