首页 > 编程知识 正文

condition variable,firstconditional

时间:2023-05-05 01:16:17 阅读:107850 作者:4835

转载自: https://blog.csdn.net/doctor _ who 2004/article/details/79184230

@Conditional注释可以基于任何环境条件注册bean。 是否注册bean实例的条件如下:

classpath路径是否包含特定类、特定类型的bean是否尚未在ApplicationContext中注册、路径下是否存在文件、配置文件是否设置了特定属性、特定系统环境变量

1、根据是否存在特定的系统环境变量注册bean

如果APP应用程序既可以使用mysql数据库,也可以使用Mongo数据库,则必须根据系统环境变量dbType使用不同的数据库。

要实现判断条件,以确定使用spring boot上的@Conditional注释实例化哪个数据源api,请执行以下操作:

importorg.spring framework.context.annotation.condition; importorg.spring framework.context.annotation.condition context; importorg.spring framework.core.type.annotatedtypemetadata; publicclassmysqldbtypeconditionimplementscondition { @ overridepublicbooleanmatches (conditioncontextcontext,annotatedtedtypemem return ' MySQL '.equals ignore case (dbtype ); } publicclassmongodbtypeconditionimplementscondition { @ overridepublicbooleanmatches (conditioncontextcontext,annotatedtedtedtypext return ' mongo '.equals ignore case (dbtype ); }定义了两个Condition后,必须在对应的dao层进行注释。

publicinterfaceuserdao { liststringgetallusernames (; } @ repository @ conditional (mongodbtypecondition.class ) publicclassmongouserdaoimplimplementsuserdao @ overrridepublicliclao @ repository @ conditional (mysqldbtypecondition.class ) publicclassmysqluserdaoimplimplementsuserdao ) @Overridepublide }

根据classpath路径中是否存在特定的类来注册bean

根据classpath路径中是否存在特定的类,可以注册bean,也可以在上面的代码中进行修改。 如果在classpath路径下出现mysql驱动com.mysql.jdbc.Driver,则实例化MysqlUserDaoImpl,否则缺省情况下实例化MongoUserDaoImpl 现在只需更改判断条件即可。

publicclassmysqldbtypeconditionimplementscondition { @ overridepublicbooleanmatches (conditioncontextcontext,annotatedtedtypemem }catch(classnotfoundexceptione ) { return false; } } publicclassmongodbtypeconditionimplementscondition { @ overridepublicbooleanmatches (conditioncontextcontext,annotatatatedted 返回假; }catch(classnotfoundexceptione ) { return true; } 3、其他条件类推

为了实现其他条件的估计,根据需要实现Condition接口即可。

Spring boot提供的@Conditional注释有很多可根据需要使用的内容,例如**@ConditionalOnClass**,@ConditionalOnBean。 例如,直接使用@ conditionalonproperty (name=' dbtype ',havingValue='mongo ' )也可以实现示例1中实现的功能。

条件注释@ConditionalOnBean的正确使用态度

如果使用@ConditionalOnBean注释,则依赖的bean可能已经配置,但无效。 @ConditionalOnBean和Bean的加载顺序有关系吗? 问题演示:

@ configurationpublicclassconfiguration1{ @ bean @ conditionalonbean (bean2. class ) public bean1bean1} { return new bean1} }执行结果: @conditionalonbean(bean2.class )返回false。 定义了bean2,但未加载bean1。

原因是在spring ioc的过程中,优先解析@Component,@Service,@Controller注释的类。 然后解析配置文件类,即@Configuration标记的类。 最后,开始分析在配置类中定义的bean。

在示例代码中,bean1定义在配置类中,当您执行到解析配置类时,将扫描所有@Component,@Service,@Controller,@Configuration标注中的类然而,由于bean1的条件注释依赖于bean2,且bean2位于定义的部署类中,因此此时部署类分析无法保证优先级,可能无效。

解决方案:由于项目中条件注释所依赖的类经常由spring容器管理,因此如果配置中的Bean通过@ConditionalOnBean依赖于配置中的Bean,则@ conditionalonclass (bean 2

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。