자동 설정
@SpringBootApplication
빈은 두 단계로 나눠서 읽힌다.
@ComponentScan
@EnableAutoConfiguration
@SpringBootConfiguration
사실상의 @Configuration
@ComponentScan
컴포넌트 애너테이션이 달린 클래스를 빈으로 등록한다.
@Component, @Configuration, @Repository, @Service, @Controller, @RestController
@EnableAutoConfiguration
컴포넌트 스캔으로 등록한 후 다시 한 번 빈을 읽어와 등록한다.
즉, 없어도 스프링 부트를 사용할 수 있다.
단, 웹 애플리케이션 설정을 꺼줘야 가능
결국 이것도 @Configuration을 가지고 있다.
spring.factories 라는 메타 파일을 읽어들인다.
메타 파일의 키 값을 보고 설정을 읽는다.
조건에 따라 빈이 생성되거나 생성되지 않는다.
예제
설정 만들기
우선 별도의 프로젝트를 새로 판다.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
의존성을 추가한다.
@Configuration 파일을 작성한다.
src/main/resource/META-INF
에 spring.factories를 생성한다.안에 자동 설정 파일을 추가한다.
mvm install
을 실행한다.
설정 적용하기
<dependency>
<groupId>me.whiteship</groupId>
<artifactId>keesunbaik-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

기존 프로젝트로 돌아와 의존성을 적용하면 라이브러리가 나타난다.
@Component
public class HolomanRunner implements ApplicationRunner {
@Autowired
Holoman holoman;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("holoman = " + holoman);
}
}
holoman = Holoman{name='Keesun', howLong=5}
Holoman을 어디서도 정의한 적이 없지만 사용할 수 있게 되었다.
설정 재정의 하기
@SpringBootApplication
public class ConceptsOfSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(ConceptsOfSpringBootApplication.class, args);
}
@Bean
public Holoman holoman() {
Holoman holoman = new Holoman();
holoman.setName("whiteship");
holoman.setHowLong(50);
return holoman;
}
}
하지만 빈을 다시 설정하려고 하면 기존 값 그대로 나온다
스프링 부트 2.1부터는 오버라이딩 하지 못하고 에러가 뜬다.
컴포넌트 스캔이 먼저 동작한다
@Bean이 먼저 동작한다.
@AutoConfiguration으로 다시 등록한다.
@Bean 내용을 덮어 쓴다.
@Configuration
public class HolomanConfiguration {
@Bean
@ConditionalOnMissingBean
public Holoman holoman() {
Holoman holoman = new Holoman();
holoman.setHowLong(5);
holoman.setName("Keesun");
return holoman;
}
}
다시 설정 프로젝트 쪽으로 돌아가서 @ConditionalOnMissingBean을 달아준다.
@ConditionalOnMissingBean
해당 타입의 빈이 없을 때만 이 빈을 등록하라는 뜻이 된다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
설정 프로젝트에서 값을 설정할 때 빈에서 직접 하는 대신 properties에서 가져다 쓸 수도 있다.
본 프로젝트에서 properties에 값을 추가하면 그대로 반영된다.
Last updated
Was this helpful?