gpt4 book ai didi

spring - Java 配置与组件扫描注释

转载 作者:行者123 更新时间:2023-12-02 03:35:51 27 4
gpt4 key购买 nike

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;

...
}

那么,在上述情况下,Consumer会得到一个值为500的Foo实例还是值为0的Foo实例呢?我在本地进行了测试,看来 Java 配置的 Foo (值为 500)是一致创建的。但是,我担心我的测试不够彻底,无法得出结论。

真正的答案是什么?在相同类型的 @Component bean 上使用 Java 配置组件扫描似乎是一件坏事。

最佳答案

我认为您的担忧更像是由以下用例引起的:

您有一个自定义的 spring-starter-library,它有自己的 @Configuration 类和 @Bean 定义,但是如果您有 @Component/@Service 在此库中,您需要从服务中显式地 @ComponentScan 这些包,因为默认的 @ComponentScan (请参阅 @SpringBootApplication >) 将从主类到应用程序的所有子包执行组件扫描,但不扫描外部库内的包。为此,您只需要在外部库中包含 @Bean 定义,并通过应用程序主类上使用的 @EnableSomething 注释注入(inject)这些外部配置(使用 @Import(YourConfigurationAnnotatedClass.class) 或者通过使用 spring.factories 以防您始终需要使用/注入(inject)外部配置。

当然,你可以在这个库中使用@Components,但是显式使用@ComponentScan注释在某些情况下可能会导致意外的行为,所以我建议以避免这种情况。

所以,回答你的问题 -> 你可以使用两种定义 bean 的方法,只要它们在你的应用程序内部,但应用程序外部的 bean 定义(例如库)应该使用 @Bean< 显式定义@Configuration 类中。

关于spring - Java 配置与组件扫描注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47642404/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com