一、自动化装配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()方法。