spring高级注入功能,一次性注入一个接口的所有实现类

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

你可能感兴趣的:(spring高级注入功能,一次性注入一个接口的所有实现类)