首页 > 解决方案 > 为什么在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 次吗?先感谢您!

标签: javaspringjunit

解决方案


回顾一下我的评论:

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 后处理器。


推荐阅读