上篇说到,spring就像一个第三方,为你注入你需要的类,而不用自己new,这里就引入了spring是如何发现我们编写的类并进行创建的,又是怎么来判断类与类之间的依赖关系的,并进行注入的。
总的来说,spring提供了三种方式进行类装配:
在XML文件中配置:类的定义和类之间的依赖关系通过xml文件描述,然后spring去加载这个xml文件,来创建bean和他们之间的依赖关系。
在Java配置类中进行配置:专门写一个java配置来描述bean和bean之间的依赖关系,spring通过这个类来进行加载
通过注解的方式配置:通过给类加上注解,spring会扫描所有添加了注解的类,依次创建bean和他们之间的依赖关系
- 自动装配
目前主流的使用是第三种注解的方式,自动装配。因为比较方便,不用去维护xml文件和java类文件。所以先来学习一下通过注解方式。
通过注解进行装配主要有两个过程:
组件扫描:spring会扫描所有加了组件注解的类,并生成bean实例
自动装配:根据注解识别出类之间的依赖关系,进行依赖bean的注入。
下面通过一个小例子来说一下这个过程:
同样,以上面的国王和将军来做例子,先来看将军,定义一个将军的接口;
然后创建一个他的实现类:
注意到这个类上面加了一个@Component,这个类的作用就是标识我是一个组件类, spring在启动的时候,会对扫描所有的类,当扫描到类使用这个注解进行标识的时候,就要对其进行装载。
不过默认情况下,spring启动的时候是不会对类进行扫描的,所以必须通过配置开启扫描功能,开启的方式其实也是对应之前的另外两种装配方式:
一、在一个java配置类中开启,如下:
这里先不关心类里面的内容,先来看看他的两个注解。
第一个注解@Configuration表示当前类是一个配置类,用于配置spring扫描、装配信息的一个单独的java类。
第二个注解@ComponentScan就代表开启了扫描功能,如果不进行其他的配置,spring会默认扫描与当前这个类所处同一包下的所有类,并进行自动装配。
二、通过xml文件进行配置。
通过在spring的配置文件中设置context标签的组件扫描功能,即可开启:
并且base-package中配置了在扫描的范围是在 com.springIOC这个包下。
通过java配置类的方式同样也可以设置扫描的范围:
也可以设置多个包:
除了可以在注解中设置包以外,还可以设置类:
它会告诉,spring在扫描的时候扫描General.class类所在的包。
一般我们不会采取设置类这样的方式,因为如果有个时候这个类突然被删掉了,这里就会出错。当然你也可以在包