Oliver
Oliver

Reputation: 4183

How can an ContextCustomizer access Springs environment properties?

I am implementing a custom Spring context customizer, as I have to perform some operations during startup of the application. The result of the operation is need to configure the datasource I need in my application.

My problem is now, that I need for those operations access to my configuration properties (from application.yaml), as they are the base for my operations.

My, simplified, implementation looks currently like this. Nothing special.

public class MyContextCustomizerFactory
  implements ContextCustomizerFactory {
  @Target(TYPE) @Retention(RUNTIME)
  @Documented @Inherited
  public @interface EnabledPostgresTestContainer {
  }

  @Override
  public ContextCustomizer createContextCustomizer(Class<?> c,
                                                   List<ContextConfigurationAttributes> a) {
  }

  static class MyContextCustomizer implements ContextCustomizer {

    @Override
    public void customizeContext(ConfigurableApplicationContext c, 
                                     MergedContextConfiguration mc) {
    }
  }
}

Of is there an alternatvie approach. Using Springs DynamicPropertySource is currently not an option.

Upvotes: 0

Views: 681

Answers (1)

Andrey B. Panfilov
Andrey B. Panfilov

Reputation: 6101

Not sure ContextCustomizerFactory is what you are looking for, because you are talking about "application" but ContextCustomizerFactory is designed for running tests, anyway...

What exactly has confused you?

public class MyContextCustomizerFactory implements ContextCustomizerFactory {

    @Override
    public ContextCustomizer createContextCustomizer(Class<?> testClass, List<ContextConfigurationAttributes> configAttributes) {
        return new MyContextCustomizer();
    }

}
public class MyContextCustomizer implements ContextCustomizer {

    @Override
    public void customizeContext(ConfigurableApplicationContext context, MergedContextConfiguration mergedConfig) {
        ConfigurableEnvironment environment = context.getEnvironment();

        // reading properties
        String applicationName = environment.getProperty("application.name");

        // enriching properties
        Properties jdbcProperties = new Properties();
        jdbcProperties.put("spring.datasource.url", "jdbc://....");
        environment.getPropertySources().addFirst(
                new PropertiesPropertySource("customizerProperties", jdbcProperties)
        );
    }
}

UPD.

If the goal is to modify env/properties after Spring has parsed @Configuration classes with @PropertySource we may use BeanFactoryPostProcessor, below are some examples from spring:

Upvotes: 1

Related Questions