Ответ 1
Позвольте мне процитировать Spring Справочное руководство по загрузке - Внешняя настройка:
"Spring Загрузка позволяет экранжировать вашу конфигурацию, чтобы вы могли работать с одним и тем же кодом приложения в разных средах."
По моему мнению, настройка не выполняется во время импорта через параметры аннотации, как в вашем втором блоке псевдокода, вместо этого настройка выполняется во время выполнения, например. в классах конфигурации. Позвольте мне адаптировать ваш третий блок кода (только одна функция):
@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. Преимущество над параметрами аннотации заключается в том, что вы можете изменить поведение во время выполнения, а не время компиляции.
Вы также можете ввести параметры конфигурации (если вы предпочитаете иметь их как переменную экземпляра) или использовать множество других условий, например. @ConditionalOnMissingBean
, @ConditionalOnClass
, @ConditionalOnExpression
и так далее. Например, с помощью @ConditionalOnClass
вы можете проверить, находится ли конкретный класс в вашем пути к классу и предоставить параметр для библиотеки, указанной этим классом. С помощью @ConditionalOnMissingClass
вы можете предоставить альтернативную реализацию. В приведенном выше примере я использовал ConditionalOnMissingBean
для реализации по умолчанию для FreeMarkerConfigurer
. Эта реализация используется, когда нет FreeMarkerConfigurer
bean, поэтому можно легко переопределить.
Взгляните на стартеры, предоставленные Spring Boot или сообществом. Хорошее чтение - это запись в блоге. Я многому научился у spring-boot-starter-batch-web, у них была серия статей в немецком журнале Java, но части также доступны в Интернете, см. Загрузите свою собственную инфраструктуру - Расширение Spring Загрузка в пять шагов (ДОЛЖНО ПРОЧИТАТЬ), и особенно пункт "Сделайте свой стартер настраиваемым, используя свойства".