프로필사진
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