Sping从两个角度来实现自动化装配:
- 组件扫描(component scaning):spring会自动发现应用上下文中所创建的bean;
- 自动装配(autowiring):spring自动满足bean之间的依赖。
为了阐述组件扫描和装配,我们需要创建几个bean,他们代表一个音响系统中的组件。首先创建一个CD类,Spring会发现它并将其创建为一个bean。然后,会创建一个CDPlayer类,让Spring发现它,并将CD bean注入进来。下面进行代码演示:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package soundsystem; //作为接口 定义了CD播放器对一盘CD所能进行的操作 public interface CD { void play(); }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package soundsystem; 2 3 import org.springframework.stereotype.Component; 4 5 //这个简单的注解会标明该类为组件类 6 //并告知Spring要为这个类创建bean 7 @Component 8 public class CDTest1 implements CD { 9 10 private String title = "十一月的肖邦"; 11 private String artist = "JayZhou"; 12 13 public void play() { 14 System.out.println("正在播放:" + title + ",由" + artist + "演唱"); 15 } 16 }
不过,组件扫描默认是 不启用 的。我们还需要显示配置以下Sping,从而命令他去寻找带有 @Component 注解的类,并为其创建bean。
创建类CDPlayerConfig:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package soundsystem; 2 3 import org.springframework.context.annotation.ComponentScan; 4 import org.springframework.context.annotation.Configuration; 5 6 @Configuration 7 @ComponentScan 8 public class CDPlayaerConfig { 9 10 }
类CDPlayerConfig是通过JAVA代码定义了Spring的装配规则。后续的博客中会详细介绍该中配置的使用方式。现在,我们只需要观察以下CDPlayerConfig类并没有显示地声明任何bean,只不过是用了@ComponentScan注解,这个注解能够在Spring中启用组件扫描,默认会扫描与该类相同的包下的文件。寻找带有@Component注解的类,并为其创建一个bean.
最后,测试组件扫描能够发现CD。我们创建一个简单的JUnit测试:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package soundsystem; 2 3 import org.junit.Test; 4 import org.junit.runner.RunWith; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.test.context.ContextConfiguration; 7 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 9 //用于在测试开始时自动创建Spring上下文 10 @RunWith(SpringJUnit4ClassRunner.class) 11 //告诉上下文需要在CDPlayerConfig中加载配置 12 @ContextConfiguration(classes = { CDPlayerConfig.class }) 13 public class CDPlayerTest { 14 //自动装配 15 @Autowired 16 private CD cd; 17 18 @Test 19 public void test() { 20 cd.play(); 21 } 22 }
测试结果:
正在播放:十一月的肖邦,由JayZhou演唱
如果想为组件扫描的bean命名,可以使用该形式:@Component("yourname")
如果想设置组件扫描的基础包:@ComponentScan(basePackages = "packagename"), 如果是多个包,采用数组形式