programing

Spring @Import 또는 @Configuration을 매개변수로 설정할 수 있습니까?

muds 2023. 6. 20. 21:51
반응형

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스타일 구성.

  1. 사용자 정의 만들기@ImportConfig생성된 원본 파일에 하드 코딩된 구성 속성을 수락하는 주석 및 주석 프로세서.
  2. 사용BeanFactoryPostProcessor또는BeanPostProcessor포함된 콩을 각각 추가하거나 조작합니다.

특별히 간단한 IMO는 아니지만, 당신이 특정한 작업 방식을 가지고 있는 것처럼 보이기 때문입니다.그래서 시간을 투자할 가치가 있을 수 있습니다.

언급URL : https://stackoverflow.com/questions/32876175/is-it-possible-to-make-spring-import-or-configuration-parametrized

반응형