《Spring实战(第四版)》学习笔记
Spring 从两个角度来实现自动化装配:
-
组件扫描(component scanning):Spring 会自动发现应用上下文中所创建的 bean。
-
自动装配(autowiring):Spring 自动满足 bean 之间的依赖。
package soundsystem
@Component
//@Component("something")
public class SgtPeppers implements CompactDisc {
}
@Component
这个注解表明该类会作为组件类,并告知 Spring 要为这个类创建 bean;
bean的创建会标记一个ID,默认是类名的首字母小写,也可以自己定义。
package soundsystem;
@Configuration
@ComponentScan
//@ComponentScan(basePackages="soundsystem")
//@ComponentScan(basePackages={"soundsystem", "video"})
//@ComponentScan(basePackageClasses={CDPlayer.class, DVDPlayer.clas}
public class CDPlayerConfig {
}
@ComponentScan
这个注解能够在 Spring 中启用组件扫描。如果没有其他配置的话,@ComponentScan 默认会扫描与配置类相同的包。因为 CDPlayerConfig 类位于 soundsystem 包中,因此 Spring 将会扫描这个包以及这个包下的所有子包,查找带有 @Component 注解的类。这样的话,就能发发现刚刚的注解 CompactDisc,并且会在 Spring 中自动为其创建一个 bean;
可以指定不同的基础包,使用basePackages;
也可以指定多个基础包,使用数组的形式传入;
也可以将其指定为包中所包含的类或接口,使用basePackageClasses。同时,不是再使用 String 类型的名称来指定包,而是对basePackageClasses 属性所设置的数组中包含了类。这些类所在的包将会作为组件扫描的基础包。
@Configuration
用于定义配置类,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
package soundsystem;
@Component
public class CDPlayer implements MediaPlayer {
@Autowired
private CompactDisc cd;
@Autowired
public CDPlayer(CompactDisc cd) {
this.cd = cd;
}
@Autowired
//@Autowired(required=false)
public void setCompactDisc(CompactDisc cd){
this.cd = cd;
}
}
@Autowired
这个注解表明当 Spring 创建bean的时候,会通过这个构造器来进行实例化并且会传入一个可设置给该类型的 bean;
@Autowired 注解不仅能够用在对象和构造器上,还能用在属性的 Setter 方法上。比如:CDPlayer 的setCompactDisc() 方法;
不管是对象实例、构造器、Setter 方法还是其他的方法,Spring 都会尝试满足方法参数上所声明的依赖。假如有且只有一个 bean 匹配依赖需求的话,那 么这个 bean 将会被装配进来。如果没有匹配的 bean,那么在应用上下文创建的时候,Spring 会抛出 一个异常。为了避免异常的出现,可以将 @Autowired 的 required 属性设置为 false。