Spring

[Spring] 예제로 보는 Java-based Container Configuration

KEMON 2020. 5. 21. 22:22
728x90

1. @Bean(intMethod, destroyMethod)

public class A {
	@Autowired private B b;

    public A(B b) {
        this.b = b;
    }
	
    //@PostConstruct
    void init(){
        log.error("A post construct");
    }

    //@PreDestroy
    void destroy(){
	log.error("A post destroy");
    }
}

 

기존에 사용하던 @PostConstruct , @PreDestroy 어노테이션을 사용하지 않고 아래의 코드블럭에서 보다시피 외부에서 설정이 가능하다.

@Configuration
public class AppConfig {
    @Bean
    public B b(){
        return new B();
    }
    
    @Bean(initMethod = "init",destroyMethod = "destroy")
    public A a(B b){
        return new A(b);
    }


}

@Bean(initMethod = "init", destroyMethod = "destroy") 어노테이션의 옵션을 사용하여 @PostConstruct, @PreDestroy를 대신할 수 있다. 

이렇게 하는 이유는 destroy()라는 함수에 @PreDestroy 어노테이션을 달면 A라는 클래스의 설정값이 들어가게 된다.

가능하면 특정 클래스에는 그 클래스에서 필요한 정보만 넣고 설정값들은 외부에서 관리하는 것이 더 좋다.

 

※위와 같이 XML설정 보다 @Configuration, @Bean설정을 이용해서 개발에 사용하면 자바클래스지만 설정이 필요한 자바클래스, 비지니스 로직이 필요한 자바클래스 이렇게 구분이 가능해진다.

 

2. @Bean(name)

@Configuration
public class AppConfig {

    @Bean(name = "myThing")
    public Thing thing() {
        return new Thing();
    }
    @Bean({"dataSource", "subsystemA-dataSource", "subsystemB-dataSource"})
    public DataSource dataSource() {
}

@Bean 설정만 하게 되면 함수명이 카멜 표기법으로 Bean이름이 설정된다.

하지만 name 옵션을 설정하면 name이름으로 커스터마이징이 가능하다. (배열의 형식으로 Alias 설정도 가능)

 

3. @Import(Class)

@Configuration
public class ConfigA {

    @Bean
    public A a() {
        return new A();
    }
}

@Configuration
@Import(ConfigA.class)
public class ConfigB {

    @Bean
    public B b() {
        return new B();
    }
}
public static void main(String[] args) {
    ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigB.class);

    // now both beans A and B will be available...
    A a = ctx.getBean(A.class);
    B b = ctx.getBean(B.class);
}

ConfigB.class를 Bean으로 등록하지만 @Import(ConfigA.class) 때문에 A.class도 Bean으로 등록된다.

※ComponentScan쓰면 되만 @Import는 보통 테스트코드 작성할때 쓰면 좋다. 

설정이 복잡한 경우 테스트코드에서 @Import를 사용하면 조금 더 간편해지기 때문!

728x90