Java 配置允许我们在配置文件中管理 bean 的创建。注解@Component,@Service与组件扫描一起使用的类的作用相同。但是,我担心同时使用这两种机制。
是否应该在同一个项目中避免 Java 配置和带注释的组件扫描?我问是因为在以下情况下结果不清楚:
@Configuration
public class MyConfig {
@Bean
public Foo foo() {
return new Foo(500);
}
}
...
@Component
public class Foo {
private int value;
public Foo() {
}
public Foo(int value) {
this.value = value;
}
}
...
public class Consumer {
@Autowired
Foo foo;
...
}
Run Code Online (Sandbox Code Playgroud)
那么,在上述情况下,Consumer 会得到一个值为 500 的 Foo 实例,还是值为 0 的 Foo 实例呢?我在本地进行了测试,看来 Java 配置的 Foo (值为 500)是一致创建的。然而,我担心我的测试不够彻底,无法得出结论。
真正的答案是什么?在相同类型的 @Component bean 上同时使用 Java 配置和组件扫描似乎是一件坏事。
在同一个项目中进行 Java 配置和带注释的组件扫描是完全有效的,因为它们服务于不同的目的。
@Component(@Service,@Repository等)用于自动检测和自动配置bean。
@Bean注解用于显式声明单个 bean,而不是让 Spring 自动执行。
您可以使用 执行以下操作@Bean。但是,这是不可能的@Component
@Bean
public MyService myService(boolean someCondition) {
if(someCondition) {
return new MyServiceImpl1();
}else{
return new MyServiceImpl2();
}
}
Run Code Online (Sandbox Code Playgroud)
还没有真正遇到过需要对同一类型的 bean 进行 Java 配置和组件扫描的情况。
根据spring 文档,
要声明 bean,只需使用 @Bean 注释来注释方法即可。当JavaConfig遇到这样的方法时,它将执行该方法并将返回值注册为BeanFactory中的bean。默认情况下,bean 名称将与方法名称相同
因此,根据这个,它返回正确的 Foo (值为 500)。
| 归档时间: |
|
| 查看次数: |
5048 次 |
| 最近记录: |