Hi,大家好,我是一个爱冒泡的程序猿
有事情耽搁的好几天没更新了,每日一更计划又泡汤了(灬ꈍ ꈍ灬)
小编今天最近遇到的一个问题就是,有一个水果的Service,它的实现类中,同样方法名的有两个,一个是“榴莲”,一个是“苹果”(万一榴莲坏了,还有苹果吃٩(๑❛ᴗ❛๑)۶),如何优雅的决定它的出现。
有几个解决方法,顺序:从差到优~
方法一:
由于“榴莲”和“苹果”都在这个实现类里,方法名相同,所以只能把一方先注掉
这个方法最烂也最不友好,小编是由于忙于开发,就先这样跳过去了做其他的了,大家不要学我(´•༝•`)
优点:只是实现需求,无任何优点可言,无任何美感可言
缺点:每次都得手动改代码,想吃“榴莲”,得把“苹果”注释掉,反之
方法二:
在方法一的基础上,把水果的service实现类拆分为两个,一个是“榴莲”实现类,一个是“苹果”实现类
在Controller中 注入service,通过注解 @Autowire + @Qualifier实现,具体代码如下:
Controller
@Autowired
@Qualifier("durian")
private FruitService fruitService;
Service
/**
* Created by git on 2020/4/21.
*
* @author Emelia
*/
public interface FruitService {
String getFruit();
}
“榴莲”实现类
/**
* 榴莲
*
* @author Emelia
*/
@Service("durian")
@Slf4j
public class durianServiceImpl implements FruitService {
@Override
public String getFruit() {
String fruit = "榴莲";
return fruit;
}
}
“苹果”实现类
/**
* 苹果
*
* @author Emelia
*/
@Service("apple")
@Slf4j
public class appleServiceImpl implements FruitService {
@Override
public String getFruit() {
String fruit = "苹果";
return fruit;
}
}
优点:在controller中修改@Qualifier的值就可以变化
缺点:还是得手动修改代码内容,一个Controller调用还好,如果有多个Controller调用就都得相应的更改
方法三:
和方法二差不多,只不过在Controller注入的时候使用注解@Resource 替换了 @Autowire + @Qualifier实现,具体代码如下:
Controller
@Resource("durian")
private FruitService fruitService;
Service
/**
* Created by git on 2020/4/21.
*
* @author Emelia
*/
public interface FruitService {
String getFruit();
}
“榴莲”实现类
/**
* 榴莲
*
* @author Emelia
*/
@Service("durian")
@Slf4j
public class durianServiceImpl implements FruitService {
@Override
public String getFruit() {
String fruit = "榴莲";
return fruit;
}
}
“苹果”实现类
/**
* 苹果
*
* @author Emelia
*/
@Service("apple")
@Slf4j
public class appleServiceImpl implements FruitService {
@Override
public String getFruit() {
String fruit = "苹果";
return fruit;
}
}
优点:在controller中修改@Resource 的值就可以变化
缺点:还是得手动修改代码内容,一个Controller调用还好,如果有多个Controller调用就都得相应的更改
方法四:
通过配置文件动态配置,实现类中只需要用 @Configuration+@ConditionalOnProperty
不需要@Service ,这两个注解也可以注入Service,具体代码如下:
application.yml
fruit:
impl: apple
Controller
@Autowired
private FruitService fruitService;
Service
/**
* Created by git on 2020/4/21.
*
* @author Emelia
*/
public interface FruitService {
String getFruit();
}
“榴莲”实现类
/**
* 榴莲
*
* @author Emelia
*/
@Slf4j
@Configuration
@ConditionalOnProperty(prefix = "fruit", name = "impl", havingValue = "durian")
public class durianServiceImpl implements FruitService {
@Override
public String getFruit() {
String fruit = "榴莲";
return fruit;
}
}
“苹果”实现类
/**
* 苹果
*
* @author Emelia
*/
@Slf4j
@Configuration
@ConditionalOnProperty(prefix = "fruit", name = "impl", havingValue = "apple")
public class appleServiceImpl implements FruitService {
@Override
public String getFruit() {
String fruit = "苹果";
return fruit;
}
}
优点:只需要修改配置就可以决定使用哪个实现类,如此甚好,也不需要额外的配置文件,优雅的很
缺点:好用,暂时没发现缺点
参考文章:
https://blog.csdn.net/mengxiangxingdong/article/details/87919315
可能是我第一次使用这个注解,真香啊(•̀∀•́)棒
如果有更好的方式,欢迎大家前来踢馆~掰掰~ 奔向阿里的第7天