Java 配置与组件扫描注释

Joh*_*ner 5 spring

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 配置组件扫描似乎是一件坏事。

amd*_*mdg 1

在同一个项目中进行 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)。