我创建了一个框架,该框架具有多个接口(interface)的默认实现。
问题:如何隐藏接口(interface)的任何默认实现,以便框架的用户被迫使用 DefaultService
接口(interface),例如使用 @Autowired DefaultService
进行注入(inject)?
interface DefaultService {
}
@Component
@Async
@ConditionalOnNotWebApplication
public class MyService1 implements DefaultService {
}
@Component
@Async
@ConditionalOnWebApplication
public class MyService2 implements DefaultService {
}
我的服务条件确保每个环境中始终只连接一项服务。
最佳答案
作为@M。 Deinum 在上面评论说将实现服务包私有(private)化是正确的解决方案。我不知道 spring 仍然可以看到这些类,因为通常 spring 需要公共(public)访问注释。
一个可能的解决方案似乎是为实现创建一个额外的 @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
接口(interface)对框架用户可见。
关于java - 如何隐藏服务类并防止@Autowire?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45757374/