DI(3) - XML없이 자바 코드 기반 설정
2019. 11. 13. 10:37ㆍ🔴 Spring
300x250
★자바 코드 기반 설정: XML설정 없이도 자바코드
→ Bean 생성&의존관계 설정
사용되는 어노테이션:
@Configuration (class위에 명시) : Bean 설정 메타 정보를 담음
@Bean (method위에 명시) : 클래스 내의 메소드 정의
*** 흐름 :
1) java파일 내에서 어노테이션 토대로 Bean클래스 지정, 메소드 지정
2) MainMethod에서 "new AnnotationConfigApplicationContext"으로 스프링 컨테이너 생성
<AppContext.java>
package member;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import member.BoardDao;
import member.ChangePasswordService2;
import member.MemberDao;
import member.MemberRegisterService2;
// 컨테이너가 생성될때 AppContext 클래스도 같이 생성됨
@Configuration
public class AppContext {
//---------------------------------------------------
// 만약 @Bean의 name이 둘 다 같으면 -> 마지막 Bean으로 적용됨 (오류안남)
// 만약 @Bean의 두 name이 다르고, type은 같으면 -> 겹치므로 오류남 => @Qualifier써서 구분해주기
// (AppContext클래스 & Service클래스 모두 설정해줘야함)
@Bean(name = "memberDao")
@Qualifier("sys1") -> 두 개 이상의 빈 객체가 매칭될 때 한정짓기!!
//@Scope("prototype") // singleton(default) => prototype
public MemberDao getMemberDao() {
return new MemberDao();
}
@Bean
// name정하지 않으면 id값 getBoardDao -> getBoardDao로 설정됨
public BoardDao boardDao() {
return new BoardDao();
}
//---------------------------------------------------
@Bean(name = "registService2")
public MemberRegisterService2 getMemberRegisterService2() {
// 생성자 방식 : return new MemberRegisterService2(getMemberDao());
// setter 방식: 주입
MemberRegisterService2 service = new MemberRegisterService2();
// @Autowired : 생략 service.setMemberDao(getMemberDao());
return service;
}
@Bean(name = "changePwService2")
public ChangePasswordService2 getChangePasswordService2() {
// 생성자 방식 : return new ChangePasswordService2(getMemberDao());
// setter 방식: 주입
ChangePasswordService2 service = new ChangePasswordService2();
// @Autowired : 생략 service.setMemberDao(getMemberDao());
return service;
}
}
<MainForSpring3.java> → XML에 설정할 필요 없이 바로!!
package member;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import config.AppContext;
public class MainForSpring3 {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class);
// bean으로 설정한 MemberDao 비교 (scope)
MemberDao dao1 = ctx.getBean("memberDao", MemberDao.class);
MemberDao dao2 = ctx.getBean("memberDao", MemberDao.class);
System.out.println("dao1==dao2"+(dao1==dao2));
}
}
public class MainForSpring4 {
// private static Assembler assembler = new Assembler();
// 스프링 컨테이너 생성 : 조립기 설정파일 AppContext.class
private static ApplicationContext ctx =
//new AnnotationConfigApplicationContext(AppContext.class);
// 두 클래스 모두 불러오기
new AnnotationConfigApplicationContext(AppCtx1.class, AppCtx2.class);
-> AppCtx1.class : getMemberDao() + AppCtx2.class : getService()
public static void main(String[] args) throws IOException {
@Component를 붙인 클래스를 스캔해서 스프링 빈으로 등록 → @ComponentScan
기본 스캔 대상 : Component, Controller, Service, Repository, Aspect, Configuration
<AppCtx3.java>
package member;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
// 컨테이너가 생성될때 AppContext 클래스도 같이 생성됨
@Configuration
@ComponentScan( basePackages = "member" )
public class AppCtx3 {
}
300x250
'🔴 Spring' 카테고리의 다른 글
DispatcherServlet이란? (0) | 2019.11.14 |
---|---|
AOP - AOP란? AOP vs OOP (1) | 2019.11.13 |
SpringMVC에서의 Annotation, 간단 정리! (0) | 2019.11.13 |
DI(2) - Annotation사용하기 (0) | 2019.11.13 |
DI(1) - DI란, XML에서 bean생성&주입 (0) | 2019.11.13 |