Spring Framework에서Spring Bean을 등록하여Spring Context에게제어를 맡기는 방법
。해당 3가지 방법을 수행하지않아Spring Bean으로 등록되지 않은자바 객체는POJO
XML에Spring Bean을 등록<beans> <bean id="memberService" class="com.example.MemberService"/> </beans>。
XML에Spring Bean을 일일이 기입하여 등록
Annotation을 선언하여Spring Bean을 등록
。어플리케이션 전역으로 관리되는Spring Context에@SpringBootApplication가 선언된진입점 클래스이하패키지 경로에 존재하는Spring Bean을 등록
▶ 가장 많이 사용하는 방식
。@Configuration -> @Controller -> @Service -> @Repository -> @Component순으로 선언된클래스가Spring Bean으로서 등록
▶단방향 의존성에 따라고수준 클래스로서Service 클래스 객체를 포함하는Controller 클래스가Service 클래스보다 먼저Spring Bean으로 등록되어야한다.
Spring Context의구현체를 생성 및Spring Bean을 등록
。전역의Spring Context가 아닌Spring Context의 구현체 ( =ApplicationContext)를 생성하는 방식
new AnnotationConfigApplicationContext(Configuration클래스.class)
▶ 내부에@Bean이 정의된Configuration Class를 전달하여Spring Bean을 등록
▶Spring Bean을 독립적으로 저장가능import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; interface GamingConsole{ String up(); } class MarioGame implements GamingConsole{ public String up(){ return "Mario goes upside"; } } class SuperContraGame implements GamingConsole{ public String up(){ return "Character goes upside"; } } // Configuration class 선언 @Configuration public class MemberService { @Bean( name = "lee" ) public GamingConsole gm1(){ return new MarioGame(); } @Bean @Primary public GamingConsole gm2(){ return new SuperContraGame(); } public static void main(String[] args) { // Spring Context 구현체 생성 try(var ct = new AnnotationConfigApplicationContext(MemberService.class)){ String result1 = ct.getBean(MarioGame.class).up(); // Class Type으로 Spring Bean 가져오기 String result2 = ct.getBean("lee", MarioGame.class).up(); // 스프링빈명칭으로 Spring Bean 가져오기 String result3 = ct.getBean(GamingConsole.class).up(); // Interface Type으로 Spring Bean 가져오기 System.out.println(result1); // "Mario goes upside" System.out.println(result2); // "Mario goes upside" System.out.println(result3); // "Character goes upside" } } }。
객체를 생성하여 반환하는 method에@Bean을 선언
。Spring Context 구현체에Configuration Class를 매개변수로 전달하여 를 생성
▶Configuration class에 정의된@Bean들을 일괄적으로Spring Context 구현체에 등록
@ComponentScan("경로"):
。Spring Context 구현체( ex.AnnotationConfigApplicationContext)가 위치한Configuration Class에 선언하여 정의한패키지 경로의 하위에 있는 모든Spring Bean을Spring Context 구현체에 식별 및등록되도록하는어노테이션@Component @Qualifier("wjdtn") class SuperContraGame implements GamingConsole{ public String up(){ return "Character goes upside"; } } @Component class Runner { private final GamingConsole gc2; public Runner( @Qualifier("wjdtn") GamingConsole gc2){ this.gc2 = gc2; } public void run(){ System.out.println(gc2.up()); // Character goes upside } } @Configuration @ComponentScan("com.ktcloud.springpractice") // 해당 패키지에 있는 어노테이션이 선언된 클래스들을 Spring Bean으로 등록 public class AAAA { public static void main(String[] args) { try( var springContext = new AnnotationConfigApplicationContext(AAAA.class)){ springContext.getBean(Runner.class).run(); } } }▶
ApplicationContext 구현체에@Component가 선언된SuperContraGame와Runner를Spring Bean으로 등록
Spring Context 구현체에서Spring Bean를 가져오는 방법
// Spring Context 구현체 생성 try(var ct = new AnnotationConfigApplicationContext(MemberService.class)){ String result1 = ct.getBean(MarioGame.class).up(); // Class Type으로 Spring Bean 가져오기 String result2 = ct.getBean("lee", MarioGame.class).up(); // 스프링빈명칭으로 Spring Bean 가져오기 String result3 = ct.getBean(GamingConsole.class).up(); // Interface Type으로 Spring Bean 가져오기 System.out.println(result1); // "Mario goes upside" System.out.println(result2); // "Mario goes upside" System.out.println(result3); // "Character goes upside" }
Class Type으로Spring Bean을 가져올 경우
SpringContext객체.getBean(클래스타입.class)
。동일한Interface를 구현하는Spring Bean을 반환하는@Bean method가 복수 존재 시@Primary로 설정된@Bean Method의Spring Bean을 우선시하여 가져온다.
Spring Bean에게 할당된 이름으로Spring Bean을 가져오는 경우
SpringContext객체.getBean("스프링빈이름", 클래스타입)
。Spring Bean의명칭으로 참조 시클래스타입을 추가정의
▶클래스타입을 정의하지 않으면Object Type의Spring Bean으로 반환
。Spring Bean 이름은Spring Context에 의해카멜케이스로 작성됨을 유의
▶@Bean method의Spring Bean인 경우@Bean(name="이름")을 통해 개발자가 임의로 부여가능