传统的基于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`