728x90
스프링 프레임워크 핵심 기술
포스팅 참조 정보
GitHub
공부한 내용은 GitHub에 공부용 Organizations에 정리 하고 있습니다
해당 포스팅에 대한 내용의 GitHub 주소
실습 내용이나 자세한 소스코드는 GitHub에 있습니다
포스팅 내용은 간략하게 추린 핵심 내용만 포스팅되어 있습니다
https://github.com/freespringlecture/spring-core-tech/tree/chap02-02-applicationcontext
해당 포스팅 참고 인프런 강의
https://www.inflearn.com/course/spring-framework_core/dashboard
SpringBoot Version
- 실습 Version: 2.1.2.RELEASE
2-2. IoC 컨테이너 2부: ApplicationContext와 다양한 빈 설정 방법
빈 설정 -> 스프링 IoC 컨테이너
고전적인 Application 설정
<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd" >
<bean id="bookService" class="me.freelife.BookService"> <!-- bookService 빈 등록 -->
<!-- bookRepository 프로퍼티에 bookRepository 빈을 레퍼런스로 주입 -->
<!-- bookRepository name은 setter에서 가지고 온 것 -->
<!-- ref는 레퍼런스로 다른 빈을 참조한다는 뜻 -->
<!-- ref에는 setter 에 들어갈 수 있는 다른 bean의 id가 와야됨 -->
<property name="bookRepository" ref="bookRepository"/>
</bean>
<bean id="bookRepository" class="me.freelife.BookRepository"/> <!-- bookRepository 빈 등록 -->
</beans>
- BookRepository
public class BookRepository {
}
- BookService
public class BookService {
BookRepository bookRepository;
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
- application
public class Application {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
String[] beanDefinitionNames = context.getBeanDefinitionNames();
System.out.println(Arrays.toString(beanDefinitionNames));
BookService bookService = (BookService) context.getBean("bookService");
System.out.println(bookService.bookRepository != null);
}
}
일일히 빈으로 등록하는 단점을 보완하기 위한 방법
단점을 보완하기위해 패키지를 스캔해서 @Component @Service @Repository 처럼
@Component를 확장한 애노테이션들을 스캐닝해서 빈으로 자동으로 등록해줌
이렇게 등록된 빈은 @Autowired 나 @Inject를 통해 의존성을 주입하여 사용
애너테이션 기반에 빈을 등록하고 설정하는 기능은 스프링 2.5부터 가능한기능
<!-- @Compnent @Service @Repository 애노테이션을 스캐닝 해서 빈으로 등록 해줌 -->
<context:component-scan base-package="me.freelife"/>
- BookRepository
@Repository
public class BookRepository {
}
- BookService
@Service
public class BookService {
@Autowired
BookRepository bookRepository;
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
java 설정 파일
빈 설정 파일을 xml이 아닌 java로 설정하는 파일
@Configuration
public class ApplicationConfig {
@Bean
public BookRepository bookRepository() {
return new BookRepository();
}
@Bean
public BookService bookService() {
BookService bookService = new BookService();
bookService.setBookRepository(bookRepository());
return bookService;
}
}
- BookRepository
public class BookRepository {
}
- BookService
public class BookService {
BookRepository bookRepository;
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
- application
public class Application {
public static void main(String[] args) {
//ApplicationConfig 를 빈 설정으로 사용하겠다는 설정
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
// ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
String[] beanDefinitionNames = context.getBeanDefinitionNames();
System.out.println(Arrays.toString(beanDefinitionNames));
BookService bookService = (BookService) context.getBean("bookService");
System.out.println(bookService.bookRepository != null);
}
}
ComponentScan
Application.class 가 있는 곳에서 ComponentScan하여 빈으로 등록
@Configuration
@ComponentScan(basePackageClasses = Application.class)
public class ApplicationConfig {
}
현재의 방식
스프링 부트에서 사용하는 방식 @ComponentScan과 다수의 설정이 포함되어 있음
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
스프링 IoC 컨테이너의 역할
- 빈 인스턴스 생성
- 의존 관계 설정
- 빈 제공
AppcliationContext
- ClassPathXmlApplicationContext (XML)
- AnnotationConfigApplicationContext (Java)
빈 설정
- 빈 명세서
- 빈에 대한 정의를 담고 있다
- 이름
- 클래스
- 스코프
- 생성자 아규먼트 (constructor)
- 프로퍼트 (setter)
- ..
컴포넌트 스캔
- 설정방법
- XML 설정에서는 context:component-scan
- 자바 설정에서 @ComponentScan
- 특정 패키지 이하의 모든 클래스 중에 @Component 애노테이션을 사용한 클래스를 빈 으로 자동으로 등록 해 줌
728x90
'개발강의정리 > Spring' 카테고리의 다른 글
[스프링 프레임워크 핵심 기술] 2-4. IoC컨테이너-Component와 컴포넌트 스캔 (0) | 2019.10.06 |
---|---|
[스프링 프레임워크 핵심 기술] 2-3. IoC컨테이너-Autowired (0) | 2019.10.06 |
[스프링 프레임워크 핵심 기술] 2-1. loC컨테이너-스프링 IoC 컨테이너와 빈 (0) | 2019.10.06 |
[스프링 프레임워크 핵심 기술] 1. 강좌 및 스프링 소개 (0) | 2019.10.06 |
[스프링 프레임워크 입문] 스프링 프레임워크 입문 핵심 내용 정리 (0) | 2019.10.06 |
댓글