스프링 부트의 AutoConfiguration
@SpringBootApplication
- @SpringBootApplication은 스프링부트는 빈을 생성하고 컨텍스트를 만드는 과정을 내포한다. 이 어너테이션은 3개의 어너테이션을 포함한다.
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
- @ComponentScan은 해당 클래스 이하의 component에 대하여 빈을 생성한다.
- @EnableAutoConfiguration은 다양한 Configuration 파일을 읽고 자동으로 빈을 생성한다. /META-INF/spring.factories 의 설정 파일을 기반으로 생성한다.
- @ComponentScan 수행 후 @EnableAutoConfiguration 을 수행한다. 이 말은 @EnableAutoConfiguration 에서 등록한 빈의 우선순위가 높다는 의미와 같다.
@EnableAutoConfiguration 구현하기
- @EnableAutoConfiguration 을 실제로 구현한다.
- spring.factories을 다뤄본다.
라이브러리 생성하기
- 메이븐에 아래의 디펜던시를 추가하여 @EnableAutoConfiguration 의 대상이 되도록 한다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
- 아래의 객체를 생성한다.
public class TesterVO {
private String name;
private int age;
public TesterVO(String name, int age) {
this.name=name;
this.age=age;
}
// 후략 ...
}
- ConditionalOnMissingBean을 사용하여 혹시 해당 빈이 등록되지 않은 경우 아래의 설정에 따라 등록되도록 한다.
@Configuration
@EnableConfigurationProperties(TesterProperties.class) // properties 를 사용
public class TesterConfig {
@Bean
@ConditionalOnMissingBean // ComponentScan 에 우선권을 준다.
public TesterVO testerVO(TesterProperties properties) {
return new TesterVO(properties.getName(), properties.getAge());
}
}
- 다음은 프로퍼티스 객체이다.
@ConfigurationProperties("test")
@Data
public class TesterProperties {
private String name;
private int age;
}
- spring.factories에서 자동등록할 빈 명세서를 작성한다.
\src\main\resources\META-INF\spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
spring.config.TesterConfig
- 마지막으로 maven - install 을 한다.
- .m2 폴더에 빌드한 파일이 있음을 확인한다.
생성한 라이브러리의 빈을 등록하기
- 클라이언트 프로젝트를 생성하고, 이전에 생성한 jar를 의존성에 추가한다.
<dependency>
<groupId>test</groupId>
<artifactId>spring_config</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
- 프로퍼티를 활용하여 아래와 같이 두 가지 방식으로 빈을 등록할 수 있음을 확인한다.
test.name = 'kim'
test.age = 4
@Configuration
public class RunnerConfig {
@Bean
public TesterVO testerVO(TesterProperties prop) {
return new TesterVO("aoi", 66);
}
}
- 빈을 잘 등록되었는지 확인한다.
@Autowired
TesterVO testerVO;
@Override
public void run(String... args) throws Exception {
log.info("====CommandLineRunner====");
log.info("result : {}", testerVO.toString());
}