所在的位置: html >> html市场 >> springboot的Conditio

springboot的Conditio

北京哪家医院白癜风专科比较好 https://jbk.39.net/yiyuanfengcai/yyjs_bjzkbdfyy/

大家好,我是“良工说技术”。

今天给大家带来的是springboot中的

ConditionalOnClass注解的用法。上次的

ConditionalOnBean注解还记得吗?

一、

ConditionalOnClass注解初始

看下

CodidtionalOnClass注解的定义,

需要注意的有两点,

该注解可以用在类及方法上;类指的是标有

Configuration的类,方法是标有

Bean的方法;

该注解使用了

Conditional注解标记;这是重点

看到这里,有小伙伴会疑惑,讲了那么多

Conditional注解的作用是什么,不急,作用马上来。

ConditionalOnClass注解的作用是当项目中存在某个类时才会使标有该注解的类或方法生效;

这句话有点拗口,通俗的讲,

ConditionalOnClass标识在

Configuration类上,只有存在

ConditionalOnClass中value/name配置的类该Configuration类才会生效;

ConditionalOnClass标识在

Bean方法上,只有只有存在

ConditionalOnClass中value/name配置的类方法才会生效。看具体的实例更容易理解些

二、

ConditionalOnClass注解用法

从上面

ConditionalOnClass注解的定义中我们知道该注解可以配置两个属性,分别是value和name,其中value和name都是数组,只不过内容不一样,

value是Class的数组,name是全限类名的字符串。

1、使用value属性

开始,我一直使用value属性进行配置,但是总是报错,比如我配置

Configuration

ConditionalOnClass(value={Client.class})publicclassMyAutoConfig{publicMyAutoConfig(){System.out.println("constructorMyAutoConfig");}}

该Client是下面的类,

org.springframework.boot.autoconfigure.data.elasticsearch.Client

它是ES中的一个类,我本身配置的含义是只有在Client存在的时候MyAutoConfig才会生效,但是总是不成功。你知道为什么不成功吗?

这是因为我没有引ES的依赖,导致在我的classpath中没有这个类,按照

ConditionalOnClass的理解,应该是不存在则不会生效,但是由于没有这个类,导致的问题是:无法编译,提示下面的错误

java:找不到符号符号:类Client

这是可以理解的,因为没有这个类,而我要引用这个类肯定是引用不到的,所以编译是失败的,也就程序跑不起来。那么存在一个问题,

ConditionalOnClass注解的value属性要在什么情况下使用?

这里有一个mybatisplus的配置类,

其配置类上标识了

ConditionalOnClass注解,该注解中配置了value属性,且配置了SqlSessionFactory和SqlSessionFactoryBean两个类,

MyBatisPlusAutoConfiguration是在mybatis-plus-boot-starter的jar包下

SqlSessionFactory是在mybatis的jar包下

SqlSessionFactoryBean是在mybaits-spring的jar包下

这三个类分属于不同的jar包,如果我在一个项目中引入了mybatis-plus-boot-starter的jar包,没有引入mybatis的jar包那么MybatisPlusAutoConfiguration不会生效,也就是只有mybatis和mybatis-spring的jar包都引入了,MybatisPlusAutoConfiguration才会生效,才会被纳入spring容器的管理。

需要注意一点:为了防止少引包,在mybatis-plus-boot-starter中会依赖mybatis和mybatis-spring,这也是starter的好处,不会少引包,需要哪些依赖它都引好了。

那么再回到问题的开始,为什么,我配置了一个不存在的类就没成功,那是因为java的源文件需要编译,在编译时会检查类是否存在,不存在肯定是编译不通过的;而如果引用的是jar包中的文件引用另外一个jar的,则是因为jar包经过了编译,已经打包成功了,故不存在问题。

通过value属性需要结合jar包的方式,这里就不演示了,感兴趣的小伙伴可以自己尝试。通过name属性来指定。

2、使用name属性

ConditionalOnClass注解还有name属性,name属性指定的是全限类名,也就是包含包名+类名。看下我的配置,

Configuration

ConditionalOnClass(name={"


转载请注明:http://www.aierlanlan.com/rzdk/5153.html