如何@Autowired服务的具体实现?

时间:2018-07-19 10:10:25

标签: java spring spring-boot

我有以下情况:

public interface ServiceAura extends Serializable { }

@Service
public class ServiceA implements ServiceAura {
    ....
}

@Service
public class ServiceB implements ServiceAura {
    ....
}

现在从控制器中,我需要分别调用它们:

@Path("")
@Controller
public class ServiciosAuraPortalRESTfulService {

    @Autowired
    private ServiceAura srvA;

    @Autowired
    private ServiceAura srvB;

}

我已经阅读了有关@Qualified的信息,这是唯一的方法吗?我该如何存档?

2 个答案:

答案 0 :(得分:3)

您是对的。您可以使用@Qualifier("ServiceA")指定要自动装配的实现。

@Path("")
@Controller
public class ServiciosAuraPortalRESTfulService {

    @Autowired
    @Qualifier("ServiceA")
    private ServiceAura srvA;

    @Autowired
    @Qualifier("ServiceB")
    private ServiceAura srvB;

}

在服务本身上,您可以使用注释@Primary指定所需的默认实现。

或者,您可以使用应用程序上下文来检索特定的bean。您需要自动连接ApplicationContext类,然后使用ServiceAura srvA = context.getBean(ServiceA.class);

进行检索。

答案 1 :(得分:2)

有两种方法可以做到这一点。 第一种方法是使用@Qualifier注解。

@Path("")
@Controller
public class ServiciosAuraPortalRESTfulService {

  @Autowired
  @Qualifier("serviceA")
  private ServiceAura srvA;

  @Autowired
  @Qualifier("serviceB") 
  private ServiceAura srvB;
}

您的服务应这样定义:

 @Service
 @Qualifier("serviceA") 
 public class ServiceA implements ServiceAura {
   ....
 }

 @Service
 @Qualifier("serviceB")
 public class ServiceB implements ServiceAura {
   ....
 }

另一种方法是创建扩展接口ServiceAura

的接口
interface ServiceAInterface extends ServiceAura {
}

class ServiceA implements ServiceAInterface {}

 .... // the same for service B

然后在代码中:

public class ServiciosAuraPortalRESTfulService {

  @Autowired
  ServiceAInterface serviceA;
}