1.一个接口多个实现类怎么确定注入的是哪个?
方法1@Autowired+@Qualifier(name=“spring管理的实现类名称”)
spring管理的实现类名称 = 类全名,首字母小写
例如 类名叫做Test,那么name=“test”
// @Autowired
// @Qualifier("serviceImpl1")
// ISerivce service1;
方法2 @Resource(name = “spring管理的实现类名称”)
// @Resource(name = "serviceImpl2")
// ISerivce service2;
2.交给配置文件管理的方式
方法1
@Configuration //为配置类
public class RedisConfig {
@Bean //向spring注册bean 类似于@service的注解
@Qualifier("iRedis")
@ConditionalOnProperty(name = "redisFlag", havingValue = "true") //由配置文件操控
public IRedis getRedis1() {
return new RedisImp1();
}
@Bean
@Qualifier("iRedis")
@ConditionalOnProperty(name = "redisFlag", havingValue = "false")
public IRedis getRedis2() {
return new RedisImp2();
}
}
方法二 惊奇的发现,使用 @ConditionalOnProperty+@Configuration注解的时候,竟然能够也注入serivce
@Configuration
@ConditionalOnProperty(name = "redisFlag", havingValue = "true")
public class RedisImp1 implements IRedis {
}
看源码才发现
@Configuration 内部也是用了 @Component 这个注解,怪不得呢
参考博客
spring 当接口存在多个实现类的时候注入到同一个类时选择想要的实现来注入
https://blog.youkuaiyun.com/qq_33212500/article/details/82993087
配置Spring Boot通过@ConditionalOnProperty来控制Configuration是否生效
https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/78420057