- 使用starter的方式比較簡單,引入jar包即可
- 對於配置信息是放在application.properties文件還是使用@EnableXxx的參數形式,如果開發、測試、生產環境配置都一樣,那麼使用@Enable方式比較好,可以減少配置文件,同時由於幾個環境相同,修改一處就全部修改,但是靈活度差點
- 如果配置信息全在@Enable屬性中,那麼可以使用實現ImportBeanDefinitionRegistrar接口的方式,大概如下:
public class LockerConfig implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, @NonNull BeanDefinitionRegistry registry) {
MergedAnnotation<EnableLocker> anno = importingClassMetadata.getAnnotations().get(EnableLocker.class);
String versionColumn = anno.getString("versionColumn");
boolean failThrowException = anno.getBoolean("failThrowException");
LockerInterceptor lockerInterceptor = new LockerInterceptor(versionColumn, failThrowException);
// 註冊locker
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) registry;
beanFactory.registerSingleton("lockerInterceptor", lockerInterceptor);
}
}
- 這種方式的好處,是將註解放在單元測試類頭頂也能生效,可以測試不同的屬性,
- 使用上述方式的壞處,獲取屬性不太方便,只能通過實現EnvironmentAwre的方式使用env獲取,並且由於是properties方式獲取,只能獲取k,v方式的配置,對於數組就獲取不到,因爲ImportBeanDefinitionRegistrar實例方法被調用的時候beanFactory還沒被初始化
- 使用下面方式的好處是,可以方便獲取屬性,但是:context.getBeansWithAnnotation(EnableXXX.class)獲取不到單元測試類頭頂的註解,不太好測試不同參數的表現
@Configuration
@EnableConfigurationProperties(SqlprinterProperties.class)
public class SQLPrinterConfig implements ApplicationContextAware {
private final List<ValueConverter> convs = new ArrayList<>();
@Override
public void setApplicationContext(@Nonnull ApplicationContext context) throws BeansException {
Collection<Object> values = context.getBeansWithAnnotation(EnableSQLPrinter.class).values();
values.forEach(e -> {
EnableSQLPrinter annotation = AnnotationUtils.findAnnotation(e.getClass(), EnableSQLPrinter.class);
Class<? extends ValueConverter>[] converters = annotation.converters();
for (Class<? extends ValueConverter> converter : converters) {
convs.add(ReflectUtil.newInstance(converter));
}
});
}
@Bean
public SqlPrinter sqlPrinter(SqlprinterProperties sqlprinterProperties) {
return new SqlPrinter(sqlprinterProperties, convs);
}
}