Spring有三种方式装配Bean,有xml文件,有JavaConfig,还有最方便的自动装配。

上一篇SpringBoot依赖注入中依赖注入的例子使用的是JavaConfig显示配置的方法。

回想一下,Config类,他显示地配置了很多的bean,每次都要自己配置不嫌麻烦?能不能省略显示配置的内容,让让Spring自动去发现类—–可以,这便是Spring自动装配。

Spring自动装配

ABC过于抽象,咱们这次换个生动的例子(《Spring实战》),我们为其取名为”音乐播放器和他的CD”。uml类图建模如下图所示:
beans

解释一下:CompactDisc有个play()方法,Fantasy(范特西)实现了CompactDisc接口,CDplayer使用Fantasy播放音乐。代码如下:

1
2
3
public interface CompactDisc {
void play();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Fantasy implements CompactDisc{
private String title = "范特西";
private String artist = "周杰伦";
private List<String> songs;

@Override
public void play() {
System.out.println("正在播放"+artist+"的"+title);
}

public Fantasy(List<String> songs) {
this.songs = songs;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
public class CDPlayer {
private CompactDisc cd;

public CDPlayer(CompactDisc cd) {
this.cd = cd;
}

public void play(){
cd.play();
}

}

类比一下上一篇的ABC,其实是一样的模子。按照上篇的思维,即显示配置Bean,接下来我们就需要写个Config类,然后在里面显示返回CDPlayer,Fantasy实例对象。你可以停下来想一想。周杰伦14张专辑都实现了CompactDisc接口,你都需要手动写,岂不是很麻烦,时间复杂度为O(n) = =。

好在Spring支持自动配置,解放了我们的双手!那我们该怎么改呢?CompactDisc接口不需要改动;Fantasy只需要在类之前使用@Component注解告诉Spring它是个组件,需要被扫描然后装入容器中,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Component							// --------------> 改动
public class Fantasy implements CompactDisc{
private String title = "范特西";
private String artist = "周杰伦";
private List<String> songs;

@Override
public void play() {
System.out.println("正在播放"+artist+"的"+title);
}

public Fantasy(List<String> songs) {
this.songs = songs;
}
}

CDPlayer也需要添加@Component注解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Component							// --------------> 改动
public class CDPlayer {
private CompactDisc cd;

@Autowired // --------------> 改动,自动把cd装入
public CDPlayer(CompactDisc cd) {
this.cd = cd;
}

public void play(){
cd.play();
}

}

@Autowired注解相当于告诉Spring,如果容器中存在CompactDisc的实例,那么在生成CDPlayerBean是,把CompactDisc实例依赖自动装入。最后我们需要一个CDPlayerConfig告诉Spring需要扫描哪些Component

1
2
3
4
@Configuration
@ComponentScan(basePackageClasses = CompactDisc.class)// -------------->扫描CompactDisc.class所在包
public class CDPlayerConfig {
}

你会发现只要在组件上方添加@Component注解,并且使用@ComponentScan告诉Spring哪些组件需要被装入容器,你就能省略上篇冗杂在Config显示配置Bean。

SpringBoot简化操作

如果用过SpringBoot的同鞋可能发现,上述的两步走

  1. 在组件上方添加@Component注解
  2. 使用@ComponentScan告诉Spring哪些组件需要被装入容器

中的第二步是不需要开发人员做的,没错,SpringBoot简化了配置操作,但是不代表它没有做,它只是在幕后帮你完成了第二步。

Comments

⬆︎TOP