我创建了一个框架,该框架具有多个接口的默认实现。
问题:如何隐藏该接口的任何默认实现,以便框架的用户被迫使用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
接口对框架用户可见。