231414-1729178054974e

枚举类中获取spring容器的bean

我们有一个枚举,想要注入spring容器中的bean。通过直接标记这个类为Component,注入bean的方式往往是行不通的,这是因为枚举的常量在类加载时就已经初始化了。此时可以通过定义一个静态内部类来实现bean的注入。

定义一个接口及其实现类

1
2
3
public interface Car {
void run();
}
1
2
3
4
5
6
7
@Component("toyotaCar")
public class ToyotaCar implements Car {
@Override
public void run() {
System.out.println("Toyota car is running");
}
}
1
2
3
4
5
6
7
@Component("ferrariCar")
public class FerrariCar implements Car {
@Override
public void run() {
System.out.println("Ferrari car is running");
}
}
1
2
3
4
5
6
7
@Component("lamborghiniCar")
public class LamborghiniCar implements Car {
@Override
public void run() {
System.out.println("LamborghiniCar is running");
}
}

枚举类

定义一个内部类,在内部类中完成需要的依赖注入,通过@PostConstruct注解,在依赖注入之后,将枚举的常量进行初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public enum CarEnums {
FERRARI("ferrari", null),
TOYATA("toyata", null),
LAMBORGHINI("lamborghini", null),;

// 汽车
private Car car;

// 品牌
private final String brand;

CarEnums(String brand, Car car) {
this.car = car;
this.brand = brand;
}

@Component
public static class CarEnumInjector {
@Resource(name = "toyotaCar")
Car toyotaCar;

@Resource(name = "ferrariCar")
Car ferrariCar;

@Resource(name = "lamborghiniCar")
Car lamborghiniCar;

@PostConstruct
public void init() {
FERRARI.car = ferrariCar;
TOYATA.car = toyotaCar;
LAMBORGHINI.car = lamborghiniCar;
}
}

public Car getCar() {
return car;
}

public String getBrand() {
return brand;
}
}

测试

导入springboot单元测试的相关的包,编写一个测试类

1
2
3
4
5
6
7
8
9
@SpringBootTest
@RunWith(SpringRunner.class)
public class CarTest {

@Test
public void test() {
CarEnums.FERRARI.getCar().run();
}
}

执行测试

测试结果如下:

image-20241116123042684