Spring @Import 또는 @Configuration을 매개변수로 설정할 수 있습니까?
인 작은 콩 용기를 @Configuration
와 Spring 할 때 합니다.
@Import({
FreemarkerViewResolver.class, // registers freemarker that auto appends <#escape etc.
ConfigurationFromPropertiesFile.class, // loads conf/configuration.properties
UtfContentTypeResponse.class, // sets proper Content-language and Content-type
LocaleResolverWithLanguageSwitchController // Locale resolver + switch controller
);
class MySpringBootApp ...
예를 들어, 그런 것들 중 하나입니다.@Configuration
선택한 언어 등으로 전환할 수 있도록 웹 컨트롤러가 있는 로케일 쿠키에 대한 세션 저장소를 설정합니다.
사용하고 재사용하는 것은 매우 즐겁지만, 매개변수를 지정하여 훨씬 더 많은 재사용이 가능하도록 하면 정말 좋을 것입니다.내 말은 다음과 같은 것을 의미합니다.
유사 코드:
@Imports( imports = {
@FreemarkerViewResolver( escapeHtml = true, autoIncludeSpringMacros = true),
@ConfigurationFromProperties( path = "conf/configuration.properties" ),
@ContentTypeResponse( encoding = "UTF-8" ),
@LocaleResolver( switchLocaleUrl = "/locale/{loc}", defaultLocale = "en"
})
그러니까, 기본적으로 "구성 가능"이란 말입니다.@Configurations
구성을 그렇게 만드는 가장 좋은 방법은 무엇입니까?
아마도 다음과 같은 것(다시, 유사 코드)이 있을 것입니다.
@Configuration
public class MyAppConfiguration {
@Configuration
public FreemarkerConfiguration freemarkerConfiguration() {
return FreemarkerConfigurationBuilder.withEscpeAutoAppend();
}
@Configuration
public ConfigurationFromPropertiesFile conf() {
return ConfigurationFromPropertiesFile.fromPath("...");
}
@Configuration
public LocaleResolverConfigurator loc() {
return LocaleResolverConfigurator.trackedInCookie().withDefaultLocale("en").withSwitchUrl("/switchlocale/{loc}");
}
Spring Boot Reference Guide - 외부화된 구성:
"Spring Boot을 사용하면 구성을 외부화하여 서로 다른 환경에서 동일한 애플리케이션 코드로 작업할 수 있습니다."
제 생각에 사용자 지정은 두 번째 유사 코드 블록과 같은 주석 매개 변수를 통해 가져오기 시간에 수행되지 않고, 대신 사용자 지정은 런타임에 수행됩니다. 예를 들어 구성 클래스에서 수행됩니다.세 번째 코드 블록을 조정해 보겠습니다(한 가지 기능만).
@Configuration
public class MyAppConfiguration {
@Autowired
private Environment env;
// Provide a default implementation for FreeMarkerConfigurer only
// if the user of our config doesn't define her own configurer.
@Bean
@ConditionalOnMissingBean(FreeMarkerConfigurer.class)
public FreeMarkerConfigurer freemarkerConfig() {
FreeMarkerConfigurer result = new FreeMarkerConfigurer();
result.setTemplateLoaderPath("/WEB-INF/views/");
return result;
}
...
@Bean
public LocaleResolverConfigurator loc() {
String defaultLocale = env.getProperty("my.app.config.defaultlocale", "en");
String switchLocale = env.getProperty("my.app.config.switchlocale", "/switchlocale/{loc}");
return LocaleResolverConfigurator.trackedInCookie().withDefaultLocale(defaultLocale).withSwitchUrl(switchLocale);
}
위해서LocaleResolverConfigurator
환경에서 구성을 읽습니다. 의미 있는 기본값이 정의됩니다.명령줄 또는 yaml 파일을 통해 지원되는 모든 방법(첫 번째 링크에 문서화됨)으로 구성 매개 변수에 다른 값을 제공하여 기본값을 쉽게 변경할 수 있습니다.주석 매개변수에 비해 컴파일 시간 대신 런타임에 동작을 변경할 수 있다는 장점이 있습니다.
구성 매개 변수를 인스턴스 변수로 사용하려는 경우 구성 매개 변수를 주입하거나, 다른 많은 조건(예: , 등)을 사용할 수도 있습니다.예를 들어 다음과 같습니다.@ConditionalOnClass
특정 클래스가 클래스 경로에 있는지 확인하고 이 클래스에 의해 식별된 라이브러리에 대한 설정을 제공할 수 있습니다.와 함께@ConditionalOnMissingClass
대안적인 구현을 제공할 수 있습니다.에서 저는 위의예사습니다용했서에다니습사를 했습니다.ConditionalOnMissingBean
본구을제다에 구현을 합니다.FreeMarkerConfigurer
이 구현은 다음과 같은 경우에만 사용됩니다.FreeMarkerConfigurer
빈을 사용할 수 있으므로 쉽게 오버라이드할 수 있습니다.
Spring Boot 또는 커뮤니티에서 제공하는 스타터를 살펴봅니다.좋은 읽을거리는 또한 이 블로그 항목입니다.spring-boot-starter-batch-web을 통해 많은 것을 배웠습니다. 독일 Java 잡지에 기사 시리즈가 있었지만 부품도 온라인 상태입니다. 자세한 내용은 Boot Your Own Infrastructure – Extending Spring Boot in 5 step(MUST READ), 특히 "속성을 사용하여 스타터를 구성할 수 있게 만들기"를 참조하십시오.
비록 나는 수입이 매개변수화되는 것에 대한 아이디어를 좋아하지만, 나는 현재의 상태에서 사용하고 있다고 생각합니다.@Import
그리고.@Configuration
잘 맞지 않습니다.
동적 구성을 사용하는 데 필요하지 않은 두 가지 방법을 생각할 수 있습니다.PropertySource
스타일 구성.
- 사용자 정의 만들기
@ImportConfig
생성된 원본 파일에 하드 코딩된 구성 속성을 수락하는 주석 및 주석 프로세서. - 사용
BeanFactoryPostProcessor
또는BeanPostProcessor
포함된 콩을 각각 추가하거나 조작합니다.
특별히 간단한 IMO는 아니지만, 당신이 특정한 작업 방식을 가지고 있는 것처럼 보이기 때문입니다.그래서 시간을 투자할 가치가 있을 수 있습니다.
언급URL : https://stackoverflow.com/questions/32876175/is-it-possible-to-make-spring-import-or-configuration-parametrized
'programing' 카테고리의 다른 글
특정 디렉토리에서 어떻게 'git diff'를 합니까? (0) | 2023.06.20 |
---|---|
단일 파일에서 충돌 해결 다시 시작/실행 취소 (0) | 2023.06.20 |
Cloud Firestore에서 논리적 OR을 사용하여 복합 쿼리를 수행하는 방법은 무엇입니까? (0) | 2023.06.20 |
레포의 원격 깃 주소를 검색하려면 어떻게 해야 합니까? (0) | 2023.06.20 |
URL 문자열에서 포트 번호를 제거하는 방법 (0) | 2023.06.20 |