Spring使用@Autowired 简单实现策略模式

  • 最近遇到一个需求,需要根据接口的收到的类型选择不同的实现类进行返回,本篇文章主要利用自动注入到Map简单实现策略模式。
  • 接口如下,没什么好说的
public interface ProjectService {
    public List<ProjectVO> getProjectsByUser(Integer id);
}

  • 接下来主要是上面接口的两个实现类,主要要注意@Service注解一定要指定名字,我这里以Project作为后缀
@Service("application-project")
public class ApplicationProjectServiceImpl implements ProjectService {

    @Override
    public List<ProjectVO> getProjectsByUser(Integer id) {
    		DOSOMETHING1
    }
}
@Service("pipeline-project")
public class pipelineProjectServiceImpl implements ProjectService {

    @Override
    public List<ProjectVO> getProjectsByUser(Integer id) {
    		DOSOMETHING2
    }
}
  • Controller核心方法如下,我们把ApplicaitonService autowire到Map中,Map的key就是实现类的Service名,Map的value就是具体的实现方法,此时我们的接口只要输入不同的type,就可以通过type找到对应的Service名字,再通过Map取出对应的实现类进行解析。
    @Autowired
    Map<String, ApplicationService> projectServiceMap;

    @GetMapping("/projects")
    public List<ProjectVO> getProjects(@RequestParam("type") String type,
                                       @RequestParam(value = "id", required = false) Long id) {

        //拼接出Bean的名字,通过自动注入的Map找到对应的方法
        type = type + "-project";

       return projectServiceMap.get(type).getProjectsByUser(id);
    }
  • 这样做的好处是如果将来需要添加类型,不需要改动controller,只需要添加interface的实现类即可

你可能感兴趣的:(java,spring,spring,boot)