1. 引言
在本系列之前的文章中,我们实现了Spring的HelloWorld应用,也通过了解Spring的容器知道了容器的职责是创建程序中的bean并通过依赖注入把协调这些对象之间的关系,但是要创建哪些bean并且如何装配是你需要告诉Spring的,Spring提供了三种主要的装配机制:
- 在XML中显式配置
- 在Java中显式配置
- 隐式的bean发现机制和自动装配
三种方式都可以实现bean的装配,具体使用哪种,看个人喜好。今天讲的是隐式的bean发现机制和自动装配
2. 自动装配概述
Spring主要从两个角度实现自动化装配:
- 组件扫描: Spring可以自动扫描上下文中的bean
- 自动装配: Spring能自动满足bean之间的依赖
3. 案例讲解
我们拿生活中比较常见的影碟机例子进行说明,影碟机进行电影放映时候,需要将光盘(CD)放入放映机(CD Player)中,一起来看程序:
3.1 CD接口
cd都有一个通用的功能,就是要能实现播放,即play功能。
package blog.p2;
public interface CD {
void play();
}
3.2 周杰伦歌曲CD
周杰伦的CD实现了CD的功能,同时标明了特有的作者和歌曲名
package blog.p2;
import org.springframework.stereotype.Component;
@Component
public class JayCD implements CD {
private String title = "稻香";
private String artist = "Jay";
public void play() {
System.out.println("palying " + title + " by " + artist);
}
}
3.3 CD放映机
影碟放映机负责将CD装入,进行播放
package blog.p2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class CDPlayer {
private CD cd;
@Autowired
public CDPlayer(CD cd) {
this.cd = cd;
}
public void play(){
cd.play();
}
}
3.4 Spring配置类
从上面的三个POJO中,我们看到和我们通常写的代码区别仅在于多了一些注解,这儿主要有两个注解:
- @Component:这个简单的注解表明该类 会作为组件类,并告知Spring要为这个类创建bean。
- @Autowired:表明当Spring创建CDPlayer bean的时候,会通过这个构造器来进行实例化并且会传入一个CD类型的bean。
当标注好bean及装配方式后,我们要让Spring能扫描到这些注解,主要用到两个注解:
- @Configuration:标明该类为一个配置类
- @ComponentScan:组件扫描,可以定义扫描的基础包,如本例中的blog.p2,只要指定了基础包,Spring就会扫描该包及子包下的所有bean,并自动装配。当然ComponentScan中你也可以设置basePackageClasses代替basePackages,basePackageClasses = CDPlayer.class 就是指定CDPlayer所在的包及其子包下所有的bean,当然从basePackageClasses、basePackages的复数形式可以看出,你可以指定多个包或者多个类,如:basePackageClasses = {CDPlayer.class,CD.class},以下是本例配置文件:
package blog.p2;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "blog.p2")
public class Config {}
3.5 测试类
package blog.p2;
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 = Config.class)
public class App {
@Autowired
CDPlayer cdPlayer;
@Test
public void test(){
cdPlayer.play();
}
}
在测试类中指定配置文件为Config.class,对test方法做单元测试后,输出:
palying 稻香 by Jay
一个自动装配的Spring demo就完成了。
4. 小结
自动装配主要有两个工作要做,一是标记好哪些bean需要创建,二是申明如何处理依赖之间的关系,本讲只是简单做了演示,关于每个注解详细的介绍会在下一讲。