@ConditionalOnClass注解详解
作用
- 在类路径下存在某个类时才会实例化加ConditionalOnClass注解类的bean。
例子
-
@Configuration @ConditionalOnClass({PlatformTransactionManager.class}) public class TransactionAutoConfiguration { public TransactionAutoConfiguration() { } }
-
当spring启动时会在类路径下扫描是否存在PlatformTransactionManager类,如存在则实例化TransactionAutoConfiguration。
源码
-
package org.springframework.boot.autoconfigure.condition; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.context.annotation.Conditional; @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Conditional({OnClassCondition.class}) public @interface ConditionalOnClass { Class<?>[] value() default {}; String[] name() default {}; }
-
从源码中看该注解能加载到类上和方法上。
value类型
-
package com.example.child.config; import com.example.parent.model.Test; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Configuration; @Configuration @ConditionalOnClass(value = Test.class) public class TestConfig { public TestConfig() { System.out.println("config实例化"); } }
-
当在类路径下存在com.example.parent.model.Test类时则会实例化TestConfig类。
数组value
-
package com.example.child.config; import com.example.parent.model.Test; import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Configuration; @Configuration @ConditionalOnClass(value = {Test.class, RabbitAutoConfiguration.class}) public class TestConfig { public TestConfig() { System.out.println("config实例化"); } }
-
以上表示com.example.parent.model.Test类和 org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration都存在类路径下时才是实例化TestConfig类。为数组value时,表并“且”的关系
name类型
-
string类型和Value类型差不多,唯一不同的就是value为类对象,string为全限定类名。
-
package com.example.child.config; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Configuration; @Configuration @ConditionalOnClass(name= {"com.example.parent.model.Test"}) public class TestConfig { public TestConfig() { System.out.println("config实例化"); } }
-
其中@ConditionalOnClass(name= {“com.example.parent.model.Test”})的效果与@ConditionalOnClass(value = {Test.class})一致。