Spring @Configuration, @Bean

강정우·2023년 10월 29일
0

Spring-boot

목록 보기
5/73
post-thumbnail

@Configuration & @Bean

  • 앞서 구성 부분으로 따로 빼 두었던 AppConfig 부분을 이제 실제 Spring을 이용해서 바꿔보자.
public class AppConfig {
    public MemberService memberService() {
        return new MemberServiceImpl(getMemberRepository());
    }

    private static MemoryMemberRepository getMemberRepository() {
        return new MemoryMemberRepository();
    }

    public OrderService orderService() {
        return new OrderServiceImpl(getMemberRepository(), discountPolicy());
    }

    public DiscountPolicy discountPolicy() {
        return new RateDiscountPolicy();
//        return new FixDiscountPolicy();
    }
}
  • Java with Spring
@Configuration
public class AppConfig {
    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(getMemberRepository());
    }
    @Bean
    public static MemoryMemberRepository getMemberRepository() {
        return new MemoryMemberRepository();
    }
    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(getMemberRepository(), discountPolicy());
    }
    @Bean
    public DiscountPolicy discountPolicy() {
        return new RateDiscountPolicy();
//        return new FixDiscountPolicy();
    }
}
  • 이렇게 하면 @Bean을 추가한 메서드들이 Spring Container에 다 등록이 된다.

  • 참고로 @Bean에 속성값을 이용하여 따로 이름을 부여할 수 있다.

@Bean(name="mnm")
public MemberService memberservice(){
	...

Application Context (==Spring Container)

public class MemberApp {
    public static void main(String[] args) {
        AppConfig appConfig = new AppConfig();
        MemberService memberService = appConfig.memberService();

//        MemberService memberService = new MemberServiceImpl();
        Member member = new Member(1L, "memberA", Grade.VIP);
        memberService.join(member);

        Member finMember = memberService.findMember(1L);
        System.out.println("new member = " + member.getName());
        System.out.println("find member = " + finMember.getName());
    }
}
  • java with spring
public class MemberApp {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class);

        Member member = new Member(1L, "memberA", Grade.VIP);
        memberService.join(member);

        Member finMember = memberService.findMember(1L);
        System.out.println("new member = " + member.getName());
        System.out.println("find member = " + finMember.getName());
    }
}
  • 스프링은 모든게 application Context(spring container)라는 것으로 실행되고
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
  • 이렇게 하면 AppConfig.java 파일에 있는 환경설정정보 (annotation)들을 spring container에 다 집어넣어서 관리해준다.

  • 참고로 applicationContext라는 변수명이 너무 길어서 ac라고도 많이 쓰기도 한다.

  • 이렇게 하면 이제는 직접 참조하는 것이 아닌, 스프링 컨테이너를 통해서 가져와야한다.

MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
  • 통상 Bean이 Spring Container에 등록될 때 메서드 이름으로 등록된다.
    따라서 Bean을 가져올 때에도 이름으로 가져와야한다.
    이때 getBean() 메서드는 첫째로는 키값인 이름을, 둘째는 해당 값을 타입을 지정해주면 된다.
  1. AppConfig를 annotaion을 이용하여 Spring Container에 등록하여 사용한다.
  2. 스프링 container는 @Connfiguration이 붙은 AppConfig를 설정(구성)정보로 사용한다. 이때 @Bean이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.
    이렇게 spring container에 등록된 객체를 "스프링 빈"이라 한다.
  3. 스프링 빈은 메서드 명을 빈의 이름으로 사용한다.
  4. spring container를 통해서 필요한 빈(객체)를 찾아야한다.
profile
智(지)! 德(덕)! 體(체)!

0개의 댓글