Ответ 1
Я не уверен, что вам нужно или нужно отключить стандартную XML-конфигурацию системы ведения журнала, но вы хотите выполнить свои настройки после того, как это было сделано. К счастью, это довольно легко, как это сделано как можно раньше в цепочке инициализации для SpringApplication
. Простейшим местом для размещения кода, вероятно, является SpringApplicationInitializer
(он должен реализовать ApplicationContextInitializer
, чтобы его можно было добавить в SpringApplication
). Например.
SpringApplication application = new SpringApplication(MySources.class);
application.addInitializers(new LoggingInitializer());
application.run(args);
Вы не сможете сделать инъекцию зависимостей в инициализатор, если вы сделаете это именно так, но это гарантирует, что он будет вызван как можно раньше на жизненном цикле. Если ваш инициализатор реализует EnvironmentAware
, вам также будет передан экземпляр Environment
перед вызовом SpringApplicationInitializer.initialize()
- с помощью которого вы можете разрешить компоненты, зависящие от среды, в вашем примере, например.
String loggingLevelRoot = environment.getProperty("logging.level.root");
Как только вы его заработаете, чтобы избежать необходимости делать то же самое для всех приложений, вы можете сделать его декларативным, добавив META-INF/spring.factories
, содержащий ваш класс инициализатора:
org.springframework.context.ApplicationContextInitializer=\
my.pkg.for.LoggingInitializer
Если вам действительно нужна инъекция зависимостей и разрешение @Value
, я думаю, вам нужно будет признать, что ApplicationContext
будет полностью обновлен, прежде чем вы сможете настроить что-либо. Если это приемлемый компромисс, я рекомендую просто добавить LoggingInitializer
к вашему контексту и реализовать его CommandLineRunner
.