一、Spring配置的可选方案
Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系。但是,作为开发人员,你需要告诉Spring要创建哪些bean并且如何将其装配在一起。当描述bean如何进行装配时,Spring具有非常大的灵活性,它提供了三种主要的装配机制:
- 在XML中进行显式配置。
- 在Java中进行显式配置。(在JavaConfig中配置@bean,用于将第三方库装配到spring中)
- 隐式的bean发现机制和自动装配。(@Component等注解;推荐使用)
二、自动装配
优点:在便利性方面相对于XML、javaConfig方式,最强大的还是Spring的自动化配置。如果Spring能够进行自动化装配的话,那何苦还要显式地将这些bean装配在一起呢?
Spring从两个角度来实现自动化装配:
- 组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean。
- 自动装配(autowiring):Spring自动满足bean之间的依赖。
组件扫描和自动装配组合在一起就能发挥出强大的威力,它们能够将你的显式配置降低到最少。
1.例子说明:
定义一个CD(CompactDisc)接口,以及实现类SgtPeppers,如下所示:
CompactDisc接口
SgtPeppers实现类
和CompactDisc接口一样,SgtPeppers的具体内容并不重要。你需要注意的就是SgtPeppers类上使用了@Component注解。这个简单的注解表明该类会作为组件类,并告知Spring要为这个类创建bean。没有必要显式配置SgtPeppersbean,因为这个类使用了@Component注解,所以Spring会为你把事情处理妥当。
不过,组件扫描默认是不启用的。我们还需要显式配置一下Spring,从而命令它去寻找带有@Component注解的类,并为其创建bean。这时需要使用@ComponentScan注解启用了组件扫描;
JAVA配置类(JavaConfig)展现了完成这项任务的最简洁配置。
如果没有其他配置的话,@ComponentScan默认会扫描与配置类相同的包。因为CDPlayerConfig类位于soundsystem包中,因此Spring将会扫描这个包以及这个包下的所有子包,查找带有@Component注解的类。这样的话,就能发现CompactDisc,并且会在Spring中自动为其创建一个bean。
通过XML启用组件扫描
2.@Component和@ComponentScan的深入
2.1 @Component命名
Spring应用上下文中所有的bean都会给定一个ID,默认将类名的第一个字母变为小写;如果想要自定义名称写法如下:
补充:Spring支持将@Named作为@Component注解的替代方案。两者之间有一些细微的差异,但是在大多数场景中,它们是可以互相替换的。
2.2 使用@ComponentScan设置扫描包
按照默认规则,它会以配置类所在的包作为基础包(basepackage)来扫描组件。如果你想扫描不同的包,那该怎么办呢?或者,如果你想扫描多个基础包,那又该怎么办呢?
1. @ComponentScan的value属性中指明包的名称:
2. 如果你想更加清晰地表明你所设置的是基础包,那么你可以通过basePackages属性进行配置(basePackages值为复数形式)
复数形式指定扫描多个包:
3.指定为包中所包含的类或接口
可以看到,basePackages属性被替换成了basePackageClasses。同时,我们不是再使用String类型的名称来指定包,为basePackageClasses属性所设置的数组中包含了类。这些类所在的包将会作为组件扫描的基础包。
3. 通过为bean添加注解实现自动装配
简单来说,自动装配就是让Spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在Spring应用上下文中寻找匹配某个bean需求的其他bean。为了声明要进行自动装配,我们可以借助Spring的@Autowired注解;装配方式(构造方法、类的方法)
构造方法
类方法:
如果没有匹配的bean,那么在应用上下文创建的时候,Spring会抛出一个异常。为了避免异常的出现,你可以将@Autowired的required属性设置为false: