image.png

@EnableMyAutoConfiguratio이 하는 일은 기존에 만들어둔 configuration 클래스를 Import해오는 것 뿐이며 import문에 클래스명이 하드코딩 되어있음

모든 SpringBoot 애플리케이션에서 이 두가지 Configuration이 항상 다 쓰이지 않기 때문에 동적으로 가져올 수 있는 매커니즘을 도입해야 됨

**동적?

Configuration 클래스로 만들어놓은 구성정보를 동적으로 추가하기

@Import 애너테이션을 클래스 또는 다른 애너테이션의 메타 애너테이션으로 붙여서 연결해주면 되지만

동적으로 가지고 오려는 경우 @Import 애너테이션이 아닌 ImportSelector 인터페이스를 사용해야 됨

애너테이션 메타데이터를 전달 받고 리턴을 String으로 하면 되는 데 리턴되는 String Array에 우리가 import할 Configuration 클래스명을 String으로 만들어주면 됨

String으로 데이터를 리턴하면 String 명에 해당하는 Configuration 클래스들을 구성정보로 Container가 사용한다는 뜻

ImportSelector 구현

ImportSelector를 바로 구현하는 것은 아니고 한 번 더 확장힌 DeferredImportSelector라는 걸 구현할 것

Default ImportSelector ? 다른 Configuration이 붙은 클래스으에 구성정보 생성작업이 모두 끝난 다음에 ImportSelector가 동작하도록 순서를 뒤로 지연할 수 있도록 만들어 주는 것

이렇게 하는 경우 Configuration 클래스들을 프로그램에서 동적으로 결정해서 가져올 수 있게 됨

MyAutoConfigImportSelector

public class MyAutoConfigImportSeletor implements DeferredImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[] {
                "tobyspring.config.autoconfig.DispatcherServletConfig",
                "tobyspring.config.autoconfig.TomcatWebServerConfig"
        };
    }
}