1. 스프링 빈
Spring 컨테이너가 관리하는 자바 객체를 빈(Bean)이라는 용어로 부른다.
- Spring 컨테이너 안에 있어서 ApplicationContext.getBean()으로 얻어질 수 있는 객체가 빈이다.
- @Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다.
- 스프링 컨테이너에 객체를 스프링 빈으로 등록하고, 스프링 컨테이너에서 스프링 빈을 찾아서 사용한다.
2. 스프링 빈 등록 방법
(1) 빈 설정 파일에 직접 빈을 등록 (자바 클래스, xml)
(1-1) Annotation 기반 자바 코드 설정 파일 사용
- AnnotationConfigApplicationContext() 함수를 사용해서 컨테이너에 자바 설정 파일을 전달한다.
src/main/java/hello.core/AppConfig 파일
package hello.core;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
}
- 스프링 컨테이너는 @Configuration이 붙은 AppConfig를 설정 정보로 사용한다.
- @Bean이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.
AnnotationConfigApplicationContext()를 이용한 Test코드
package hello.core.beanfind;
import hello.core.AppConfig;
import hello.core.member.MemberService;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class AppContext {
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("자바코드 설정파일")
void appContext() {
MemberService memberService = ac.getBean("memberService", MemberService.class);
Assertions.assertThat(memberService).isInstanceOf(MemberService.class);
}
}
(1-2) XML 설정파일을 사용
- GenericXmlApplicationContext()를 사용해서 컨테이너에게 xml설정 파일을 전달한다.
src/main/resources/appConfig.xml 파일
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="memberService" class="hello.core.member.MemberServiceImpl">
<constructor-arg name="memberRepository" ref="memberRepository" />
</bean>
<bean id="memberRepository"
class="hello.core.member.MemoryMemberRepository" />
<bean id="orderService" class="hello.core.order.OrderServiceImpl">
<constructor-arg name="memberRepository" ref="memberRepository" />
<constructor-arg name="discountPolicy" ref="discountPolicy" />
</bean>
<bean id="discountPolicy" class="hello.core.discount.RateDiscountPolicy" />
</beans>
- id : 빈의 이름
- class : 패키지명을 포함한 빈으로 정의할 클래스
- scope : Bean의 스코프 (singleton, session, request...)
- autowired : autowired할 방법
- <constructor-arg name = "의존성을 주입받을 인스턴스의 이름" ref="주입하는 bean의 이름>
GenericXmlApplicationContext()을 이용한 Test 코드
package hello.core.xml;
import hello.core.member.MemberService;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import static org.assertj.core.api.Assertions.*;
public class XmlAppContext {
@Test
void xmlAppContext() {
ApplicationContext ac = new
GenericXmlApplicationContext("appConfig.xml");
MemberService memberService = ac.getBean("memberService",
MemberService.class);
assertThat(memberService).isInstanceOf(MemberService.class);
}
}
지금까지 스프링 빈을 등록할 때 자바코드의 @Bean이나 XML의 <bean> 등을 통해서 설정 정보에 직접 등록
등록해야 할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기 어렵다. 그래서 나온 것이 Component Scanning이다.
본 글은 김영한 님의 "스프링 핵심 원리"(인프런) 유료 강의를 들으며 요약, 정리하고 일부 정보를 추가 작성한 것입니다.
반응형
'Spring(JAVA Framework) > Spring Core' 카테고리의 다른 글
Singleton (싱글톤) (0) | 2021.08.18 |
---|---|
BeanDefinition (스프링 빈 설정 메타 정보) (0) | 2021.08.18 |
BeanFactory와 ApplicationContext (0) | 2021.08.17 |
스프링 빈 조회 (0) | 2021.08.17 |
스프링 컨테이너와 생성과정 (0) | 2021.08.16 |
댓글