当前位置:
凯发k8官方网 >
前端技术
> javascript
>内容正文
javascript
springboot中condition注解的使用 -凯发k8官方网
凯发k8官方网
收集整理的这篇文章主要介绍了
springboot中condition注解的使用
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
在项目中,有时会遇到我们的configuration、bean、service等等的bean组件需要依条件按需加载的情况。
springboot中提供了一系列@condition* 注解来处理有条件注入的情况。
1. 说明
spring4中增加了@condition annotation, 使用该annotation之后,在做依赖注入的时候,会检测是否满足某个条件来决定是否注入某个类。
springboot基于spring4的这个注解实现了多个用于判断的条件注解,如果我们在使用中这些注解无法满足我们的要求还可以使用@conditional自定义条件注解
2. 常用的条件注解
条件注解对应的condition 处理类处理逻辑@conditionalonbean | onbeancondition | spring容器中是否存在对应的实例。可以通过实例的类型、类名、注解、昵称去容器中查找(可以配置从当前容器中查找或者父容器中查找或者两者一起查找) |
@conditionalonclass | onclasscondition | 类加载器中是否存在对应的类。可以通过class指定(value属性)或者class的全名指定(name属性)如果是多个类或者多个类名的话,关系是”与”关系,也就是说这些类或者类名都必须同时在类加载器中存在 |
@conditionalonexpression | onexpressioncondition | 判断spel 表达式是否成立 |
@conditionalonmissingbean | onbeancondition | spring容器中是否缺少对应的实例。可以通过实例的类型、类名、注解、昵称去容器中查找(可以配置从当前容器中查找或者父容器中查找或者两者一起查找) |
@conditionalonmissingclass | onclasscondition | 跟conditionalonclass的处理逻辑一样,只是条件相反,在类加载器中不存在对应的类 |
@conditionalonproperty | onpropertycondition | 应用环境中的屬性是否存在。提供prefix、name、havingvalue以及matchifmissing属性。prefix表示属性名的前缀,name是属性名,havingvalue是具体的属性值,matchifmissing是个boolean值,如果属性不存在,这个matchifmissing为true的话,会继续验证下去,否则属性不存在的话直接就相当于匹配不成功 |
@conditionalonresource | onresourcecondition | 是否存在指定的资源文件。只有一个属性resources,是个string数组。会从类加载器中去查询对应的资源文件是否存在 |
@conditionalonsinglecandidate | onbeancondition | spring容器中是否存在且只存在一个对应的实例。只有3个属性value、type、search。跟conditionalonbean中的这3种属性值意义一样 |
@conditionalonwebapplication | onwebapplicationcondition | 应用程序是否是web程序,没有提供属性,只是一个标识。会从判断web程序特有的类是否存在,环境是否是servlet环境,容器是否是web容器等 |
举例
例子说明@conditionalonbean(javax.sql.datasource.class) | spring容器或者所有父容器中需要存在至少一个javax.sql.datasource类的实例 |
@conditionalonclass({ configuration.class,freemarkerconfigurationfactory.class }) | 类加载器中必须存在configuration和freemarkerconfigurationfactory这两个类 |
@conditionalonexpression(“’${server.host}’==’localhost’”) | server.host配置项的值需要是localhost |
conditionalonjava(javaversion.eight) | java版本至少是8 |
@conditionalonmissingbean(value = errorcontroller.class, search = searchstrategy.current) | spring当前容器中不存在errorcontroller类型的bean |
@conditionalonmissingclass(“genericobjectpool”) | 类加载器中不能存在genericobjectpool这个类 |
@conditionalonnotwebapplication | 必须在非web应用下才会生效 |
@conditionalonproperty(prefix = “spring.aop”, name = “auto”, havingvalue = “true”, matchifmissing = true) | 应用程序的环境中必须有spring.aop.auto这项配置,且它的值是true或者环境中不存在spring.aop.auto配置(matchifmissing为true) |
@conditionalonresource(resources=”mybatis.xml”) | 类加载路径中必须存在mybatis.xml文件 |
@conditionalonsinglecandidate(platformtransactionmanager.class) | spring当前或父容器中必须存在platformtransactionmanager这个类型的实例,且只有一个实例 |
@conditionalonwebapplication | 必须在web应用下才会生效 |
3.自定义条件注解
实现条件化注解我们需要两个类
- 自定义注解类
定义注解,指定判断用的条件类 - 条件类
实现org.springframework.context.annotation.condition接口,定义判断条件
举例说明:
1.定义注解类myconditionalonproperty
要使用注解@conditional(myonpropertycondition.class),myonpropertycondition为我们要定义的条件类
2.定义条件类:
public class myonpropertycondition implements condition {@overridepublic boolean matches(conditioncontext context, annotatedtypemetadata metadata) {map<string, object> annotationattributes = metadata.getannotationattributes(myconditionalonproperty.class.getname());string propertyname = (string) annotationattributes.get("value");string value = annotationattributes.get("havingvalue");string propertyvalue = context.getenvironment().getproperty(propertyname);if (propertyvalue.equalsignorecase(value)) {return true;}return false;} }3.调用
@configurationpublic class myconfig {@bean@myconditionalonproperty(value = "env",havingvalue = "dev")public person person(){log.info("创建bean");return new person();}}总结
以上是凯发k8官方网为你收集整理的springboot中condition注解的使用的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
- 下一篇: