和FactoryBean去定义具体获取方式不同,其实也有Spring提供类似的机制,可以完成这个获取方式,即有自定义的用自定义,没有的话,使用默认的
比如:
@ConditionalOnMissingBean
用@ConditionalOnMissingBean这个注解,你在配置你的默认实现时,给它上面加一个
@Bean
@ConditionalOnMissingBean(InterceptorPredicate.class)
public InterceptorPredicate defaultPre(){
return new YourDefaultPredicate();
}
这样如果配置之后,如果别人有配置了InterceptorPredicate的实现,那你这个默认的实现自动失效了,然后你在你的MyInterceptor里可以直接@Autowired即可
@Component
public class MyInterceptor implements HandlerInterceptor {
@Autowired
private InterceptorPredicate predicate;
}
其实这种做法,官方里也很常用,尤其在一些autoconfigure,比如redisTemplate
亦或者mongoTemplate
ObjectProvider
从该接口的注释就可以看得出,它就是你想要的,尤其是optionality,选择性,意味着你可以选择你Bean的实现
其中的方法getIfAvailable,从名字你就可以看出来,如果Bean存在就返回
不说其他,我们看看其他autoconfigure包里是怎么使用的,你就明白了
所以这样你的MyInterceptor就好配置啦
@Bean
public HandlerInterceptor myInterceptor(ObjectProvider predicateProvider){
InterceptorPredicate predicate = predicateProvider.getIfAvailable();
if(predicate == null) {
predicate = new YourDefaultPredicate();
}
return new MyInterceptor(predicate);
}
当然我们也可以看到MyInterceptor还有一个重载的方法,传入一个默认的Supplier
所以我们也可以这样写
@Bean
public HandlerInterceptor myInterceptor(ObjectProvider predicateProvider){
InterceptorPredicate predicate = predicateProvider.getIfAvailable(YourDefaultPredicate::new);
return new MyInterceptor(predicate);
}
如果只是简单的为空默认替换,其实上面两种基本都够用了,如果还有一些额外的不只是判空替换规则的话,你就还需要@Conditional注解了,去定制你的bean注入的条件