在 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 类。