Autowired注解大家都常用,但其实还可以这么写

@Service
public class TestFactory {

    @Autowired
    Map<String, ITestService> testServiceMap = new ConcurrentHashMap<>();

    public ITestService getTestService(String component) {
        ITestService iTestService = testServiceMap.get(component);
        return iTestService;
    }
}

他会将所有ITestService的实现类都自动加载到Map中,这边为了线程安全用了ConcurrentHashMap,然后用了一个类似工厂模式。这样可以再结合策略模式进行一个优化。比如我们有一个接口,根据不同类型进行不同的操作。

    @Autowired
    TestFactory testFactory;

    @GetMapping("/test")
    @ResponseBody
    public R test(@RequestParam("key") String key) {
        ITestService testService = testFactory.getTestService(key);
        if (testService == null) {
            return fail(500, "类型不正确");
        }
        String name = testService.getName();
        return success(name);
    }
}

service层

public interface ITestService {

    String getName();
}
@Service("test1")
public class Test1ServiceImpl implements ITestService {

    @Override
    public String getName() {
        return "zhangSan";
    }
}
@Service("test2")
public class Test2ServiceImpl implements ITestService {
    @Override
    public String getName() {
        return "liSi";
    }
}

这样后面的扩展就只要新建不同的service实现类,实现getName方法就可以了,避免了常规的大量ifelse