java - 使用@Import 注释会创建导入文件中定义的所有bean吗?
问题描述
A.java:
@Configuration
@Import(B.class)
class A {
@Bean
public X x(Y y) {
return new X(y);
}
}
B.java:
@Configuration
class B {
@Bean
public Y y() {
return new Y();
}
// And some other beans are defined
}
B.java
实例化bean时是否会实例化所有定义的bean x
?由于文件B.java
是由A.java
.
解决方案
一个测试:
一个简单的测试来可视化你的答案:
class ATest {
private static final Logger LOGGER = LoggerFactory.getLogger(A.class);
private ApplicationContext ctx;
@BeforeEach
void setUp() {
ctx = new AnnotationConfigApplicationContext(A.class);
}
@Test
void test() {
for (String beanName: ctx.getBeanDefinitionNames()) {
LOGGER.info("BEAN: " + beanName);
}
}
}
输出:
[main] INFO be.dog.d.steven.A - BEAN: org.springframework.context.annotation.internalConfigurationAnnotationProcessor
[main] INFO be.dog.d.steven.A - BEAN: org.springframework.context.annotation.internalAutowiredAnnotationProcessor
[main] INFO be.dog.d.steven.A - BEAN: org.springframework.context.event.internalEventListenerProcessor
[main] INFO be.dog.d.steven.A - BEAN: org.springframework.context.event.internalEventListenerFactory
[main] INFO be.dog.d.steven.A - BEAN: a
[main] INFO be.dog.d.steven.A - BEAN: org.company.B
[main] INFO be.dog.d.steven.A - BEAN: y
[main] INFO be.dog.d.steven.A - BEAN: x
如您所见,@Import
确实使应用程序上下文按预期包含了 B 类中的所有 bean。
前 4 个 bean 总是被创建,即使您只使用一个带有注释的空类@Configuration
来构建应用程序上下文。将始终创建的第五个 bean 是用于创建上下文的带注释的类。
在实践中:
虽然这很好用,但让您的应用程序@ComponentScan(basePackages = "org.company")
在某个包或文件夹中执行操作会更干净。这样,您不必总是向@Import
注释中添加新组件。(当您处理一个更大的项目时,您可能也不想扫描整个项目,而只是包含实际组件的文件夹。)
但是,您可以@Import
在测试类上使用仅加载该测试的上下文的隔离部分。
您还可以在application.properties中将 Spring Framework 的日志记录级别设置为 DEBUG :
logging.level.org.springframework=DEBUG
通过这种方式,您还可以检查应用程序的日志以查看创建了哪些 bean。
推荐阅读
- c# - 从 JSON API 数据中获取字段
- objective-c - 我在 NSUrlConnection sendSynchronousRequest 中收到 EXC_BAD_INSTRUCTION
- sql - 更新多行(最多 100 行)的所有列(最多 30 列)中的值
- rust - 如何指定 Cargo.toml 中我的主目录中的依赖项的路径?
- clojure - :keys 解构的逆过程:从序列构造映射
- python - 如何捆绑数据文件以使用 py2exe 将 python 脚本转换为 exe?
- apache-kafka - 如何配置kafka connect使用Avro Schema?
- vue.js - 添加和读取存储在 vuex 中的 json 数据
- elasticsearch - NEST elasticsearch 客户端库中 PropertyPathMarker 的替代方案
- apache-spark - 尝试从 aws 胶水目录表中读取值为“-”的列时获取 null