spring注入功能:
现在我们有一个接口,两个实现类,可能很多同学都是按照下面的方式去实现的
public interface CalculateService {
public double calculate(double fee);
public String userType();
}
第一个实现类
@Service("A")
public class ACalculate implements CalculateService {
@Override
public double calculate(double fee) {
return 0;
}
@Override
public String userType() {
return "A";
}
}
第二个实现类
@Service("B")
public class BCalculate implements CalculateService {
@Override
public double calculate(double fee) {
return 0;
}
@Override
public String userType() {
return "B";
}
}
实现类的使用
这里可以发现,每个实现类我们都要去注入,且需要根据类型去判断使用哪个实现类,
很麻烦,而且出现新的实现类,需要修改原有代码去,所以我们就想,有没有什么办法可以一次性注入进来,且不需要我们去自己用if-else 去判断的。答案是有的,下面我们将用新的方式去完成这个功能
@Component
public class Test {
@Autowired
private ACalculate aCalculate;
@Autowired
private BCalculate bCalculate;
public void calculate(String type,double price){
if("A".equals(type)){
aCalculate.calculate(price);
}
if("B".equals(type)){
aCalculate.calculate(price);
}
}
}
spring高级注入
@Component
public class Test {
@Autowired
Map calculateTypeMap = new HashMap<>();
public void calculate(String type,double price){
CalculateService service = calculateTypeMap.get(type);
service.calculate(price);
}
}
通过以上代码,spring会把该接口的所有实现类注入到 calculateTypeMap 中,不知道大家注意到一个细节没有,
@Service(“B”) 我们没个实现类默认给了一个别名,如果不加这个别名的话,mao的key 默认是类名的小写。也许有人会觉得这个类型千奇百怪,写在这里很奇怪,没关系,我们还有其他方式来实现。
spring 还可以帮我们注入到List中,构造方法中。
@Component
public class Test {
Map calculateTypeMap = new HashMap<>();
@Autowired
public Test(List serviceList) {
for (CalculateService service : serviceList) {
calculateTypeMap.put(service.userType(),service);
}
}
public void calculate(String type,double price){
CalculateService service = calculateTypeMap.get(type);
service.calculate(price);
}
}
这块代码我们是通过构造函数注入到List中,后续我们自己放到map来,可以根据自己的需求来设置key,相信这样代码看起来会整洁很多。
https://blog.csdn.net/weixin_34292924/article/details/92015292?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-6.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-6.not_use_machine_learn_pai