- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在编写库和使用该库的服务。我想要一个 UsernameProvider
服务,它负责提取登录用户的用户名。我使用图书馆本身的服务:
class AuditService {
@Autowired
UsernameProvider usernameProvider;
void logChange() {
String username = usernameProvider.getUsername();
...
}
}
我想要一个 UsernameProvider
接口(interface)的默认实现,它从 JWT 的主题声明中提取用户名。但是,在依赖库的服务中,我想使用基本身份验证,因此我将创建一个覆盖 getUsername()
的 BasicAuthUsernameProvider
。
当有多个相同类型的 Autowiring 候选者(库中的 DefaultUsernameProvider
和服务中的 BasicAuthUsernameProvider
)时,我自然会出错,所以我会将服务中的 bean 标记为 @Primary
。但我不想让库客户端指定主 bean,而是标记为默认值。
在 DefaultUsernameProvider
上添加 @Order(value = Ordered.LOWEST_PRECEDENCE)
无效。
在库的配置类中添加 @ConditionalOnMissingBean
也不起作用。
编辑: 事实证明,在 UsernameProvider
实现类上添加 @Component
会导致 @ConditionalOnMissingBean
无用,因为Spring Boot 尝试 Autowiring 每个注释为组件的类,因此抛出“Multiple beans of type found” 异常。
最佳答案
您可以使用 @ConditionalOnMissingBean
注释实例化 bean 的方法。这意味着只有当没有其他 UserProvider
被声明为 bean 时,该方法才会用于实例化您的 bean。
在下面的示例中,您不得将类 DefaultUserProvider
注释为 Component
、Service
或任何其他 bean 注释。
@Configuration
public class UserConfiguration {
@Bean
@ConditionalOnMissingBean
public UserProvider provideUser() {
return new DefaultUserProvider();
}
}
关于java - 如何在 Spring 中为 Autowiring 指定默认 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53615708/
我是一名优秀的程序员,十分优秀!