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