스프링은 앞서 설명한 의존 주입 기능을 제공하고 있다.
Assembler 대신 스프링의 기능을 사용하여 의존을 주입해 보았다.
새로운 클래스 추가됨 -> Application Context에 @Bean 어노테이션 달아서 메서드 추가하고 의존성 주입 -> Main 클래스에서 ctx.getBean으로 빈 객체 만들어서 사용하기
스프링DI를 하기 전 우선 설정 정보를 명시하고 있는 파일이 필요하다.
자바 코드를 사용하여 설정 정보를 작성해 주었다.
앞선 게시물에서 보았듯이,
@Configuration은 스프링 설정 클래스라는 의미의 어노테이션이며, @Bean은 이 메서드가 생성한 객체는 스프링이 관리하는 Bean 객체가 된다는 의미의 어노테이션이다.
이제 설정 정보를 가지고 있는 클래스로 스프링 컨테이너를 생성해 보자.
AnnotationConfigApplicationContext를 사용하면 된다.
Assembler와 거의 비슷하지만,
ApplicationContext를 사용하여 getBean으로 빈 객체를 생성한다는 차이점이 있다.
@Bean
public MemberDao memberDao() {
return new MemberDao();
}
@Bean
public MemberInfoPrinter infoPrinter() {
MemberInfoPrinter infoPrinter = new MemberInfoPrinter();
infoPrinter.setMemberDao(memberDao());
infoPrinter.setPrinter(memberPrinter());
return infoPrinter;
}
기본 데이터 타입들과 문자열은 그냥 일반 자바 코드처럼 설정하면 된다.
하나의 객체를 여러곳에서 생성하는 것처럼 보여도, 스프링은 내부적으로 하나의 @Bean 메서드에 대해 하나의 빈 객체만을 생성하므로 @Bean 어노테이션이 붙은 여러 메서드에서 같은 객체를 여러번 생성해도 싱글톤 패턴이 유지된다.
실제 프로그램을 개발할 때에는 아주 많은 @Bean을 설정해야 한다. 따라서 적당히 영역을 나누어 @Configuration 클래스를 관리하는 것이 더 편리하다.
방식은 간단하다. 그냥 여러 개의 설정 파일을 작성한 후 어노테이션을 적절히 붙여주고 ApplicationContext를 수정해주면 된다.
ctx = new AnnotationConfigApplicationContext(AppCtx1.class, AppCtx2.class);
@Autowired
private MemberDao memberDao;
여러 개의 설정 파일을 사용할 경우, @Autowired 어노테이션을 사용하면 다른 설정 파일에 정의한 Bean을 사용할 수 있다.
여러 개의 설정 파일을 사용할 경우 @Import를 사용할 수도 있다.
설정 파일에서 org.springframework.context.annotaion.Import를 임포트 한 후, 설정 파일 클래스에 @Import(다른설정파일이름.class) 어노테이션을 작성해주면 된다.
ctx = new AnnotationConfigApplicationContext(설정파일.class);
@Import를 사용하는 경우에는 ApplicationContext에 설정 파일 이름을 하나만 적어주어도 된다.
@Import({설정파일1.class, 설정파일2.class});
이처럼 여러 개의 설정파일을 import 어노테이션 안에 적어줄 수도 있다.
Cf)
빈 객체의 타입이 하나인 경우 getBean(Bean객체타입)과 같은 방식으로 빈 객체를 가져올 수도 있다.
Cf2)
모든 객체를 Bean 객체로 해야하는 것은 아니다. 스프링 프로젝트 내에서 @Bean 어노테이션 없이 객체를 선언하는 것도 가능하다. 그러나 이렇게 등록한 객체는 당연히 스프링 컨테이너가 관리하지 않기 때문에 getBean등의 메서드로 가져올 수 없다.