一尘不染

动态选择依赖关系

spring-boot

如果没有其他条件,我如何选择依赖关系。

假设我有一个接口:

public interface A{

String doSomething(String req);
}

有两种服务工具A

@Component
public class FirstImpl implements A{

   @override
   String doSomething(String req){
   return "something";
  }
}

和:

@Component
public class SecondImpl implements A{

 @override
    String doSomething(String req){
    return "something";
  }
}

现在,我创建一个AdapterService类:

@Component
public class AdapterService{
    @Autowired
    private FirstImpl first;
    @Autowired
    private SecondImpl second;

    public getService(String name){
        if("name".equals("First")){
            return first;
        }else if("name".equals("Second")){
            return second;
        }
    }
}

现在调用实现:

@Service
public class BusinessService{
    @Autowired
    private AdapterService adapterService;

    void doSomething(String name,String req){
        return adapterService.getService(name).doSomething();
    }
}

现在,如果我需要创建另一个实现A的类,则需要在ServiceAdapter类中添加条件。像"Third".equals(name)返回另一个注入服务。对于每个新服务,需要添加其他条件,然后注入相应的服务。我如何避免这种Adapter类。Spring从名称中动态选择依赖关系。


阅读 285

收藏
2020-05-30

共1个答案

一尘不染

如果您有权访问applicationContext对象,则可以致电

applicationContext.getBean(名称)

并完全避免使用ServiceAdapter类。唯一的事情是您需要将那些bean放入容器中。

试试这个:

@Component
public class AdapterService{
    @Autowired
    private ApplicationContext applicationContext;

    public A getService(String name){
        return applicationContext.getBean(name,A.class);
    }
}
2020-05-30