Spring 默认候选 bean
Spring default bean candidate
我正在编写一个使用 spring 的库,供其他人使用。在我的图书馆中,我有 class A
,它有一个接口 B
作为字段(带有 @Autowired
)。
我有那个字段的默认实现,但用户可以自己实现自定义实现。我想要发生的事情如下:
如果用户实现了 B
,我希望将该 bean 注入到 A
,否则我希望注入我的默认实现。
类似于 @Primary
的反义词
我知道用户可以添加 @Primary
注释来实现这一点,但我不希望他添加除 @Component
之外的任何其他注释(因为不清楚对于用户为什么他必须添加 @Primary
注释)
有没有办法实现这种行为?我也试过 @Order
和 @Priority
,但没有成功——用户必须添加另一个注释。
谢谢!
我不这么认为。 Spring 的 @Autowired 相当具体。在不更改任何配置(XML 或 Spring 配置 class)的情况下使其表现不同几乎是不可能的。
您应该创建 your own auto configuration。自动配置 classes 总是最后处理,因此首先处理用户自己的配置,并且在使用 @Conditional...
注释时,用户的 bean 将优先。
您的自动配置 class 应如下所示:
@Configuration
public class MyAutoConfiguration {
@ConditionalOnMissingBean(B.class)
@Bean
public B defaultImplementation() { return A(); }
@Bean
public UsesB classThatUsesB(B b) { return UsesB(b); }
}
在这种情况下,如果您的库的用户定义了一个 B
类型的 bean,它将始终首先被使用,如果他们没有定义,则将使用 defaultImplementation
方法创建的 bean .
我正在编写一个使用 spring 的库,供其他人使用。在我的图书馆中,我有 class A
,它有一个接口 B
作为字段(带有 @Autowired
)。
我有那个字段的默认实现,但用户可以自己实现自定义实现。我想要发生的事情如下:
如果用户实现了 B
,我希望将该 bean 注入到 A
,否则我希望注入我的默认实现。
类似于 @Primary
我知道用户可以添加 @Primary
注释来实现这一点,但我不希望他添加除 @Component
之外的任何其他注释(因为不清楚对于用户为什么他必须添加 @Primary
注释)
有没有办法实现这种行为?我也试过 @Order
和 @Priority
,但没有成功——用户必须添加另一个注释。
谢谢!
我不这么认为。 Spring 的 @Autowired 相当具体。在不更改任何配置(XML 或 Spring 配置 class)的情况下使其表现不同几乎是不可能的。
您应该创建 your own auto configuration。自动配置 classes 总是最后处理,因此首先处理用户自己的配置,并且在使用 @Conditional...
注释时,用户的 bean 将优先。
您的自动配置 class 应如下所示:
@Configuration
public class MyAutoConfiguration {
@ConditionalOnMissingBean(B.class)
@Bean
public B defaultImplementation() { return A(); }
@Bean
public UsesB classThatUsesB(B b) { return UsesB(b); }
}
在这种情况下,如果您的库的用户定义了一个 B
类型的 bean,它将始终首先被使用,如果他们没有定义,则将使用 defaultImplementation
方法创建的 bean .