스프링 부트는 자동 구성(Auto Configuration)이라는 기능을 제공하는데, 일반적으로 자주 사용하는 수 많은 빈들을 자동으로 등록해주는 기능
ex: JdbcTemplate, DataSource, TransactionManager..
@AutoConfiguration - 자동구성시 필요한 애노테이션, 인자로 들어오는 값 다음에 실행하도록 설정
@ConditionOnClass - if문과 비슷하다, 인자로 들어오는 클래스가 있는경우에만 동작함! 없으면 여기 있는 설정, 빈 다 무효화!
@ConditionalOnMissingBean - 위와 반대로, 인자로 들어오는 클래스가 없는경우에만 동작
->개발자가 직접 빈등록을 하는 경우에는 스프링에서 이것을 먼저 사용함
public interface Condition {
boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}
이 기능을 사용하려면 Condition 인터페이스를 구현해야한다.
ConditionContext: 스프링 컨테이너, 환경정보
AnnotatedTypeMetadata : 애노테이션 메타 정보
똑같이 Condition 인터페이스를 구현해 동작하기 떄문에
이 외에도
CondtionalOnBean
CondtionalOnResource
CondtionalOnExpression.
.
.
@Conditional 은 스프링 기능이며 @ConditionalOnXXX는 스프링 부트기능
- 라이브러리 코드작성 후 빌드 -> jar 추출
- jar 를 libs안에 넣는다
- dependency -> implementation files(경로) 추가
- Bean 등록
라이브러리 하나를 만드는데도 이런 복잡한 과정이 필요하다
또한 라이브러리를 사용하는 클라이언트 개발자 입장에서는 어떤것을 빈으로 등록해야 하는지도 알아야한다
이를 해결하기위해 스프링부트는 자동구성(AutoConfiguration) 을 지원한다.
src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 파일생성
이렇게 해주면 스프링부트에 자동 빈등록 된다.
순서는 @SpringBootApplication ->@EnableAutoConfiguration -> @Import(AutoConfigurationImportSelector.class) 순으로 진행 된다.
@Import는 주로 스프링 설정정보(@Configuration) 을 포함할때 사용한다. 그런데 AutoConfigurationImportSelector 을 열어보면 @Configuration이 아니다. 이것을 이해하기위해서는 ImportSelector 에대해 알아야한다.
1. 정적방법 : @Import(클래스)
2. 동적방법 : @Import(ImportSelector)
@Configuration
@Import({AConfig.class, BConfig.class})
public class AppConfig {...}
public class HelloImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"hello.selector.HelloConfig"};
} }