Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为Spring中的自动连接指定默认bean?_Java_Spring_Dependency Injection_Autowired - Fatal编程技术网

Java 如何为Spring中的自动连接指定默认bean?

Java 如何为Spring中的自动连接指定默认bean?,java,spring,dependency-injection,autowired,Java,Spring,Dependency Injection,Autowired,我正在为一个库和使用这个库的服务编写代码。我想要一个UsernameProvider服务,它负责提取登录用户的用户名。我使用图书馆本身的服务: class AuditService { @Autowired UsernameProvider usernameProvider; void logChange() { String username = usernameProvider.getUsername(); ... } } 我想要一个UsernamePro

我正在为一个库和使用这个库的服务编写代码。我想要一个
UsernameProvider
服务,它负责提取登录用户的用户名。我使用图书馆本身的服务:

class AuditService {
  @Autowired
  UsernameProvider usernameProvider;

  void logChange() {
    String username = usernameProvider.getUsername();
    ...
  }
}
我想要一个
UsernameProvider
接口的默认实现,该接口从JWT的主题声明中提取用户名。但是,在依赖于库的服务中,我希望使用基本身份验证,因此我将创建一个覆盖
getUsername()
BasicAuthUsernameProvider

当库中有多个相同类型的autowire候选对象(
DefaultUsernameProvider
,服务中有
BasicAuthUsernameProvider
)时,我自然会遇到一个错误,因此我必须将服务中的bean标记为
@Primary
。但是我不想让库客户端指定一个主bean,而是标记一个默认值

DefaultUsernameProvider
上添加
@Order(value=Ordered.LOWEST_priority)
无效

在库中的配置类中添加
@ConditionalOnMissingBean
也不起作用


EDIT:结果是,在
UsernameProvider
实现类上添加
@Component
会使
@ConditionalOnMissingBean
变得无用,因为Spring Boot试图自动连接每个注释为组件的类,因此抛出“找到类型的多个bean”异常。

您尚未发布
DefaultUsernameProvider
的代码,但我猜它被注释为
@组件
,因此它是自动布线的候选组件,与
基本UsernameProvider
相同。如果要控制使用哪一个,而不是将它们都标记为组件,请添加一个
@Configuration
类,并在那里创建
UsernameProvider
bean:

@Configuration
public class ProviderConfig {
    @Bean
    public UsernameProvider() {
         return new BasicAuthUsernameProvider();
    }
}

这个bean将自动连接到任何需要的地方

您可以用
@ConditionalOnMissingBean
注释实例化bean的方法。这意味着只有当没有其他
UserProvider
被声明为bean时,该方法才会用于实例化bean

在下面的示例中,您不能将类
DefaultUserProvider
注释为
组件
服务
或任何其他bean注释

@Configuration
public class UserConfiguration {

  @Bean
  @ConditionalOnMissingBean
  public UserProvider provideUser() {

    return new DefaultUserProvider();
  }
}

所以我就这么做了。它成功了。但这仅仅是因为我在库中的
DefaultConfiguration
类的
@Bean
注释方法上添加了
@ConditionalOnMissingBean
。然后我删除了它,它没有抛出异常,但它在库中自动连接了默认bean,而不是服务中的bean。你的回答帮助我找到了解决办法,但并没有直接解决我的问题。不过,谢谢你!