《Spring实战》读书笔记——Spring自动化配置

一、自动化装配bean

实现自动化装配的两步骤:

(1)组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean。

(2)自动装配(autowiring):Spring自动满足bean之间的依赖关系。

1:创建可被发现的bean

首先定义一个接口CompactDisc:

package soundsystem;

public interface CompactDisc {
	void play();
}

实现该接口:在该实现类上使用@Component注解表明该类会作为组建类,并告知Spring要为这个类创建bean。

package bean;
import org.springframework.stereotype.Component;
import soundsystem.CompactDisc;
@Component
public class SgtPeppers implements CompactDisc {
	
	private String title="Sgt,Peppers Lonely Hearts Club Band.";
	private String artist="The Beatles";

	public void play() {
		// TODO Auto-generated method stub
		System.out.println("Playing"+title+"by"+artist);
	}
}

由于组件扫描默认不启用,需要显式配置一下Spring,从而命令它去寻找@Component注解的类,并为其创建bean。即:

package soundsystem;

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

import bean.SgtPeppers;

@Configuration    //表示这是一个匹配文件
@ComponentScan(basePackageClasses= {SgtPeppers.class})
public class CDPlayerConfig {
}

其中@ComponentScan(basePackageClasses={SgtPeppers.class})将SgtPeppers所在的包作为基础包进行扫描带有@Component注解的类,并创建bean。

注意:@ComponentScan有三种写法:

               1)@ComponentScan默认扫描与匹配类相同的包及其子包。

               2)@ComponentScan(basePackageClasses={SgtPeppers.class})将SgtPeppers所在的包作为基础包进行扫描。

               3)@ComponentScan(basePackages={"soundsystem"})  扫描包名为soundsystem的包及其子包。

然后测试组件扫描能够发现CompactDisc:

package soundsystem;

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

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)
public class CDPlayTest {
		
	@Autowired
	private CompactDisc cd;

	@Test
	public void cdShouldNotBeNull() {	
		assertNotNull(cd);
	}
}

   使用了Spring的SpringJUnit4ClassRunner,在测试开始的时候自动创建Spring的应用上下文。@ContextConfiguration(classes=CDPlayerConfig.class) 注解告诉它到CDPlayerConfig中加载配置文件。

如果运行后测试通过则成功。

2.通过为bean添加注解实现自动装配

自动装配:让Spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在Spring应用上下文中寻找匹配某个bean需求的其他bean。可借助Spring的@autowiring注解来实现这一功能。

第一:加上一个接口:

package soundsystem;

public interface MediaPlayer {
	public void play();  }

第二:实现该接口:通过@autowiring注解将一个CompactDisc注入到CDPlay的构造器中。

package bean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import soundsystem.CompactDisc;
import soundsystem.MediaPlayer;

@Component
public class CDPlay implements MediaPlayer {
	
	private CompactDisc compactDisc;
	
	@Autowired
        public CDPlay(CompactDisc cd) {
		// TODO Auto-generated constructor stub
		compactDisc=cd;
	}

	@Override
	public void play() {
		// TODO Auto-generated method stub
		compactDisc.play();
	}
}

3.验证自动装配

package soundsystem;

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

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)
public class CDPlayTest {
	
	@Autowired
	private MediaPlayer player;
	
	@Autowired
	private CompactDisc cd;

	@Test
	public void cdShouldNotBeNull() {	
		assertNotNull(cd);
	}
	
	@Test
	public void play() {
		player.play();
	}

}

运行结果:

其中,我们不仅将Component注入,还将CDPlaybean注入到了测试代码player中。从结果可以看出,player成功调用了play()方法。

猜你喜欢

转载自blog.csdn.net/sinat_38301574/article/details/80159837
今日推荐