在两个解决您的问题:
1 - 定义一个通用的定制是这样的:
public interface Customizer {
T customize(T t);
boolean supports(Class target);
}
在你的lib你有一个配置:
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 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;
}
}
这样一来,用户应该做的,每当他想定制你的bean的唯一的事情就是实现定制,然后把它声明为一个bean。
public class MyConfigCustomizer implements Customizer {
@Override
public MyConfig customize(MyConfig myConfig) {
//customization here
return myConfig;
}
@Override
public boolean supports(Class> target) {
return MyConfig.class.isAssignableFrom(target);
}
}
他应该把它声明:
@Bean
public Customizer customizer(){
return new MyConfigCustomizer ();
}
我觉得这个回答你的问题,但它的丑陋(uncheched警告和一个列表...)不是最好的,因为一切似乎给用户定制即使它不是。
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可以调整(而不是全部)的豆类。