在项目的开发过程中,经常会看到像@ConditionalOnBean、@ConditionalOnClass、@ConditionalOnResource等等类似这样的注解,这些注解的作用是按照一定的条件进行判断,满足条件的就给容器注册bean至于这些注解各有什么作用,这里不作具体讲解。
本篇主要是讲如何自定义@Conditional注解
假如现在有个需求,要求添加一个公用模块提供接口访问频率拦截功能,并且要有开关功能,随时可以关闭打开。
根据需求可定义一个属性frequency,如果其它项目引入此模块并在application.properties中设置frequency=true则打开,不配置或设置frequency=false则关闭。
1、 定义注解
添加@Conditional注解并加入匹配规则实现类
2、 定义匹配规则业务实现类
该类必须继承SpringBootCondition并实现getMatchOutcome方法处理匹配业务规则。
3、 定义Configuration类
将自定义的注解添加到该类上,并设置匹配条件,当spring开始处理此类时,根据上面定义的@Conditional调用OnFrequencyCondition类中的getMatchOutcome方法判断是否符合预期结果,如果匹配则会继续处理该类,如果不匹配则直接返回。
注:该类还需要配置到spring.factories中,暴露给spring处理。