Spring提供了三中配置的可选方案(推荐使用顺序3->2->1)
1在XML中进行显示配置
2在Java中进行显示配置
3隐式的bean发现机制和自动装备机智
一、自动化装配bean
Spring从两个角度来实现自动化装配
1组件扫描:Spring会自动发现应用上下文中所创建的bean
2自动装配:Spring会自动满足bean之间的依赖
今天在测试的时候使用了SpringJUnit4ClassRunner和@ContextConfiguration
SpringJUnit4ClassRunner的用处是在测试开始的时候自动创建Spring的应用上下文。
@ContextConfiguration会告诉需要再哪里加载配置
重点
@Component("lonelyHeartClue")注解。表明该类会被作为组件类,并告知Spring要为这个类创建bean。括号中是给bean命名
@ComponentScan。在Spring中启用组件扫描。默认会扫描与配置类相同的包。(需要java代码来配置开启)
XML配置中与之对应的是<context:component-scan base-package="***">元素
设置基础扫描包
@ComponentScan("soundsyatem")
@ComponentScan(basePackages="soundsystem")
@ComponentScan(basePackages={"soundsystem", "video"})
@ComponentScan(basePackageClasses={CDPlayer.class, DVDPlayer.class}) 这两个类所在的包会作为扫描的基础包
@Autowired。自动装配
可以用在构造器上
@Autowired
public CDPlayer(CompactDisc cd) { this.cd = cd; }
用在setter方法上
@Autowired
public void setCompactDisc(CompactDisc cd){
this.cd = cd;
}
可以用在其他任何方法上
二、通过java代码装配
bean通常会将javaConfig放到其他的包中,使它与其他的用用程序逻辑分开。
@Configuration @ComponentScan public class CDPlayerConfig {
@Bean public CompactDisc sgtPeppers(){ return new SgtPeppers(); }
@Bean
public CDPlayer cdPlayer(){
return new CDPlayer(sgtPeppers);
}
}
@Configuration表明这个类是一个配置类
@Bean会告诉Spring这个方法将会返回一个对象,该对象要注册为spring应用上下文中的bean,默认情况下bean的id与方法 名一样,也可以@Bean(name="*****")来指定一个名字
new CDPlayer(sgtPeppers);因为sgtPeppers添加了@Bean,Spring将会拦截所有对它的调用,并确保该方法所创建的bean。
@Bean public MediaPlayer cdPlayer(CompactDisc compactDisc){ return new CDPlayer(compactDisc); }这种方法是最佳的,因为它不会要求CompactDisc声明到同一个类中,甚至可以通过组件扫描功能自动发现或者通过XML来今夕配置。