又一个好用的工具 spring-smart-di(上)

583 阅读1分钟

又一个好用的工具 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());
    }
}
输出结果

image.png

基于其他存储实现

从数据库查询使用哪个方式选择

第一步:自定义注解

@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();
}