第二章 装配Bean
- 声明bean
- 构造器注入和Setter方法注入
- 装配bean
- 控制bean的创建和销毁
2.1 Spring 配置的可选方案
- 在XML中进行显示配置.
- 在Java中进行显示配置.
- 隐式的bean发现机制和自动装配.
2.2 自动化装配bean
spring从两个角度来实现自动化装配:
- 组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean.
- 自动装配(autowiring):Spring自动满足bean之间的依赖.
2.2.1 创建可被发现的bean :
- @ComponentScan 注解启用了组件扫描.
- @Component 猪脚表明该类会作为组件类.
2.2.2 为组件扫描的bean命名:
- @Component("lonelyHearsClub");
- @Named("lonelyHearsClub");
Spring支持将@Named作为@Component注解的替代方案.两者之间有一些细微的差异,但是在大多数场景中,他们是可以互相替换的.建议用@Component.
2.2.3 设置组件扫描的基础包
@ComponentScan 默认规则,他会以配置类所在的包作为基础包(base package)来扫描组件.
- @ComponentScan("com")
- @ComponentScan(backPackages="com,")
- @ComponentScan(basePackageClasses={CDPlayer.class,DVDPlayer.class})
可以在包中创建一个用来进行扫描的空标记接口(marker interface).通过标记接口的方式,你依然能够保持对重构又好的接口引用,但是可以避免引用任何实际的应用程序的代码.
2.2.4 通过为bean添加注解实现自动装配
- 使用@Autowired注解地方
- 构造器上添加@Autowired注解,表明当Spring创建CDPlayer bean的时候,会通过这个构造器来进行实例化并且会传入一个可设置给CompactDisc类型的bean.(?如果传入一个接口类型,当spring启动,多个实现类具体传入哪个呢?)
- Setter方法上面添加@Autowired注解,当这个bean初始化时候,Spring会自动注入.(结论,当在方法上使用@Autowired方法时,Spring会自动注入)
- @Autowired (required=false) , 默认 required为true,当应用上下文创建的时候,Spring会抛出一个异常.设置为false,Spring会尝试执行自动装配,但是囚没有匹配的bean的话,Spring将会让这个bean处于未装配的状态.
但是当required设置为false时,如果没有null检查会出现空指针异常.
- 如果有多个bean都能满足依赖关系的话,Spring将会抛出一个异常,表明没有明确指定要选择哪个bean进行自动装配. ( 自动装配的歧义性 ).
- @Inject 和 @Autowired 可以互相替换.
2.3 通过Java代码装配bean
2.3.2 声明简单的bean
@Bean(name = "lonelyHeartsClubBand")
public CompactDisc sgtPeppers(){
return new SgtPeppers();
}
复制代码
2.3.3 借助JavaConfig实现注入
- 方式一 :
@Bean
public CDPlayer cdPlayer(){
return new CDPlayer(sgtPeppers());
}
复制代码
看起来 , CompactDisc是通过调用sgtPeppers()得到的,但情况并非完全如此.因为sgtPeppers()方法上添加了@Bean注解,Spring将会拦截所有对它的调用,并确保直接返回该方法所创建的bean,而不是每次都对其进行实际的调用.
- 方式二 :
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc){
return new CDPlayer(compactDisc);
}
复制代码