의존 주입 (DI : Dependency Injection)을 하는 방법
-
Assembler라는 별도의 클래스 생성
1public class Assembler { 2 private MemberDao memberDao; 3 private MemberRegisterService regSvc; 4 5 public Assembler() { 6 memberDao = new MemberDao(); 7 regSvc = new MemberRegisterService(memberDao); 8 } 9 10 public MemberDao getMemberDao() { 11 return memberDao; 12 } 13 14 public MemberRegisterService getMemberRegisterService() { 15 return regSvc; 16 } 17}
-
Spring에서 지원하는 DI 사용
1@Configuration 2public class AppCtx { 3 @Bean 4 public MemberDao memberDao() { 5 return new MemberDao(); 6 } 7 @Bean 8 public MemberRegisterService memberRegSvc() { 9 return new MemberRegisterService(memberDao()); 10 } 11}
DI 방식
- Constructor 방식
1@Bean 2 public MemberListPrinter listPrinter() { 3 return new MemberListPrinter(memberDao(), memberPrinter()); 4 }
- Setter method 방식
1@Bean 2public MemberInfoPrinter infoPrinter() { 3 MemberInfoPrinter infoPrinter = new MemberInfoPrinter(); 4 infoPrinter.setMemberDao(memberDao()); 5 infoPrinter.setPrinter(memberPrinter()); 6 return infoPrinter; 7}
- constructor 방식이 훨씬 깔끔해보인다.
- java bean에서는 getter와 setter를 이용해서 property를 정의한다고 한다.
두 개 이상의 Configuration 파일 사용 : @Autowired 활용
-
AppConf1.java
1@Configuration 2public class AppConf1 { 3 ... 4}
- AppConf2.java
1import org.springframework.beans.factory.annotation.Autowired; 2 3@Configuration 4public class AppConf2 { 5 @Autowired 6 private MemberDao memberDao; 7 @Autowired 8 private MemberPrinter memberPrinter; 9 10 ... 11}
-
MainForSpring.java
1ctx = new AnnotationConfigApplicationContext(AppConf1.class, AppConf2.class);
-
Autowired annotation을 통해 다른 설정 파일의 객체를 가져올 수 있다.
두 개 이상의 Configuration 파일 사용 : @Import 활용
-
AppConfImport.java
1import org.springframework.context.annotation.Import; 2 3@Configuration 4@Import(AppConf2.class) 5public class AppConfImport {
-
MainForSpring.java
1ctx = new AnnotationConfigApplicationContext(AppConfImport.class); 2// 클래스 한 개만 명시해줘도 가능
타입만으로 빈을 구할 수 있다
1VersionPrinter versionPrinter = ctx.getBean(MemberPrinter.class);
- 다만, 같은 타입의 빈 객체가 2개 이상 존재한다면 에러 발생