Spring 7.0引入了一种新的更方便更灵活的注册Bean的方式-BeanRegistrar。它是以编程方式根据条件动态做Bean的注入,并且可以一次注入多个Bean。
举个例子:
现在有一个EnvService,有2个实现类ProductionService和NonProductionService:
java
public interface EnvService{
String getEnv();
}
public class ProductionService implements EnvService{
@Override
public String getEnv() {
return "Production";
}
}
public class NonProductionService implements EnvService {
@Override
public String getEnv() {
return "NonProduction";
}
}
现在想实现:如果是生产环境就启用ProductionService,否则就启用NonProductionService,用BeanRegistrar如何来实现呢?
使用起来主要有2步:
BeanRegistrar接口实现
java
public class EnvBeanRegistrar implements BeanRegistrar {
@Override
public void register(BeanRegistry registry, Environment env) {
if(env.matchesProfiles("prod")){
registry.registerBean("envService", ProductionService.class);
} else {
registry.registerBean("envService", NonProductionService.class);
}
}
}
@Import导入实现类
java
@Configuration(proxyBeanMethods = false)
@Import(EnvBeanRegistrar.class)
public class BeanRegistrarConfig {
}
- 测试一下
java
@RestController
@RequestMapping("api/bean-registrar")
public class BeanRegistrarController {
@Autowired
private EnvBeanRegistrar.EnvService envService;
@GetMapping(path = "/demo")
public String demo() throws Exception{
return envService.getEnv();
}
}
可以切换spring.profiles.active测试不同的输出情况。
更多SpringBoot4.0的新特性,请参考:SpringBoot4.0新特性