spring-boot-starter 구현
1. 의존성 추가
<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>
2. Holoman POJO 생성
public class Holoman {
String name;
int howLong;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHowLong() {
return howLong;
}
public void setHowLong(int howLong) {
this.howLong = howLong;
}
@Override
public String toString() {
return "Holoman{" +
"name='" + name + '\'' +
", howLong=" + howLong +
'}';
}
}
3. 설정 파일 (Configuration) 생성
보통은 설정 파일과 설정의 대상이 되는 파일은 다른 프로젝트로 분리하는 게 맞지만 편의상 같은 프로젝트에 설정하였다.
@Configuration
public class HolomanConfiguration {
@Bean
public Holoman holoman() {
Holoman holoman = new Holoman();
holoman.setHowLong(5);
holoman.setName("junwoo");
return holoman;
}
}
4. spring.factories 파일 생성
이전에 공부하였던 자동 설정과 동일한 파일 구조로 생성한다.
EnableAutoConfiguration을 키로
해당 설정 파일에 대한 경로 설정
5. mvn install 실행 - 프로젝트 빌드하여 jar파일로 만든 다음 로컬 maven 저장소에 설치
6. 원래의 Project로 돌아와 메이븐 install 한 파일을 pom.xml 의존성 추가
<dependency>
<groupId>me.choi</groupId>
<artifactId>junwoo-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
7. 설정 프로젝트에 있는 Holoman 의존성 주입
@Component
public class HolomanRunner implements ApplicationRunner {
@Autowired
Holoman holoman;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(holoman);
}
}
문제점 발생
Bean을 한 개 더 생성해보자
@Configuration
@SpringBootApplication
public class SpringbootgettingstartedApplication {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(SpringbootgettingstartedApplication.class);
springApplication.setWebApplicationType(WebApplicationType.NONE);
springApplication.run(args);
}
@Bean
public Holoman holoman() {
Holoman holoman = new Holoman();
holoman.setName("choijunwoo");
holoman.setHowLong(60);
return holoman;
}
}
정리하자면 현재 Holoman Bean이 두 개가 생성되어있다.
이전에 등록하였던 @Component의 Bean 그리고 지금 생성하였던 @Bean의 Bean
우리가 원하는 결과는 @Component의 Bean인 Holoman {name='choijunwoo', howLong=60} 지만
출력을 하면 다른 결과가 나온다.
즉 등록하였던 Bean이 무시가 된다.
이전에 아래와 같은 순서로 SpringBoot는 Bean을 등록한다 하였다.
SpringBoot는 Bean을 두 단계로 등록을 한다.
- @ComponentScan에서 등록 (1)
- @EnableAutoConfiguration에서 등록 (2)
먼저 방금 등록 한 Bean은 @ComponentScan에 의해 Bean으로 등록된다.
@EnableAutoConfiguration 가 방금 등록한 Bean을 덮어써버린 것이다.
이때 나는
이러한 오류가 나서
spring.main.allow-bean-definition-overriding=true
이와 같이 설정하였다.
코드 참조
https://github.com/mike6321/Spring/tree/master/SpringBoot/springbootgettingstarted
https://github.com/mike6321/Spring/tree/master/SpringBoot/junwoo-spring-boot-starter
'Spring > Spring Boot' 카테고리의 다른 글
(SpringBoot) 내장 웹 서버 이해 (0) | 2020.01.13 |
---|---|
(SpringBoot) Spring Boot의 자동설정 구현해보기(2) (0) | 2020.01.13 |
(SpringBoot) SpringBoot 자동설정 (0) | 2020.01.12 |
(SpringBoot) SpringBoot 의존성 관리 (0) | 2020.01.12 |
(SpringBoot) Spring Mvc(4) - 정적 리소스 지원 (0) | 2020.01.11 |