Для вашей проблемы есть два решения:
1- определить универсальный настройщик примерно так:
public interface Customizer<T> {
T customize(T t);
boolean supports(Class target);
}
в вашей библиотеке есть конфигурация:
public class MyConfig {
private String property;
public MyConfig() {
}
public void setProperty(String property) {
this.property = property;
}
}
, поэтому ваша конфигурация по умолчанию должна выглядеть примерно так:
@Configuration
public class DefaultConfiguration {
@Autowired(required = false)
private List<Customizer> customizers;
@Bean
public MyConfig myConfig() {
MyConfig myConfig = new MyConfig();
myConfig.setProperty("default value");
if (customizers != null) {
for (Customizer c : customizers) {
if (c.supports(MyConfig.class)) {
return (MyConfig) c.customize(myConfig);
}
}
}
return myConfig;
}
}
, таким образом, единственное, что пользователь должен делать всякий раз, когда он хочет настроить ваш бин, - это реализовать Customizer, изатем объявите его как боб.
public class MyConfigCustomizer implements Customizer<MyConfig> {
@Override
public MyConfig customize(MyConfig myConfig) {
//customization here
return myConfig;
}
@Override
public boolean supports(Class<?> target) {
return MyConfig.class.isAssignableFrom(target);
}
}
и он должен объявить это:
@Bean
public Customizer<MyConfig> customizer(){
return new MyConfigCustomizer ();
}
Я думаю, что это отвечает на ваш вопрос, но это некрасиво (непроверенные предупреждения и список...) не самый лучший, так как все кажется пользователю настраиваемым, даже если это не .
2- Я предлагаю вам предоставить интерфейсы для Бинов, которые могут настраиваться пользователем, что-то вроде:
public interface MyConfigCustomizer{
MyConfig customize(MyConfig config);
}
ваша конфигурация по умолчанию:
@Configuration
public class DefaultConfiguration {
@Autowired(required = false)
private MyConfigCustomizer customizer;
@Bean
public MyConfig myConfig() {
MyConfig myConfig = new MyConfig();
myConfig.setProperty("default value");
if (customizer != null) {
return customizer.customize(myconfig);
}
return myConfig;
}
}
таким образом, пользователь знает, что MyConfig можно настроить (и не всебобы).