【问题标题】:Run code before spring context initialization在 spring 上下文初始化之前运行代码
【发布时间】:2012-07-21 04:47:58
【问题描述】:

在 tomcat 7 上运行 web 应用程序,我的部署描述符包含 2 个侦听器,一个是我创建的自定义侦听器,另一个是 Spring:

<listener>
    <listener-class>com.company.appName.web.context.MyContextListener</listener-class>
</listener>

<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

当我运行我的集成测试时,我的监听器根本不会被调用,所以为了克服它,我自己做一些初始化(调用一些基本上是从我的这个监听器调用的静态方法)。无论如何,我想我在这里遗漏了一些东西,听众什么时候被叫到?为什么在我的集成测试期间不会初始化?更具体地说,Spring 上下文确实被初始化了,这是因为我在我的测试类的顶部声明了它:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:testApplicationContext.xml" })

所以 web.xml 从来没有真正使用过..

在这种情况下,spring 上下文总是首先被调用,在它被初始化之前我没有机会做任何事情——是这样吗?有没有办法在 spring 的上下文之前运行一些代码?

更新: 我还想提一下,我在测试套件中使用了 @BeforeClass 注释:

@RunWith(Categories.class)
@IncludeCategory(HttpTest.class)
@SuiteClasses({ <MY TEST CLASSES> })
public class HttpSuiteITCase {

    /**
     * Run once before any of the test methods.
     */
    @BeforeClass
    public static void setTestsConfigurations() {
    TestConfiguration.setup(false);
    }
}

使用这种方法并不能解决问题,测试类以及我所有的 spring bean 都会首先被初始化。

提前致谢

【问题讨论】:

    标签: spring tomcat web-applications web.xml


    【解决方案1】:

    使用@BeforeClass 在您的测试类中注释static 方法并在那里进行初始化。例如:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration({ "classpath:testApplicationContext.xml" })
    public class TestTest {
    
        @BeforeClass
        static public void beforeClass() {
            // do intialization here
        }
    

    如果您的初始化代码需要访问类字段,因此不能是static,那么您可以设置TestExecutionListener 并实现beforeTestClass()。有关示例,请参阅this blog post

    【讨论】:

    • 我昨天确实尝试过,但由于某种原因它没有工作(我尝试从我的套件中运行 @BeforeClass 方法,所以它只会运行一次。今天它工作了......我太困了昨天:)
    【解决方案2】:

    您可以在测试上下文中的 bean 中使用 init-method。

    <bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/>
    

    公共类 ExampleBean {

    public void init() {
        // do some initialization work
    }
    

    }

    【讨论】:

    • 好的,有趣。但是谁能保证这个 bean 在我所有的 spring bean 中首先被初始化?
    • 为此,您必须在 spring 和 spring-bean-life-cycle 中进行初始化回调。 static.springsource.org/spring/docs/3.0.x/…。为确保您可以自己尝试一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 2011-12-05
    • 2018-09-02
    • 1970-01-01
    • 2014-06-25
    相关资源
    最近更新 更多