Spring装配Bean怎么和拍电影一样?--《Spring实战》系列03

不看不知道,一看吓一跳。Spring装配Bean怎么能和拍电影一样呢?

上次我们讲到了Spring之所以强大,是因为有它的三把宝刀。还记得是什么吗?给你三秒钟思考一下。。。时间到,想起来了吗?这三把宝刀里最厉害的是前两把,DI依赖注入和AOP面向切面编程,至于第三把是什么,忘记的乖乖回去翻翻上篇文章。

继续谈Spring的宝刀,在第一章“Spring之旅”结束之后,我们就进入了第二章“装配Bean”, 这正是依赖注入的关键所在。我们已经了解到Spring实现依赖注入的目的是松耦合,但它到底是怎么实现依赖注入的,这一章节就揭开了依赖注入的面纱,让我们更加深入和全面的去认识一下她吧。

电影大家都看过,但是你是否注意过电影结束后那些片尾字幕呢?一部电影往往需要非常多的人齐心协力制作出来,除了主要的参与人员——演员,编剧,导演和制片人,还有那些幕后人员——音乐师,特效制作人员和艺术指导,更不用说道具师,录音师,服装师,化妆师,特效演员,等等。但是有一个问题,如果这些人彼此之间没有任何的交流,你最喜爱的电影会变成什么样呢?

如果他们同时出现在摄影棚里,开始各做各的事,彼此之间互不合作。如果导演保持沉默不喊“开机”,摄影师就不会开始拍摄。摄影师不开始拍摄,那么女主角就还呆在她的化妆室里,而且因为没有雇佣灯光师,一切都处于黑暗之中。也许这样也能勉强拍出一部电影,但是大多数电影都是由成千上万的人一起协作来完成的。

在这方面,一个优秀的软件与之相比并没有太大的区别。任何一个成功的应用都是由多个为了实现某一个业务目标而互相协作的组件构成的。这些组件必须彼此了解,并且相互协作来完成工作。而在Spring中,对象无需自己查找或创建与其所关联的其他对象。因为,有容器负责把需要相互协作的对象引用赋予给各个对象。

创建应用对象之间协作关系的行为通常就称为“装配”(wiring),这也是依赖注入DI的本质。

实际上,Spring装配Bean有很多种方式,《Spring实战》这本书中主要讲解了最常用的三种方式:

在XML中进行显式配置
在Java中进行显式配置
隐式的bean发现机制和自动装配

而这三种方式也是有排列优先级的,书中作者的建议是:自动装配 >Java显示配置>XML显示配置。 这个排序的标准就是:每一种装配方式的便利性和强大性。就好比,张无忌同时拥有三大门派的武功秘籍,但是它们各自特点不同,在实战中发挥的作用也不相同。第一种隐式的自动装配往往能一招制敌,更快更准威力最大,往往能杀敌于无形之中。第二种Java显式配置,虽然也能打败一些敌人,但是招式可能没有那么漂亮,容易人发现,但威力依旧很大。第三种XML显式配置,属于招式笨拙,威力不大,但是也能多花点时间可以打败敌人的那种。

我们一起来看看Spring的这三个招式:

招式一: 自动化装配bean

这个可杀敌于无形之中的招式关键点就两条:隐式和自动。在技术上Spring从两方面实现了自动化装配:
组件扫描(component scanning): Spring会自动发现应用上下文中所创建的bean。
自动装配(autowiring):Spring自动满足bean之间的依赖。

整个自动化装配的过程分为三步:
将需要被用作对象注入的类加上@Component注解,这是一个标志,表示这个类会作为组件类,也就是说Spring容器会为这个类创建Bean
通过XML启用组件扫描,在xml文件运用<context:component -scan >元素定位上面的类,或者在Java配置类中加上@Configuration和@ComponentScan注解
在需要依赖注入的类中,添加@Autowired注解,Spring会自动把需要的bean创建出来供当前的类使用。

为了方便理解,我们来看一个具体的例子:CD播放器和CD盘之间的协作。只有CD播放器,我们是听不了歌曲的,必须要把CD盘放进CD播放器里,这中间就是一种协作,而且不同的CD盘里面有不同的歌曲,我们想听更多的歌,就需要将很多CD盘找来放进CD播放器里。

首先,我们创建一个CD盘的接口,它可以播放任何你想听到的音乐,只要这个音乐实现这个接口,就可以实现播放功能。

package soundsystem
public interface CompactDisc{
void play();
}

其次,我们需要一个CompactDisc的实现类,当然也可以有多个它的实现,毕竟不能一直单曲循环呀。这个类要做的就是实现刚刚上面自动化装配的第一步,加一个@Component注解

package soundsystem;
import org.springframework.stereotype.Component;
@Component
public class JayChou implements CompactDisc{

private String title =“JayChou’s love song club” ;
private String artist=“JayChou”;
public void play(){
System.out.println("Playing "+ title+ “by” + aritist);
}

}

这个类加上@Component注解后,周杰伦的歌曲就可以随便放到CD播放器里播放了,先来一首《稻香》吧。

Hold on, hold on 等一下,Spring的组件扫描功能默认是不启用的,我们还要去完成自动装配的第二步:在xml文件或者Java配置类中开启组件扫描功能。

先来配置类:

package soundsystem;
import org.springframwork.context.annotation.componentScan;
import org.springframwork.context.annotation.Configuration;

@Configuration
@ComponentScan
public class CDPlayerConfig{
}

或者在XML中配置好启用组件扫描的功能:

<?xml version="1.0" encoding="UTF-8"?>

<context: component - scan base-package=“soundsystem”/>

这样一来,任何CD播放器想要播放周杰伦的歌曲就都没有问题了,只需要在CD播放器的类里加上一个@Autowired就可以了。不信,试试下面的测试类,也许你就能听到周董的声音了。

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 CDPlayerTest {
@Autowired
private CompactDisc cd;

@Test
public void cdShouldNotBeNull(){

assertNotNull(cd);

}
}

其实@Autowired注解还可以用在构造器上和属性的Setter方法上,也就是我们说的构造器注入和setter注入。这里就不举例了,代码太多了。呜呜呜。。。

关于招式一自动装配的方式还有很多其它细节,这里就不一一介绍了。现在我们移步招式二Java代码装配bean。

招式二:Java代码装配bean.

由于篇幅有限,这里就简单介绍一下。这种显式配置的最重要的一个注解就是@Bean,声明这是一个配置类,可以被Spring拿走创建一个bean,然后其它的类使用的时候直接装配就行了。@Bean注解既可以使用在构造器和setter方法上面,也可以采用任何必要的Java功能来产生bean实例。

招式三:通过XML装配bean

在Spring刚刚出现的时候,XML是描述配置的主要方式。在Spring的名义下,其实已经创建了无数行XML代码,在一定程度上,Spring成为了XML配置的同义词。但是Spring发展到现在,XML不再是配置Spring的唯一可选方案,因为已经有了更强大的自动化配置和基于Java的配置。所以,在这里,就不对招式三做具体解释了,感兴趣的朋友可以自己查找资料了解。

后记:

关于Spring装配Bean的故事,今天就聊这么多。下次如果碰到面试官问,请谈一谈Spring当中的依赖注入是怎么回事,就可以把这三种装配方式甩出来,然后具体讲讲第一种自动化装配,由浅到深,最后再聊一聊依赖注入,完事。

最后再谈一点小感悟,书读百遍其义自见,这句话说得真没错。自己读第一遍的时候,是一回事,当需要用自己的话把自己的理解写出来的时候,又是另外一回事,这两回事中间的差距可真的不小嘞。

没关系,路漫漫其修远兮,吾将上下而求索。持续行动,持续努力,持续靠近,终于一天,当我们谈论Spring的时候,就像谈论自己熟知的心爱的姑娘一样。

Over~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值