@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 {};
}

从源码中看该注解能加载到类上和方法上。

疑问编译问题看这篇文章:@ConditionalOnClass的编译问题

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})一致。

  • 19
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值