又一个好用的工具 spring-smart-di
spring-smart-di 是做什么的
基于配置动态选择依赖的框架。假设接口有两个实现,可以基于配置动态选择注入哪一个实现。
示例
配置文件
ia:
impl: b
接口
@EnvironmentProxySPI("${ia.impl}")
public interface IA {
String printChar();
}
实现类
@Component
@BeanAliasName("b")
public class B implements IA {
@Override
public String printChar() {
return "B";
}
}
@Component
@BeanAliasName("c")
public class C implements IA {
@Override
public String printChar() {
return "C";
}
}
注入
@RestController
@RequestMapping("/")
public class TestController {
@AutowiredProxySPI
public IA iaImpl;
@Value("${ia.impl}")
private String iaChar;
@GetMapping("/test")
public void test(){
System.out.println("配置文件存储:"+iaChar);
System.out.println(iaImpl.printChar());
}
}
输出结果
基于其他存储实现
从数据库查询使用哪个方式选择
第一步:自定义注解
@Inherited
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@ProxySPI(DBProxyFactory.class)
public @interface DBProxySPI {
}
第二步:编写该注解获取bean的factory
@Component
public class DBProxyFactory implements AnnotationProxyFactory<DBProxySPI> {
@Autowired
private ServiceNameMapper serviceNameMapper;
@Override
public Object getProxy(Class<?> targetClass, DBProxySPI spi) {
ServiceNameDo serviceNameDo = serviceNameMapper.selectById(1L);
String serviceName = serviceNameDo.getServiceName();
Object beanByAllName = SpringBeanContext.getBeanByAllName(serviceName);
return beanByAllName;
}
}
第三步:接口上加自定义注解
@DBProxySPI
public interface IA {
String printChar();
}