java - 如何隐藏服务类并防止@Autowire?

标签 java spring

我创建了一个框架,该框架具有多个接口(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/

相关文章:

Java Jar 文件的 java.lang.NoClassDefFoundError

java - Hibernate 进行正确的数据库查询但返回空实体

java - 父类和子类之间的多态性

java - 变量英里可能尚未初始化

java - 将客户端信息发送到 ejbs

java - Couchbase 2.0 Java SDK 1.1 - 同步添加和 View

Java:如何立即将文本字段中的更改发送到文件?

javascript - 将变量从 thymeleaf 传递给 javascript 函数?

swift - 谁在以正确的方式实现 ISO8601? swift 还是 Spring ?

javascript - XSRF - 如何设置跨域 cookie