Spring Boot 教程

@ConditionalOnMissingClass 注解

在 Spring Boot 中,@ConditionalOnMissingClass 注解用来判断指定的类是否在 classpath 中存在:

  • 如果你指定的类在 classpath 中存在,则匹配失败;

  • 如果你指定的类在 classpath 中不存在,则匹配成功;

示例

使用 @ConditionalOnMissingClass 注解判断在 classpath 下面是否有 InitOrder 和 InitUser 类,然后根据匹配结果分别去初始化 UserService 和 OrderService 实例。

(1)先创建两个服务类,分别为 UserService 和 OrderService,代码如下:

a、OrderService.java

package com.huangx.springboot.autoconfig.service;

public class OrderService {
    // 什么也不做
}

b、UserService.java

package com.huangx.springboot.autoconfig.service;

public class UserService {
    // 什么也不做
}

(2)创建 InitUser 类用于作为 @ConditionalOnMissingClass 注解的条件。这里仅仅创建了 InitUser 类,没有创建 InitOrder 类,是为了验证 classpath 没有 InitOrder 类的情况下匹配成功。如下:

package com.huangx.springboot.autoconfig.init;

public class InitUser {
}

(3)分别创建 User 和 Order 的 @Configuration 配置类,代码如下:

a、UserConfig.java

package com.huangx.springboot.autoconfig.config;

import com.huangx.springboot.autoconfig.service.UserService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
// 判断 InitUser 是否在 classpath 中存在
// 如果在 classpath 中存在 InitUser,则匹配失败
// 如果在 classpath 中不存在 InitUser,则匹配成功,实例化 UserService
@ConditionalOnMissingClass("com.huangx.springboot.autoconfig.init.InitUser")
public class UserConfig {
    @Bean
    public UserService userService() {
        System.out.println("UserService -> userService()");
        return new UserService();
    }
}

b、OrderConfig.java

package com.huangx.springboot.autoconfig.config;

import com.huangx.springboot.autoconfig.service.OrderService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
// 判断 InitOrder 是否在 classpath 中存在
// 如果 classpath 中不存在 InitOrder,则匹配成功,实例化 OrderService
// 如果 classpath 中存在 InitOrder,则匹配失败,不进行实例化
@ConditionalOnMissingClass("com.huangx.springboot.autoconfig.init.InitOrder")
public class OrderConfig {
    @Bean
    public OrderService orderService() {
        System.out.println("OrderConfig -> orderService()");
        return new OrderService();
    }
}

(4)客户端,验证 UserService 和 OrderService 是否被创建,代码如下:

package com.huangx.springboot.autoconfig;

import com.huangx.springboot.autoconfig.service.OrderService;
import com.huangx.springboot.autoconfig.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class Demo6Application {

    @Autowired
    private ApplicationContext applicationContext;

    public static void main(String[] args) {
        SpringApplication.run(Demo6Application.class, args);
    }

    @GetMapping("/")
    public String index() {
        UserService userService = null;
        try {
            userService = applicationContext.getBean(UserService.class);
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }

        OrderService orderService = null;
        try {
            orderService = applicationContext.getBean(OrderService.class);
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }

        return "userService=" + userService + "<br/>" +
                "orderService=" + orderService;
    }

}

运行上面程序,在浏览器访问 http://localhost:8080 地址,输出如下图:

从上图得知,userService 并没有被创建,因为我们的 classpath 下面存在 InitUser 类。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号