创建应用对象之间协作关系的行为通常称为装配(wiring),这就是依赖注入(DI)的本质。
Spring提供了三种主要的装配机制: 1. 在xml中进行显式配置。 2. 在java中进行显式配置。 3. 隐式的bean发现机制和自动装配。
bean的装配:就是bean对象的创建,属性赋值,把创建好的对象赋值给程序的过程。
自动化装置bean
spring 从两个角度来实现自动化装置.1:组件扫描(component scanning),spring会自动发现应用上下文中所创建的应用。
2. 自动装配(autowiring) ,spring自动满足bean之间的依赖
如下:创建一个接口
package soundsystem;
public interface CompactDisk {
void play();
}
创建一个实现类实现上面的接口. @Component表明这个类是一个组件类,并告知spring要为这个类创建bean。(@Named可以替换@Component,但在大多数场景中,它们可以是互相替换)
package soundsystem;
import org.springframework.stereotype.Component;
@Component
public class SgtPeppers implements CompactDisk{
private String title = "Sgt. Pepper's Lonely Hearts Club Band";
private String artist = "The Beatles";
@Override
public void play() {
// TODO Auto-generated method stub
System.out.println("Playing "+title+" by "+artist);
}
}
组件扫描默认不开启。我们需要配置下spring,让spring寻找带有@Component注解的类。 @ComponentScan默认扫描与配置类相同的包,也就是会扫描这个包以及这个包下的所有子包,查找带有@Compenent注解的类。(使用XML也可以启用自动扫描)
package soundsystem;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan // 启动组件扫描,按照默认规则,以配置类所在的包作为基础包来扫描组件。
public class CDPlayerConfig {
}
spring应用上下文中所有的bean都会给定一个id,通过@Component("lonelyHeartsClub"),就把lonelyHeartsClub作为bean的id了。
在构造器上添加了@Autowired注解, 这表明当Spring创建CDPlayerbean的时候, 会通过
这个构造器来进行实例化并且会传入一个可设置给CompactDisc类型的bean。
package soundsystem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class CDPlayer implements MediaPlayer{
private CompactDisk cd;
@Autowired
public CDPlayer(CompactDisk cd){
= cd;
}
@Override
public void play() {
cd.play();
}
}
@Autowired注解不仅能够用在构造器上,还能够用在属性的Setter方法上,或者其他任何方法上。(@Inject和@Autowired之间有着一些细微的差别, 但是在大多数场景下, 它们都是可以互相替换的
)
注解@ContextConfiguration会告诉spring需要在CDPlayerConfig中加载配置。
















