**
Spring实战第四版
**
第2章 装配Bean
声明bean
构造器注入和Set t er方法注入
装配bean
控制bean 的创建和销毁
2.1 Spring配置的可选方案
在XML 中进行显式配置。
在Java中进行显式配置。
隐式的bean 发现机制和自动装配。
尽可能地使用自动配置的机制。显式配置越少越好。
2.2 自动化装配bean
Sprin g 从两个角度来实现自动化装配:
组件扫描(component scanning ):Sprin g 会自动发现应用上下文中所创建的bean 。
自动装配(autowiring ):Spring 自动满足bean 之间的依赖。
@Component组件类 想要被发现的组件 这个简单的注解表明该类会作为组件类,并告知Sprin g 要为这个类创建bean 。
组件扫描:
1.不过,组件扫描默认是不启用的。我们还需要显式配置一下Sprin g ,从而命令它去寻找带有@Component注解的类,并为其创建bean 。
@ComponentScan注解,这个注解能够在Sprin g 中启用组件扫描。@ComponentScan默认会扫描与配置类相同的包。
2. XML 的方案来启用组件扫描 元素会有与@ComponentScan注解相对应的属性和子元素
Bean命名
尽管我们没有明确地为SgtPeppersbean 设置I D,但Sprin g 会根据类名为其指定一个I D。具体来讲,这个bean 所给定的I D为sgtPeppers,也就是将类名的第一个字母变为小写
自己命名:
Sprin g 支持将@Named作为@Component注解的替代方案。两者之间有一些细微的差异,但是在大多数场景中,它们是可以互相替换的。
设置组件扫描的基础包
我们没有为@ComponentScan 设置任何属性。这意味着,按照默认规则,它会以配
置类所在的包作为基础包(basepackage)来扫描组件。
为了指定不同的基础包,你所需要做的就是在@ComponentScan的valu e属性中指明包的名称:
basePackages属性使用的是复数形式 字符串格式 易出错
basePackages属性被替换成了basePackageClasses
为basePackageClasses属性所设置的数组中包含了类。这些类所在的包将会作为组件扫描的基础包。
通过为bean添加注解实现自动装配
自动装配就是让Sprin g 自动满足bean 依赖的一种方法,在满足依赖的过程中,会在Sprin g 应用上下文中寻找匹配某个bean 需求的其他bean 。为了声明要进行自动装配,我们可以借助Sprin g 的@Autowired注解。
它的构造器上添加了@Autowired注解,这表明当Sprin g 创建CDPlayerbean 的时候,会通过这个构造器来进行实例化并且会传入一个可设置给CompactDisc类型的bean 。
@Autowired注解不仅能够用在构造器上,还能用在属性的Set t er方法上。比如说,如果CDPlayer有一个setCompactDisc()方法,那么可以采用如下的注解形式进行自动装配:
@Autowired注解可以用在类的任何方法上。假设CDPlayer类有一个insertDisc()方法,那么@Autowired能够像在setCompactDisc()上那样,发挥完全相同的作用:
不管是构造器、Set t er方法还是其他的方法,Sprin g 都会尝试满足方法参数上所声明的依赖。假如有且只有一个bean 匹配依赖需求的话,那么这个bean 将会被装配进来。
如果没有匹配的bean ,那么在应用上下文创建的时候,Sprin g 会抛出一个异常。为了避免异常的出现,你可以将@Autowired的required属性设置为false:
但是如果没有匹配的bean 的话,Sprin g 将会让这个bean 处于未装配的状态。如果有多个bean 都能满足依赖关系的话,Sprin g 将会抛出一个异常,表明没有明确指定要选择哪个bean 进行自动装配。
2.3 通过Java代码装配bean
尽管在很多场景下通过组件扫描和自动装配实现Sprin g 的自动化配置是更为推荐的方式,但有时候自动化配置的方案行不通,因此需要明确配置Sprin g 。比如说,你想要将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加@Component和
@Autowired注解的,因此就不能使用自动化装配的方案了。在这种情况下,你必须要采用显式装配的方式。在进行显式配置的时候,有两种可选方案:Java和XML 。
在进行显式配置时,JavaConfig 是更好的方案,
要在JavaCon f ig 中声明bean,我们需要编写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加@Bean注解。
@Bean注解会告诉Sprin g 这个方法将会返回一个对象,该对象要注册为Sprin g 应用上下文中的bean 。方法体中包含了最终产生bean 实例的逻辑。指定名字:
不管你采用什么方法来为bean 命名,bean 声明都是非常简单的。方法体返回了一个新的SgtPeppers实例。