TestApplication.java
package com.test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
@SpringBootApplication
덕분이다.@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
//아래 내용 생략...
- TestApplication.java이 설정 파일 클래스 역할도 포함하고 있다.
- @SpringBootConfiguration은 자동적으로 설정들이 위치하는 것을 허락한다.
- 나중에 유닛, 통합 테스트를 진행할 때 유용하게 적용될 수 있다.
- 다른 종류의 객체를 위해 Container가 2번 생성된다.
- 아래 Annotation을 통해 Bean 설정 파일의 조건을 재정의해줄 수 있고 사용자 정의 스타터를 만들 때 유용하게 사용될 수 있다.
- @ConditionalOnWebApplication : 웹 어플레케이션 타입을 체크하여 설정 클래스에 적용한다.(SERVLET(Spring Boot App), NONE(일반 Java Application))
- ConditionalOnMissingBean : 특정 Bean이 메모리에 없을 때 현재 설정 클래스에 적용한다.
- @ConditionlOnBean : 해당 Bean이 포함되어 있을 때 설정 클래스에 적용한다.
- @ConditionalOnClass : 해당 클래스가 클래스 경로에 존재할 때 설정 클래스를 적용한다.
- @AutoConfigureOrder : 자동 설정 클래스의 우선순위를 지정한다.(Ordered.HIGHEST_PRECEDENCE + 5 : 가장 높은 우선순위보다 5단계 높게 설정)
application.properties 예시
# Application 모드 설정
spring.main.web-application-type=servlet
#기본 Spring Boot App, none은 그냥 Java Application으로 실행된다.
#Banner Setting, 끌 수도 있고 내가 원하는 banner을 넣어줄 수도 있다.
spring.main.banner-mode=off
spring.banner.location=banner/banner.txt
#Bean Overriding 설정(중복 객체 덮어쓰기)
spring.main.allow-bean-definition-overriding=true
#View Resolver 설정
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.html
#Server Port(기본은 8080)
server.port=8080
application.properties
test.name=spring
test.rd=${random.int} # 랜덤으로 값을 줄 수도 있다.
@Component
public class Test1 implements ApplicationListener<ApplicationStartedEvent> {
@Value("${test.name}")
private String name;
@Value("${test.rd}")
private int randomNum;
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
System.out.println(name);
System.out.println(randomNum);
}
}
application.properties
test.name=spring
@Component
public class Test2 implements ApplicationListener<ApplicationStartedEvent>{
@Autowired
public Environment environment;
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
System.out.println(environment.getProperty("test.name"));
}
}
application.properties
test.name=spring
@Data //lombok
@Component
@ConfigurationProperties("test")
public class TestObject{
private String name;
}
@Component
public class test3 implements ApplicationListener<ApplicationStartedEvent>{
@Autowired
private TestObject testObject;
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
System.out.println(testObject.getName());
}
}
application.properties
#Data Source
data.source.jdbc.driverClassName=org.h2.Driver
data.source.jdbc.url=jdbc:h2:tcp://localhost/~/test
data.source.jdbc.username=username
data.source.jdbc.password=password
@Data //lombok
@ConfigurationProperties(prefix="data.source")
//data.source로 시작하는 설정 값과 매핑
public class JDBCProperties {
private String url;
private String driverClassName;
private String username;
private String password;
}
@Configurable
@EnableConfigurationProperties(JDBCProperties.class)
public class AutoConfiguration {
@Autowired
private JDBCProperties properties;
//아래 내용 생략
@SpringBootApplication
@PropertySource(value = {"test1.properties", "test2.properties"})
public class PropertiesApplication {
public static void main(String[] args) {
SpringApplication.run(PropertiesApplication.class, args);
}
}
#Data Source
data:
source:
jdbc:
driverClassName: org.h2.Driver
url: jdbc:h2:tcp://localhost/~/test
username: username
password: password
#Server
server:
port: 7777
servlet:
context-path: /
encoding:
charset: UTF-8
Reference: