我创建了一个框架,该框架具有多个接口的默认实现。

问题:如何隐藏该接口的任何默认实现,以便框架的用户被迫使用DefaultService接口进行例如@Autowired DefaultService的注入?

interface DefaultService {
}

@Component
@Async
@ConditionalOnNotWebApplication
public class MyService1 implements DefaultService {

}

@Component
@Async
@ConditionalOnWebApplication
public class MyService2 implements DefaultService {

}

我的服务条件确保每种环境中始终只有一项服务。

最佳答案

作为@M。 Deinum在上面评论说,将实施服务包私有化是正确的解决方案。我不知道spring仍然会看到那些类,因为通常spring需要注释的公共访问权限。

一种可能的解决方案似乎是为实现创建一个额外的@Configuration类:

@Configuration
public class DefaultServiceConfiguration {
    @Bean
    @ConditionalOnNotWebApplication
    public DefaultService getDefaultService1() {
        return new MyService1();
    }

    @Bean
    @ConditionalOnWebApplication
    public DefaultService getDefaultService2() {
        return new MyService2();
    }
}

public interface DefaultService {
}

@Async
protected class MyService1 {
}

@Async
protected class MyService2 {
}

这样,只有DefaultService接口对框架用户可见。

07-25 22:52