개발을 하다보면 재사용 해야하는 프로퍼티도 생길 수 있습니다.
필드에 지정하면 재사용 하기 힘들어 집니다.
그래서프로퍼티의 값을 별도의 클래스
로추출
해 보겠습니다.
우선 프로퍼티를 하나 더 추가해 보겠습니다.
가장 많이 사용하는 Port를 넣겠습니다.
@MyAutoConfiguration
@ConditionalMyOnClass("org.apache.catalina.startup.Tomcat")
public class TomcatWebServerConfig {
@Value("${contextPath:}")// application.properties에서 읽어옵니다.
String contextPath;
@Value("${port:8080}")// application.properties에서 읽어옵니다.
int port;
@Bean("tomcatWebServerFactory")
@ConditionalOnMissingBean // 같은 타입의 Bean이 없다면 생성해라
public ServletWebServerFactory servletWebServerFactory(){
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.setContextPath(this.contextPath);
factory.setPort(port);
return factory;
}
}
자세히 보면 @Value("${port:8080}")
port옆에 :8080
이 있습니다.
이것을 만약port와 일치하는 키가 없다면, 디폴트 설정을하는 것입니다.
프로퍼티 클래스를 만들어 줍니다.
public class ServerProperties {
private String contextPath;
private int port;
public void setContextPath(String contextPath) {
this.contextPath = contextPath;
}
public void setPort(int port) {
this.port = port;
}
public String getContextPath() {
return contextPath;
}
public int getPort() {
return port;
}
}
프로퍼티 클래스를 빈으로 등록합니다.
이떄, Binder를 통해 간편하게 환경변수를 설정 할 수 있습니다.
environment
의 키와 ServerProperties
클래스의 필드가 매칭되면 값을 주입합니다.
@MyAutoConfiguration
public class ServerPropertiesConfig {
@Bean
public ServerProperties serverProperties(Environment environment) {
return Binder.get(environment).bind("", ServerProperties.class).get();
}
}
당연히 Bean으로 등록하기 떄문에 자동구성설정에 추가해 줍니다.
tobyspring.config.autoconfig.ServerPropertiesConfig
tobyspring.config.autoconfig.PropertyPlaceholderConfig
tobyspring.config.autoconfig.TomcatWebServerConfig
tobyspring.config.autoconfig.JettyWebServerConfig
tobyspring.config.autoconfig.DispatcherServletConfig
그리고 사용할 곳에서는 클래스
를 주입받아 사용하면 됩니다!
@MyAutoConfiguration
@ConditionalMyOnClass("org.apache.catalina.startup.Tomcat")
public class TomcatWebServerConfig {
@Bean("tomcatWebServerFactory")
@ConditionalOnMissingBean // 같은 타입의 Bean이 없다면 생성해라
public ServletWebServerFactory servletWebServerFactory(ServerProperties properties){
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.setContextPath(properties.getContextPath());
factory.setPort(properties.getPort());
return factory;
}
}