public class MemberServiceImpl implements MemberService{
private MemberStroragy memberStroragy;
public MemberServiceImpl() {
this.memberStroragy = new FileMemberStorage();
}
}
MemberServiceImpl 클래스 내부에서 this.memberStroragy = new FileMemberStorage()
과 같이 서비스를 직접 생성하는 경우 의존성 주입이 이루어지지 않고있다.
public class MemberServiceImpl implements MemberService{
private MemberStroragy memberStroragy;
public MemberServiceImpl(MemberStroragy memberStoragy) {
this.memberStroragy = memberStoragy;
}
}
public class AppConfig {
MemberService memberService(){
return new MemberServiceImpl(new FileMemberStoragy());
}
}
MemberServiceImpl이 의존하고 있는 FileMemberStoragy가 외부에서 주입되고 있다!
Appconfig 클래스를 통해서 동작하는 클래스(MemberService)의 수정 없이 객체의 의존성을 설정할 수 있다. 자유롭게 기능을 추가, 삭제, 확장을 하면서도 코드는 수정되지 않아 OCP를 준수한다.
public static void main(String[] args) {
AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
AppConfig(조립도)를 통해 객체 관계를 설정한다.
@Configuration
public class AppConfig{
@Bean
MemberService memberService(){
return new MemberServiceImpl(memberStoragy());
}
@Bean
BookService bookService(){
return new BookServiceImpl(feePolicy());
}
}
- @Configuration : 현재 자바 클래스를 객체 생성 및 연결 설정 정보 파일로 설정
- @Bean : 컨테이너 안에서 메소드의 반환 인스턴스를 Bean으로 관리
- 빈 이름은 중복되면 안됨!
public class MemberApp {
public static void main(String[] args){
AnnotationConfigApplicationContext ac
= new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService
= ac.getBean("memberService", MemberService.class);
}
}
AnnotationConfigApplicationContext가 IoC 컨테이너이다.
// getBean(빈이름, 타입)
ac.getBean("memberService", MemberService.class);
// getBean(타입)
ac.getBean("memberService"); // 빈 이름으로만
ac.getBean(MemberService.class); // 부모 타입으로만
ac.getBean(MemberServiceImpl.class); // 구체 타입으로만
ac.getBean("memberService", MemberServiceImpl.class);
getBeansOfType()
https://velog.io/@sana/DI-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85Dependency-Injection-%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EB%B0%A9%EB%B2%95
https://ssoco.tistory.com/65
https://kotlinworld.com/64#%EC%-D%--%EC%A-%B-%EC%--%B-%EC%-D%B-%EB%-E%--%--%EB%AC%B-%EC%--%--%EC%-D%B-%EB%A-%B-%--%EC%--%B-%EB%--%BB%EA%B-%-C%--%ED%--%B-%EA%B-%B-%--%EA%B-%--%EB%-A%A-%ED%--%-C%EA%B-%--%-F