- 使用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);
}
}