Condition介绍
- Condition是一个函数式接口,内部只包含一个matches()方法。
- 通常情况下,我们会写一个类实现这个接口,重写里面的matches()方法,通过这个方法的返回值来决定要不要把某个Bean注册到Spring IOC容器中。
- 举例:
- 上面这个就是通过读取文件中
spring.security.oauth2.enable
的值来判断是返回true还是false。 - 然后我们可以在定义的Bean上加入
@Conditional
注解,指定该Bean注册的条件是什么。 - 举例:
@Conditional({MyCondition.class})
@Bean(value="user1")
public User getUser1(){
System.out.println("创建user1实例");
return new User("李四",26);
}
关于@Conditional
注解
- 通过源码我们可以知道该注解上有TYPE,METHOD。也就是说它可以作用在类上和方法上。
- 当注解作用在类上,首先可以知道它是一个配置类。其次它里面的Bean都需要经历过条件返回True才能注册到容器中,否则会跳过此Bean的注册。
关于ConditionContext参数
- ConditionContext是一个接口。
- 我们可以通过ConditionContext对象获取如下一些东西。
ConditionContext.getBeanFactory()
可以获取到IOC使用的BeanFactory。ConditionContext.getClassLoader()
可以获取到它的类加载器。ConditionContext.getEnvironment()
可以获取到当前的环境信息。ConditionContext.getRegistry()
可以获取到Bean定义的注册类。ConditionContext.getResourceLoader()
可以获取ResourceLoader所加载的资源。
关于AnnotatedTypeMetadata参数
- AnnotatedTypeMetadata也是一个接口。
- 它的内部包含如下方法:
boolean isAnnotated(String annotationName);
该方法用于判断是否是一个注解。- 其余方法则是根据传入的类型获取注解的相关属性。