
枚举类中获取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(); } }
|
执行测试
测试结果如下:
