1. 외부 설정 파일 - application.properties
- 애플리케이션 속성의 기본 값을 바꿀 수 있는 설정 파일.
@Configuration
@Import({Config1.class, Config2.class})
//@Import(MyImportSelector.class)
//@EnableMyAutoConfiguration("test2")
class MainConfig{ @Bean Car car() {return new Car();} }
class Config1 { @Bean Car sportsCar() {return new SportsCar();} }
class Config2 { @Bean Car sportsCar() {return new SportsCar2();} }
- 이름이 같은 @Bean sportsCar를 둘다 등록을 하고
ApplicationContext ac = SpringApplication.run(Main.class, args);
- 실행을 해주면...
- 이미 있는 이름이고, 이름을 바꾸거나, setting을 바꿔주라고 나오는데...
- application.properties에 overriding=true로 해주면...
- 실행에 하였지만 overriding되어서 SportsCar2가 등록되었다.
- 설정 등록 방법
- MyProperties 클래스를 작성
@ConfigurationProperties(prefix="mysite")
public class MyProperties {
private String domain;
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
private String email;
}
- Main클래스에 @EnableConfigurationProperties(MyProperties.class)를 붙여준다.
@EnableConfigurationProperties(MyProperties.class)
//@SpringBootApplication // 은 아래의 3개 애너테이션을 붙인것과 동일
@SpringBootConfiguration // @Configuration하고 동일
@EnableAutoConfiguration
@ComponentScan
public class Main {
public static void main(String[] args) {
ApplicationContext ac = SpringApplication.run(Main.class, args);
// ApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class, Config1.class, Config2.class); // 자바 설정을 이용하는 AC
// ApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class); // 자바 설정을 이용하는 AC
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
System.out.println("ac = " + ac);
Arrays.sort(beanDefinitionNames); // 빈 목록이 담긴 배열을 정렬
Arrays.stream(beanDefinitionNames) // 배열을 스트림으로 변환
.filter(b->!b.startsWith("org"))
.filter(b -> !b.contains("Main"))
.forEach(System.out::println); // 스트림의 요소를 하나씩 꺼내서 출력
// System.out.println("ac.getBean(\"sportsCar\") = " + ac.getBean("sportsCar"));
MyProperties prop = ac.getBean(MyProperties.class); // 수동 빈 검색 주입
System.out.println("prop.getDomain() = " + prop.getDomain());
System.out.println("prop.getEmail() = " + prop.getEmail());
}
@Bean
MyBean myBean(){return new MyBean();}
}
- application.properties에 등록한 domain과 email이 잘 나오는 모습...
@EnableConfigurationProperties(MyProperties.class)
//@SpringBootApplication // 은 아래의 3개 애너테이션을 붙인것과 동일
@SpringBootConfiguration // @Configuration하고 동일
@EnableAutoConfiguration
@ComponentScan
public class Main implements CommandLineRunner {
@Autowired
MyProperties prop; // 인스턴스 변수라서 static main에서 쓸 수 없다. 자동 주입
@Override
public void run(String... args) throws Exception {
System.out.println("prop.getDomain() = " + prop.getDomain());
System.out.println("prop.getEmail() = " + prop.getEmail());
}
public static void main(String[] args) {
ApplicationContext ac = SpringApplication.run(Main.class, args);
// ApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class, Config1.class, Config2.class); // 자바 설정을 이용하는 AC
// ApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class); // 자바 설정을 이용하는 AC
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
System.out.println("ac = " + ac);
Arrays.sort(beanDefinitionNames); // 빈 목록이 담긴 배열을 정렬
Arrays.stream(beanDefinitionNames) // 배열을 스트림으로 변환
.filter(b->!b.startsWith("org"))
.filter(b -> !b.contains("Main"))
.forEach(System.out::println); // 스트림의 요소를 하나씩 꺼내서 출력
// System.out.println("ac.getBean(\"sportsCar\") = " + ac.getBean("sportsCar"));
// MyProperties prop = ac.getBean(MyProperties.class);
// System.out.println("prop.getDomain() = " + prop.getDomain());
// System.out.println("prop.getEmail() = " + prop.getEmail());
}
@Bean
MyBean myBean(){return new MyBean();}
}
- CommandLineRunner 인터페이스를 구현해서 인스턴스 변수를 사용
@EnableConfigurationProperties(MyProperties.class)
//@SpringBootApplication // 은 아래의 3개 애너테이션을 붙인것과 동일
@SpringBootConfiguration // @Configuration하고 동일
@EnableAutoConfiguration
@ComponentScan
public class Main implements CommandLineRunner {
@Autowired
MyProperties prop; // 인스턴스 변수라서 static main에서 쓸 수 없다.
@Autowired
ApplicationContext ac;
@Override
public void run(String... args) throws Exception {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
Arrays.sort(beanDefinitionNames); // 빈 목록이 담긴 배열을 정렬
Arrays.stream(beanDefinitionNames) // 배열을 스트림으로 변환
.filter(b->!b.startsWith("org"))
.filter(b -> !b.contains("Main"))
.forEach(System.out::println); // 스트림의 요소를 하나씩 꺼내서 출력
System.out.println("prop.getDomain() = " + prop.getDomain());
System.out.println("prop.getEmail() = " + prop.getEmail());
}
public static void main(String[] args) {
ApplicationContext ac = SpringApplication.run(Main.class, args);
// ApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class, Config1.class, Config2.class); // 자바 설정을 이용하는 AC
// ApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class); // 자바 설정을 이용하는 AC
// System.out.println("ac = " + ac);
// System.out.println("ac.getBean(\"sportsCar\") = " + ac.getBean("sportsCar"));
// MyProperties prop = ac.getBean(MyProperties.class);
// System.out.println("prop.getDomain() = " + prop.getDomain());
// System.out.println("prop.getEmail() = " + prop.getEmail());
}
@Bean
MyBean myBean(){return new MyBean();}
}
- run 메서드에서 실행이 가능하다
- 사용자 정의 속성 추가하기 - @ConfigurationProperties
'Spring DI, AOP' 카테고리의 다른 글
11. 데이터 모델링이란 - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.02.25 |
---|---|
10. AOP의 원리와 용어 - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.02.24 |
8. @Import와 @Conditional - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.02.24 |
7. 의존성 관리와 설정의 자동화(2) - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.02.24 |
6. 의존성 관리와 설정의 자동화(1) - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.02.24 |