Sping装配之——自动装配

Sping从两个角度来实现自动化装配:

  • 组件扫描(component scaning):spring会自动发现应用上下文中所创建的bean;
  • 自动装配(autowiring):spring自动满足bean之间的依赖。

为了阐述组件扫描和装配,我们需要创建几个bean,他们代表一个音响系统中的组件。首先创建一个CD类,Spring会发现它并将其创建为一个bean。然后,会创建一个CDPlayer类,让Spring发现它,并将CD bean注入进来。下面进行代码演示:

package soundsystem;

//作为接口 定义了CD播放器对一盘CD所能进行的操作
public interface CD {
    void play();
}
View Code
 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 }
View Code

不过,组件扫描默认是 不启用 的。我们还需要显示配置以下Sping,从而命令他去寻找带有 @Component 注解的类,并为其创建bean。

创建类CDPlayerConfig:

 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 }
View Code

类CDPlayerConfig是通过JAVA代码定义了Spring的装配规则。后续的博客中会详细介绍该中配置的使用方式。现在,我们只需要观察以下CDPlayerConfig类并没有显示地声明任何bean,只不过是用了@ComponentScan注解,这个注解能够在Spring中启用组件扫描,默认会扫描与该类相同的包下的文件。寻找带有@Component注解的类,并为其创建一个bean.

最后,测试组件扫描能够发现CD。我们创建一个简单的JUnit测试:

 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 }
View Code

测试结果:

正在播放:十一月的肖邦,由JayZhou演唱

如果想为组件扫描的bean命名,可以使用该形式:@Component("yourname")

如果想设置组件扫描的基础包:@ComponentScan(basePackages = "packagename"),  如果是多个包,采用数组形式

原文地址:https://www.cnblogs.com/ustc-anmin/p/10138434.html