Ch03. 두 개 이상의 설정파일 사용, @AutoWired, @Import
두 개 이상의 설정 파일 사용
스프링은 두 개 이상의 설정파일 (@Configuraton 클래스)을 사용할수 있다.
다음과 같이 AnnotationConfigApplicationContext 객체로 설정 파일을 불러올때 파라미터로 모든 설정파일을 전달하면 된다.
AnnotationConfigApplicationContext의 생성자의 인자는 가변인자이기 때문에 가능하다.
private static ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConf1.class, AppConf2.class);
두 개 이상의 설정 파일 사용 1 :다른 설정파일의 객체 사용 (@Autowired)
하나의 설정 파일에서 다른 설정 파일의 객체를 사용할때는 @Autowired 애노테이션을 이용한다.
@Autowired 애노테이션을 붙이면 해당 타입의 빈을 찾아 필드에 할당한다.
@Configuration
public class AppConf2
{
@Autowired
private MemberDao memberDao;
@Autowired
private MemberPrinter memberPrinter;
}
이렇게 하면 해당 설정 파일에서 memberDao 필드를 그냥 맴버 사용하듯이 사용하면 된다.
@Bean
public MemberRegisterService memberRegSvc()
{
// Autowired 된 멤버필드의 memberDao 사용
return new MemberRegisterService(memberDao);
}
두 개 이상의 설정 파일 사용 2 : @Import
@Import 애노테이션은 함께 사용할 설정 클래스를 지정한다.
@Configuration
@Import(AppConf2.class);
public class AppConf1
{
이렇게 하면 스프링 컨테이너를 생성할때 AppConf1 만 인자로 전달해도, AppConf2 클래스의 설정도 함께 사용해 초기화한다.
@Autowired, 의존 객체 자동 주입
스프링 빈에 의존하는 객체에 @Autowired 애노테이션을 붙이면, 자동으로 객체가 주입된다.
다음과 같이 MemberInfoPrinter 클래스가 의존하는 객체 MemberDao, MemberPrinter에 @Autowired 애노테이션을 붙이면
public class MemberInfoPrinter
{
@Autowired
private MemberDao memberDao;
@Autowired
private MemberPrinter printer;
설정 클래스의 해당 빈 메소드에 의존 주입을 위한 세터가 필요 없어진다 .
@Bean
public MemberInfoPrinter infoPrinter()
{
MemberInfoPrinter infoPrinter = new MemberInfoPrinter();
// @Autowired
// infoPrinter.setMemberDao(memberDao());
// infoPrinter.setPrinter(memberPrinter());
return infoPrinter;
}
getBean() 메소드
- 잘못된 이름을 전달하면 NoSuchBeanDefinitionException 예외가 발생한다.
- 잘못된 타입을 전달하면 BeanNotOfRequiredTypeException 예외가 발생한다.
- 빈 이름을 지정하지 않고 타입만으로 빈을 구 할수 있다.
1. 해당 타입의 빈 객체가 단 하나라면, 해당 빈을 리턴한다.
2. 해당 타입의 빈 객체가 없다면 NoSuchBeanDefinitionException 예외가 발생한다.
3. 해당 타입의 빈 객체가 여러개라면 NoUniqueBeanDefinitionException 예외가 발생한다.
따라서 타입만으로 빈 객체를 얻으려면 해당 타입의 빈이 유일할때만 가능하다.
주입 대상 객체를 모두 빈 객체로 설정할 필요는 없다
주입할 객체는 꼭 빈 객체일 필요는 없고, 그냥 일반 객체여도 상관은 없다.
하지만 빈 객체로 등록하지 않은 객체는 getBean() 메서드로 구할수 없고 스프링 컨테이너에서 제공하는 기능들을 당연히 사용할수 없다.
주입하는 객체를 꼭 빈객체로 만들필요는 없지만, 의존 주입 대상은 스프링 빈으로 등록하는 것이 보통이다.
출처 : 스프링5 프로그래밍 입문 (최범균 저)