创建应用对象之间协作关系的行为通常称为装配(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){
		this.cd = cd;
	}
	
	@Override
	public void play() {
		cd.play();
	}
}

@Autowired注解不仅能够用在构造器上,还能够用在属性的Setter方法上,或者其他任何方法上。(@Inject和@Autowired之间有着一些细微的差别, 但是在大多数场景下, 它们都是可以互相替换的
)

 

 注解@ContextConfiguration会告诉spring需要在CDPlayerConfig中加载配置。