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。你的回答帮助我找到了解决办法,但并没有直接解决我的问题。不过,谢谢你!