Spring学习2 - Spring自带Junit单元测试、通过XML、注解将Bean注册到Spring容器上

157 阅读3分钟

文章目录

1. Spring自带Junit单元测试

好处:自动创建好容器,无需测试者创建Spring容器。所有@Test共享这个容器,而无需每个@Test都需要创建容器

1.1 步骤、以及测试类注解的设置

步骤:

  1. 导入相应的Jar包
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7RZXMa2Q-1576776809155)(en-resource://database/13719:1)]

  2. 单元测试类添加两个注解

    • @RunWith(value=SpringJUnit4ClassRunner.class)
    • @ContextConfiguration(“classpath:容器的配置文件路径”)

   @ContextConfiguration()注解有四种写法

1.2 代码测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EusQnvl0-1576776809158)(en-resource://database/13721:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bHq8ISfq-1576776809163)(en-resource://database/13727:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-imEXelo2-1576776809166)(en-resource://database/13723:1)]

  Spring的单元测试

@RunWith(value=SpringJUnit4ClassRunner.class)
@ContextConfiguration("applicationContext.xml")   // 当前包下查找配置文件
public class TestSpringContainer {
	
	@Autowired  // 自动装配 - 无需用户手动初始化、创建对象由Spring容器管理
	User user;
	
	@Test
	public void test1() {
		System.out.println(user.hashCode());
	}
	
	@Test
	public void test2() {
		System.out.println(user.hashCode());
	}
	
}


运行结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0AI3kWqh-1576776809172)(en-resource://database/13731:1)]

2. 实例化对象的五种方式 - XML容器配置文件、以及注解

利用Spring的内置测试工具进行 – 四种方式的调试

特别说明一下User1、2、3、4的类代码都是一样的,只是修改了类名而已
User - Bean类

public class User {
	
	String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "User [name=" + name + "]";
	}	
	
}

  Spring容器配置文件

<?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.xsd">
	
	<!--方式1.Class反射生成对象 -->
	<bean id="user" class="top.linruchang.domain.User"></bean>
	
	<!--方式2.工厂的静态方法生成对象-->
	<bean id="user2" factory-method="getUser2" class="top.linruchang.domain.User2Factory"></bean>
	
	<!--方式3.实例化工程使用成员方法进行生成对象-->
	<bean id="user3Factory" class="top.linruchang.domain.User3Factory" ></bean>
	<bean id="user3" class="top.linruchang.domain.User3" factory-bean="user3Factory" factory-method="getUser3"></bean>
	
	
	<!--方式4.继承FactoryBean- Spring管理生成对象-->
	<bean id="user4" class="top.linruchang.domain.User4Factory"></bean>
		
</beans>

2.1 Class反射进行生成对象

步骤

  1. 定义一个User Bean类
  2. 将上述User Bean全限定名配置在XML文件上 –****

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tDbcNong-1576776809181)(en-resource://database/13837:1)]

2.2 工厂的静态方法生成对象

  1. 定义一个User Bean类、以及工厂类(里面包含能获取UserBean对象的静态方法)
  2. 将上述工厂全限定名以及生成UserBean对象配置在XML文件上 –****

  静态工厂方法类

public class User2Factory {	
	public static User2 getUser2() {
		return new User2();
	}	
}

2.3 实例化化工厂成员方法生成对象

  1. 定义一个User Bean类、以及工厂类(里面包含能获取UserBean对象的成员方法)
  2. 工厂的实例化交给Spring容器管理:****
  3. *定义UserBean对象由哪个工厂生成,以及调用的工厂方法:*****

  工厂类

public class User3Factory {	
	public User3 getUser3() {
		return new User3();
	}	
}

2.4 实现Spring内置的FactoryBean接口

  1. 定义一个User Bean类、以及工厂类(实现FactoryBean所有方法即可)
  2. 配置文件设置为:****


工厂类

public class User4Factory implements FactoryBean<User4> {
	@Override
	public User4 getObject() throws Exception {
		return new User4();
	}

	@Override
	public Class getObjectType() {
		return User4.class;
	}

	@Override
	public boolean isSingleton() {
		return false;
	}	
}

2.5 测试XML四种方式配置的运行效果

  使用Spring内置的Junit测试工具

@RunWith(value=SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringJunitTest {
	
	@Autowired
	User user;
	
	@Autowired
	User2 user2;
	
	@Autowired
	User3 user3;
	
	@Autowired
	User4 user4;
	
	@Test
	public void test() {
		System.out.println(user);
		System.out.println(user2);
		System.out.println(user3);
		System.out.println(user4);
	}
	
}


运行结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WuWZxRJz-1576776809183)(en-resource://database/13838:1)]

2.6 注解自动注册到Spring容器

`  Spring容器配置文件添加一个扫描语句

<!-- 用于扫描某个包下所有类含有Component注解 - 将他们注册到Spring容器上 -->
<context:component-scan base-package="top.linruchang"></context:component-scan>

  Human - Bean源码

@Component
public class Human {	
	@Autowired //当Human实例化时,自动调用这个方法
	public void setDept(Dept dept) {
		System.out.println("dept注入成功:" + dept);
	}	
}

  Dept - Bean源码

@Component
public class Dept {
	String deptno;
	String dname;
}

  测试代码 - 看是否属性注入成功

@RunWith(value=SpringJUnit4ClassRunner.class)
@ContextConfiguration("applicationContext.xml")
public class DITest {	
	@Autowired    // Spring容器帮你实例化
	Human human;
		
	@Test
	public void test() {
		System.out.println(human);
	}	
}

  运行效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u284k9lG-1576776809185)(en-resource://database/13990:1)]