Spring(一)传统的基于JUtil的测试环境的问题以及Spring中的容器

传统的基于JUtil的测试环境的问题:
    每次启动都要手动的去调用Spring的工厂方法开启Spring,而运行完成之后又不去关闭Spring
    
基于Spring的测试的使用:
1.首先导入基础测试需要的jar:test,aop,expression,context


2.在测试类上编写注解:@RunWith(SpringJUtil4ClassRunner.class)
    表示Spring给JUnit提供了一个运行环境,其实Spring内部会把当前的测试类当做Spring的一个bean处理,这样Spring就可以在测试文件启动的时候,自动的启动Spring容器

@RunWith(SpringJUnit4ClassRunner.class)在测试类上写

3.在@RunWith相同的位置添加注解:@ContextConfiguration,参数填写包括后缀的本模块的xml配置文件的名称
    这个参数可以不写,但是如果不写,则需要按照约定的方式给配置文件起名,这个约定的配置文件名的格式是:
    `TestClassName-context.xml`

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
XML文件名为`测试类名-context.xml`则可以不在@ContextConfiguration后面写否则,必须写上xml文件名(@ContextConfiguration(xml文件))

4.在测试类中编写一个BeanFactory的字段,并且使用注解@Autowired标注
    表示告诉Spring这个字段就是你默认需要创建的BeanFactory
    这个就是DI:Dependency Injection  依赖注入

    @Autowired
    ApplicationContext appCtx;
    //必须加注释    @Autowired,否则测试的时候会报java.lang.NullPointerException错误

测试类的整体写法:

package com.gxxy.spring02;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class HelloWorldTest {
    @Autowired
    ApplicationContext appCtx;
    @Test
    public void Springtest() {
        IHelloWorldDAO bean = appCtx.getBean("helloworldBean1", IHelloWorldDAO.class);
        bean.sayHello();
    }
}

Container
一:Spring 中的容器
    Spring容器有BeanFactory和ApplicationContext两种类型
1.BeanFactory
    BeanFactory是Spring中提供的最简单,最基本的容器;这个容器只提供了Ioc/DI的功能
2.ApplicationContext:

  也是一个接口,继承了BeanFactory,ApplicationContext容器功能更加全面
      expression:Spring实现的EL表达式,允许在配置文件中使用EL表达式,但是一般不会这么用    
      context:上下文环境

    @Autowired
    AbstractApplicationContext appCtx;
    @Autowired
    BeanFactory factory;

二:对比
1.BeanFactory:
    容器启动时不会实例化对象
2.ApplicationContext:
    容器启动时会实例化对象,也可以通过在bean注解的`lazy-init`属性可以让容器不会去实例化
    也可以在beans添加属性`default-lazy-init`

原文地址:https://www.cnblogs.com/zhang-bo/p/6627308.html