복붙노트

[SPRING] 초기화 할 때로드 될 모든 Spring 부트 속성과 모든 것을 존중하고 속성 파일의 값을 기반으로 @Aspect를 제어합니다.

SPRING

초기화 할 때로드 될 모든 Spring 부트 속성과 모든 것을 존중하고 속성 파일의 값을 기반으로 @Aspect를 제어합니다.

@PropertySources를 사용하여 외부 파일에서 속성을로드하고 있습니다. 이제 속성을 기반으로 @Aspect를 활성화 / 비활성화하려고합니다. 작동하지 않는 @ConditionalOnExpression을 사용해 보았습니다. 나는 propertyplaceholderconfig의 bean을 생성하여 같은 것을 시도했다. 같은 경우에도 작동하지 않았습니다. 그렇다면 초기에 작동하지 않은 @profile도 시도했습니다.

내가 알아 낸 것은 이러한 변수가 시작시 propertysource 또는 propertyplaceholder bean이 시작될 때 초기화되지 않는다는 것입니다. 일부 변수는 항상 (logging.file)처럼 무시됩니다. 그러나 @Value는 잘 작동합니다. 이러한 변수를 설정하기 위해 JVM 매개 변수로 전달해야합니다.

그래서 내 질문은 : 1. 어떻게 시작할 때 지정한 속성 파일을 항상 읽고 모든 것을 존중하도록 봄을 만들 수 있습니까? 2. @Aspect를 활성화 / 비활성화하는 가장 좋은 방법은 무엇입니까? @profile 또는 @ConditionalOnExpression 또는 다른 것을 사용하고 있습니까?

현재 main 메소드에 logging.file을 설정하고 있는데 이는 동일한 방식으로 작동하기 때문입니다. 그러나 여러분들은 이것이 적절한 방법이 아니라는 것을 알고 있습니다. 이렇게하면 속성을 하나씩 추가 할 수 있습니다. 모든 파일을 외부 파일에 저장하여 스프링이 해당 파일을 읽고 속성을 설정하기를 원합니다.

우리의 속성 구조 :

프로필을 사용할 수 있음을 이해합니다. 그러나 속성을 변경하는 경우 서비스를 다시 시작해야하는 등 외부의 속성을 유지하려고합니다. 또한 변수를 JVM 매개 변수로 전달하고 싶지 않고 이러한 방식으로 대부분의 변수를 전달해야합니다. -Dspring.config.location을 전달하는 것은 common.properties와 service.properties가 사용되며 'service.properties'파일 이름이 각 서비스마다 다릅니다.

샘플 코드 :

Mainclass :

@PropertySources({
        @PropertySource(value = "file:${property_path}/common.properties", ignoreResourceNotFound = false),
        @PropertySource(value = "file:${property_path}/service1.properties", ignoreResourceNotFound = true) })
public class MainClass {
static String logDirectory = ApplicationContext.getGlobalProperty("logging.file");

    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(MainClass.class);

        Properties properties = new Properties();
        properties.put("logging.file", logDirectory);
        springApplication.setDefaultProperties(properties);
        springApplication.run(args);
    }
}

응용 프로그램 컨텍스트 :

@Configuration
@EnableAutoConfiguration
public class ApplicationContext implements EnvironmentAware {

    private static Environment environment;

    @Override
    public void setEnvironment(Environment environment) {
        ApplicationContext.environment = environment;
    }
    public static String getGlobalProperty(String propertyName) {
    return environment.getProperty(propertyName);
    }
}

여기서 환경을 사용하여 재산을 얻는 방법을 알 수 있습니다. 환경을 사용하여 속성을 설정하는 방법이 있습니까? 예를 들어 스프링 부트 초기화 중에 속성이 채워지는 경우?

또한 ApplicationContextInitializer를 구현하고 initialize 메소드를 재정 의하여 속성을 읽을 수 있습니다. 하지만 어떻게 2 개의 속성 파일을 읽고 최신 값으로 중복 속성을 무시할 수 있습니까? 참조 (이 방법으로 요구 사항을 구현하는 방법을 모르겠습니다.) 이 경우에도 망치로 모기를 죽이는 것처럼 보이지 않습니까?

현재 작동중인 솔루션 :

@Aspect
@Profile("!production")
@Configuration
public class ControllerAspect {
@pointcut(....)
} //Here also I've to pass spring.profiles.active as JVM params.
//setting the value in common.properties or service1.properties is not working. 

나는 봄 부팅에 초보자이므로 추가 설명을 알려 주시기 바랍니다.

해결법

  1. ==============================

    1.기본적으로 Spring은 초기화시에 일부 속성을로드하고 (특히 MainClass.java에 쓴 것처럼) 덮어 쓸 논리를 작성할 때까지 해당 속성을 무시할 수있는 옵션이 없습니다. 이들 중 일부는 (logging.file, @ConditionalonExpression에 사용되는 키)를 포함합니다.

    기본적으로 Spring은 초기화시에 일부 속성을로드하고 (특히 MainClass.java에 쓴 것처럼) 덮어 쓸 논리를 작성할 때까지 해당 속성을 무시할 수있는 옵션이 없습니다. 이들 중 일부는 (logging.file, @ConditionalonExpression에 사용되는 키)를 포함합니다.

    -Dspring.config.location을 사용하여 등록 정보 파일을 지정하십시오. 이 경우 항상 스프링은 지정된 위치에서 속성을 읽습니다. 여러 속성 파일을 제공 할 수도 있습니다. 훨씬 더 자세한 내용은이 부분을 참조하십시오. 디렉토리가 역순으로로드 할 때 속성 위치를 지정하는 것 같습니다. 그러나 파일을 지정하면 지정된 순서대로 수행됩니다.

    참고 :이 모든 것들을 함께 결합 할 수 있습니다. 우선 순위에 대해 알고 싶다면 이것을 참조하십시오.

  2. from https://stackoverflow.com/questions/54519104/spring-boot-properties-to-be-loaded-at-initialization-and-respect-all-and-contro by cc-by-sa and MIT license