欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring in action 读书笔记(第二章)bean的装配(java类显式配置和spring-test单元测试的使用)

程序员文章站 2024-02-15 11:56:28
...

 

 

小菜鸟学习spring,最近在啃 Spring IN ACTION ,中文版书名为spring实战,本书被大多数人点赞和好评。为了提高学习效果,特此做一个简单的笔记以便温习回顾,如有错误或者您有更好的建议与意见烦请指正指导。

书接上文,上文记录的是xml的显式装配,这里记录一下使用注解和java类进行bean的装配,在此之前,记录一下spring-test模块和junit单元测试的使用。

用一张截图比对两种方法的异同,如下图所示

 

Spring in action 读书笔记(第二章)bean的装配(java类显式配置和spring-test单元测试的使用)

 

需要注意的是:pom文件需要添加spring-test模块的依赖

贴一下使用spring-test模块测试方法的代码

package org.lujx.test.chapter1;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.lujx.chapter1.knights.BraveKnight;
import org.lujx.chapter1.knights.Person;
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*:application.xml")
public class Test4CSDN {

	@Autowired
	private BraveKnight braveKnight;
	
	@Test
	public void testBraveKnight(){
		braveKnight.embarkOnQuest();
	}
	
}

第二种装配方式 使用注解和java类进行装配,为了匹配书上的代码片段,新建接口和类

package org.lujx.chapter2.soundSystem;

/** 
 * @Description: 定义cd播放机接口
 * @author: lujx
 * @date: 2018年8月21日 下午8:20:23  
 */
public interface  CompactDisc {

	void play();
}

新建其实现类

package org.lujx.chapter2.soundSystem;
import org.springframework.stereotype.Component;

//spring组件
@Component
//java依赖注入标准 JSR 330
//@Named("sgtPeppers")
public class SgtPeppers implements CompactDisc {
	private String title = "Sgt.pepper's Lonely Hearts Club Band";
	private String artist = "The Beatles";

	public void play() {
		System.out.println("Playing " + title + " by " + artist);
	}
}

可以看到,定义了CD播放机接口 CompactDisc和实现了它的接口SgtPeppers类,并且在SgtPeppers类的上方加了一个@Component注解,这个注解表示该类作为一个组件被spring管理。

编写配置类

package org.lujx.chapter2.soundSystem;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages="org.lujx.chapter2")
public class CDPlayerConfig {

}

该类上有@Configuration注解,表示这个类是一个配置组件,@ComponentScan注解,表示自动扫描上下文中的所有组件

basePackages=“org.lujx.chapter2” 表示将扫描org.lujx.chapter2包及其子包下的所有@Component注解的组件。

由于更换了配置方式,所以测试类也需要进行相应的修改

 

package org.lujx.test.chapter2;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.lujx.chapter2.soundSystem.CDPlayerConfig;
import org.lujx.chapter2.soundSystem.CompactDisc;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)
public class CDPlayerTest {

	// java依赖注入规范 JSR 330
	// @Inject
	// spring注入
	@Autowired
	@Qualifier("sgtPeppers")	
	private CompactDisc cd;
	
	@Test
	public void testCD() {
		cd.play();
	}

	
}

 知识点小结:

@Component 注解表示将该类注解成spring的一个组件

@ComponentScan( basePackages="" ) 注解表示启用组件扫描,等价于在application.xml文件中配置<context:component-scan base-package = ""/> 

@Autowired 注解表示spring容器自动注入bean实例,当前,前提是该实例已有@component注解或者在application.xml文件中配置了<bean>标签

@Qualifier("自定义实例名称")  注解与@Component和@Autowired配合使用,为解决自动装配的歧义性,例如当一个接口有多个实现类是,自动装配是spring无法分辨究竟注入哪一个实现类,此时使用@Qualifier进行限定。

java同样有支持依赖注入的规范,其规范编号为JSR 330,上述demo中,JSR 330 注解 @Inject 和spring注解@Autowired 功能基本相同;java依赖注入标准 JSR 330 注解 @Named("sgtPeppers") 和spring 注解 @Component("sgtPeppers")基本相同,其他的不再赘述