@Conditional注解的判断条件,决定了该类是否可以成为Bean。即使该类被@Component注解修饰,@Conditional条件是false,那么该类也不会注入到IOC容器中
。且该注解在springboot项目中被大量使用。
1、在spring扫描文件注入IOC容器的过程中被使用;
现在我们以案例的形式为大家演示如何使用@Conditional注解。
你需要有一套可运行的spring环境,在此我默认大家已经成功搭建了环境。
【环境搭建】搭建Spring环境以及目录结构
package org.example.condition;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* author: cms
* date: 2022/11/6 8:24 AM
* description: 自定义一个spring的Condition功能。--springboot里面大量使用Condition功能。
*/
public class UserCondition implements Condition {
/**
* 功能描述:如果程序中存在org.example.nonbeanservice.BookService则返回true,否则false
*
* @param context spring应用上下文
* @param metadata 注解元信息
* @return bool 条件是否通过
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
try {
context.getClassLoader().loadClass("org.example.nonbeanservice.BookService");
return true;
} catch (Exception e) {
return false;
}
}
}
给UserService添加条件注解:@Conditional(UserCondition.class)
即使UserService被@Component注解修饰,也需要看@Conditional是否满足条件。如果不满足@Conditional条件,那么UserService也不会成为一个Bean。
尝试改变@Conditional的bool条件,然后比较下面结果输出:
package org.example;
import org.example.beanservice.UserService;
import org.example.config.AppConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.util.Arrays;
/**
* author: cms
* date: ${DATE} ${TIME}
* description: xxx
*/
public class Main {
public static void main(String[] args) {
System.out.println("-------- Main start ---------");
// 1.获取容器对象
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// 获取容器中所有bean的名字
String[] beanDefinitionNames = context.getBeanDefinitionNames();
System.out.println(Arrays.toString(beanDefinitionNames));
// 获取容器中所有bean的数量
int beanDefinitionCount = context.getBeanDefinitionCount();
System.out.println(beanDefinitionCount);
// 获取容器中指定名称的bean实例
UserService userService = (UserService) context.getBean("userService");
userService.printName();
}
}