본문 바로가기

SpringFramework

@Bean







import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.AbstractApplicationContext;



public class SpringAnnotationTest {
   
    @Test
    public void configTest() {
        AbstractApplicationContext ac = new AnnotationConfigApplicationContext(Config.class);
        Config config = ac.getBean(Config.class);
        ac.getBean(Hello.class).print();
    }
   
   
    private static class Config {
        @Bean
        public Hello hello(Printer printer) {
            Hello hello = new Hello();
            hello.setPrinter(printer);
            return hello;
        }
       
        @Bean
        public Printer printer() {
            return new Printer();
        }
    }
   
    private static class Hello {
        Printer printer;
        public void setPrinter(Printer printer) {
            this.printer = printer;
        }
       
        public Printer getPrinter() {
            return this.printer;
        }
       
        public void print() {
            if(printer == null)
                System.out.println("print = null");
            else {
                printer.print();
            }
        }
    }
   
    private static class Printer {
        public void print() {
            System.out.println("print");
        }
    }
}

SpringFramework를 이용하여 @Bean 을 테스트 해 보았다.

개인적으로 조금 주의해서 봐야할 부분이 @Bean public Hello hello(Printer printer) 부분인것 같다. 언듯 보면 이 메소드의 인자로 Printer를 넘겨줘야 할 것 같지만 스프링이 알아서 타입에 맞는 클래스를 DI 시킨다. 따라서 리턴받은 Hello 클래스에는 Printer 클래스가 주입되어 있음을 확인할 수 있다.