java - 为什么在junit测试期间多次初始化bean?
问题描述
你能帮我理解为什么会发生以下情况吗?我有以下豆:
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class TestBean implements BeanPostProcessor {
public void init() {
System.out.println("Initialized!");
}
public void destroy() {
System.out.println("Destroyed!");
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization");
return null;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization");
return null;
}
}
使用以下配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean class="TestBean" init-method="init" destroy-method="destroy"/>
</beans>
和以下junit测试:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:beans1.xml"})
public class TestBeanTest {
@Autowired
private TestBean collectionBean;
@Test
public void testCollectionBean() {
}
}
现在,让我吃惊的是,如果我运行那个单元测试,“postProcessBeforeInitialization”和“postProcessAfterInitialization”会分别打印 5 次。是什么原因?在 bean 初始化期间,它们不应该只打印 1 次吗?先感谢您!
解决方案
回顾一下我的评论:
TestBean
对bean 后处理器postProcessBeforeInitialization
方法稍作更改:
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization " + beanName);
return null;
}
以及可能的最小 Spring 依赖:org.springframework:spring-context:5.0.2.RELEASE
您的代码的输出是:
postProcessBeforeInitialization org.springframework.context.event.internalEventListenerProcessor
postProcessBeforeInitialization org.springframework.context.event.internalEventListenerFactory
postProcessBeforeInitialization TestBeanTest
结论:bean 只被后处理器后处理一次,其余的是 Spring 自己的 bean。你得到 5 而我只得到 3 的事实是我们使用的不同依赖项集。
另外,请注意,TestBean
它甚至没有被考虑(打印),因为它不是 bean,而是 bean 后处理器。
推荐阅读
- css - 如何通过 CSS 覆盖在重复无限动画之间添加延迟
- android - 反应原生创建一个 android 模块 .gitignore 文件
- python - Python - 将文件从 HTTP(S) URL 传输到 FTP/Dropbox,无需写入磁盘(分块上传)
- matlab - 在matlab中将层次簇的根与其子级链接
- graphql - “未提供所需类型 \"ID!\" 的变量 \"$id\"。”
- java - 快速排序不运行 Java
- angular - Angular 7 使用 NGRX 并将令牌保存在 localStorage
- import - 导入范围中断
- image-processing - 拉普拉斯滤波器是如何计算的?
- electron - 电子锻造可以与 Electron 3.0 一起使用吗?