Yuzhii的Springboot3笔记【3】

条件注解

衔接上文,在org.yuzhii.boot模块中,我新建了一个org.yuzhii.boot.config.AppConfig2类,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package org.yuzhii.boot.config;

import com.alibaba.druid.FastsqlException;
// 这里导入的是druid的异常类
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.yuzhii.boot.bean.Cat;

@SpringBootConfiguration
public class AppConfig2 {

@ConditionalOnClass(FastsqlException.class)
@Bean
public Cat cat01(){
return new Cat();
}
}

然后,在org.yuzhii.boot模块中,我新建了一个org.yuzhii.boot.bean.Dog类,然后在程序入口进行测试:

1
2
3
4
5
6
7
for (String s : ioc.getBeanNamesForType(Cat.class)) {
System.out.println("Cat:" + s);
}

for (String s : ioc.getBeanNamesForType(Dog.class)) {
System.out.println("Dog:" + s);
}

输入 ioc.getBeanNamesForType(Dog.class).for 时,IDEA会自动提示 forEach 方法,按下 Tab 键,可以自动补全。

因为此时没有 Dog 类的实例,所以只会输出 Cat 类的实例。

复制之前 Cat 类的代码,然后将类名改为 Dog,并且加上 @Component,再次运行程序,此时会输出 Cat 和 Dog 类的实例。

回到 AppConfig2 类,添加

1
2
3
4
5
6
7
8
9
10
11
@ConditionalOnBean(value = Dog.class) // 这个注解的意思是:当容器中有Dog这个bean的时候,才会创建这个bean
@Bean
public User zhangsan(){
return new User();
}

@ConditionalOnMissingBean(value = Dog.class) // 这个注解的意思是:当容器中没有Dog这个bean的时候,才会创建这个bean
@Bean
public User lisi(){
return new User();
}

回到程序入口,再次运行程序,此时会输出 Cat 和 Dog 类的实例,以及 zhangsan 和 lisi 的实例。