当前位置: 首页 > 知识库问答 >
问题:

我们可以在Spring中自动装配一个没有任何实现的接口吗?

姚航
2023-03-14

我们必须与开发合作伙伴共享我们的代码库,但我们不想透露某些服务的实现。

假设我们有一个接口FooService及其实现。

public interface FooService
{
    void doSomething();
}

@Service
public class FooServiceImpl implements FooService
{
    @Override
    public String doSomething();
    {
        ...
    }
}

许多其他类自动将此服务连接进来并调用doThings()。例如:

@Service
public class BarServiceImpl implements BarService
{
    @Autowired
    private FooService  fooService;

    @Override
    public String validate();
    {
        fooService.doSomething();
        ...
    }
}

如果我只是删除FooServiceImpl,当然会在启动时抛出NoSuchBeanException。如果我在FooService自动安装的任何地方都使用@Autow的(必需=false),则每当调用doThings()时,都会在运行时抛出NullPointerException

除了手动删除FooServiceImpl中的每个方法体之外,还有其他解决方法吗?

非常感谢您的帮助。

共有3个答案

许马鲁
2023-03-14

首先,正如@AdrianShum和@chrylis评论的那样,您需要FooService的实现才能让BarServiceImpl.validate()工作。所以不清楚“不想透露某些服务的实现”是什么意思。

  • NoSuchBeanException-当您在BarServiceImpl中自动连接FooService时,将进行扫描以查找FooService类型的bean。由于您没有任何FooService的实现,因此会发生此错误

因此,如果Spring中没有任何实现,就无法自动连接接口。

陶鹏
2023-03-14

我们可以在Spring中自动装配一个没有任何实现的接口吗?

您正在尝试为Java中不可能的接口创建实例。

严峰
2023-03-14

我同意克里斯的观点;您的用例听起来像是应该提供一个默认实现。我还将配置您的代码,以允许库的用户提供自己的实现。Spring让您可以轻松地使用其条件 注释。具体来说,我认为您应该使用ConditionalOnMissingBean。

默认实现

@Component
public class DefaultFooServiceImpl implements FooService {
  @Override
  public void doSomething() {
    LOG.info("Using default implementation of doSomething(); nothing will happen");
  }
}

示例配置

@Configuration
public class ServiceConfig {
  @ConditionalOnMissingBean(FooService.class)
  @Bean
  DefaultFooServiceImpl defaultFooServiceImpl() {
    return new DefaultFooServiceImpl();
  }
}

当您的合作伙伴使用您的库时,他们将获得默认实现,以及提供更好实现的选项。使用库时,可以创建一个propertaryFooserviceImpl bean,它将被注入。

 类似资料:
  • 在Google Guice中:我们可以实现一个带有注释的单例类,它不实现接口,并且尝试使用注释将它注入到任何其他类中吗?此外,我还没有在的扩展类中为该类配置任何绑定。有必要从接口实现类吗?我还想了解绑定的情况,如果我从接口实现单例类,那么它需要绑定,因为可能有多个类实现接口。 但是如果我有一个类没有实现接口,那么是否需要在实现AbstractModule的类中绑定?

  • 问题内容: 我想知道我们可以在一个接口内定义一个接口。喜欢 这是面试中提出的问题。任何实时使用。 问题答案: 是的,我们可以做到。Java中的嵌套接口的定义如下: 嵌套接口是其声明出现在另一个类或接口的主体内的任何接口。顶级接口是不是嵌套接口的接口。 请参阅此为多。 进一步 … 一个原因可能是外部接口具有一种将回调实现作为参数的方法。在这种情况下,嵌套接口是回调方法必须实现的协定。我没有理由在顶层

  • 有没有可能让一个Spring Bean实现两个接口,并能够使用任何一个接口自动连接Bean? 一个实现两个服务的类 我正在获取: 原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到依赖项[ServiceB]的[ServiceB]类型的合格bean:需要至少有一个bean可以作为此依赖项的自动候选项。依赖项批注

  • 问题内容: 在关系数据库中,我们可以有一个与其他表没有任何关系的表吗? 问题答案: 是的。关系的表示方式是使用外键。如果您生成的表没有外键,并且其他表中也没有外键指向该表,那么它就没有关系。 以后仍然可以建立关系,因此不必担心用脚射击。

  • 问题内容: 我正在为给定的类使用基于注释的接线(即),并且我希望将给定类型的所有bean作为列表进行接线: 应用程序上下文: 要自动连线到的类: 所有依赖项都实现一个称为 是否有办法使所有类型的依赖项在集合中连接在一起并在必要时注入,还是应该用XML或其他方式定义? 问题答案: 是, 工作,并且您会获得实现该接口的所有bean的列表。(多个变体- 或,字段,setter或构造函数注入-所有工作)

  • 我有一个小项目,用一个类包装另一个类的对象。修饰类实现了一个接口,但装饰类没有实现它。我很好奇它仍然是装饰模式还是其他模式,在我的项目中“装饰”类应该被称为包装器而不是装饰器。 我已经检查了iluwatar github存储库(https://github.com/iluwatar/java-design-patterns/tree/master/decorator/src/main/java/c