装配:创建应用组件(对象)之间的协作的行为,这也是Spring依赖注入(DI)的本质。
Spring提供了三种装配机制:
- 隐式的自动装配bean;
- 通过java代码装配bean(显示);
- 通XML中装配bean;
本文只介绍第一种装配方式:自动装配。
在**《Spring实战》**这本书中将自动装配分为了两个部分(组件扫描和自动装配):
组件扫描:Spring会自动发现应用上下文(Spring容器)中所创建的bean;
自动装配:Spring自动满足bean之间的依赖。
我个人对Spring自动装配的简单理解就是通过 注解 的方式来实现Spring自动装配的配置,从而在编译或运行时实现bean的自动装配。因此有几个注解在这里必需掌握。
- @Component(“cdPlayer”) : 表明该类作为组件类,并告知Spring需要为这个类创建bean,而且会分配一个默认的ID,ID名与类名相同首字母小写。也可以自己设置ID,例如cdPlayer。
- @ComponentScan (“soundsystem”):该注解用于配置类的配置,默认会扫描与配置类相同的包中带有@Component注解的类,并在Spring中自动为其创建一个bean。
可以通过 (“soundsystem”)、basePackages属性或basePackagesClasses属性来设置扫描的(一个或多个)基础包。 - @Configuration:用于定义配置类,被注解的类内部包含有一个或多个被**@Bean**注解的方法。
- @Bean:该注解一般用于修饰方法,告诉Spring这个方法返回一个对象,该对象注册为Spring应用上下文中的bean。(该注解在通过java程序配置bean的方式中会用到 )
- @ContextConfiguration(classes=CDPlayerConfiger.class):告诉spring需要在哪个配置类中加载配置;其中classes属性为配置类的(.class),复数形式表示可以有多个配置类。
- @Autowired:可以对成员变量、方法和构造函数进行标注,根据类型来完成自动装配注入的工作。
以上就是在Spring自动装配的学习中遇到的注解。
下面是自动装配的代码:
jar包
其中beans、context、core、expression为4个核心包和一个 logging的jar包,这5个包构成最小的基本单元。用这5个包可以编写一个Spring的hello world的程序;
其余的jar包也是本次测试所必须的。
1、创建bean:
//接口
public interface CompactDisc {
void play();
}
import org.springframework.stereotype.Component;
@Component("firstSpring")
//表明该类作为组件类,并告知Spring为这个类创建bean, ID:firstSpring
public class SgtPeppers implements CompactDisc {
private String title = "Sgt.Pepper's Lonely Hearts Club Band";
private String artist = "The Beatles";
@Override
public void play() {
System.out.println("Playing "+title+" by "+artist);
}
}
2、配置类
@Configuration
@ComponentScan ("soundsystem")
// 该注解能够在spring中启用组建的组件扫描,默认会扫描与配置类相同的包
/ /自动装配,类中可以没有代码。
public class CDPlayerConfiger {
}
3、自动装配
@Component("cdPlayer") //该类也应设置为组件类,以便测试时将bean注入到测试代码中
public class CDPlayer {
private CompactDisc cd;
@Autowired
//该注解表明Spring创建CDPlayer bean的时候,会通过构造器来实例化,并传入一个CompactDisc类型的bean
public CDPlayer(CompactDisc cd){
this.cd = cd;
}
public void play() {
cd.play();
}
}
4、验证
运行两个@Test方法 ,成功则表明自动装配成功。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfiger.class)
public class CDPlayerTest {
@Rule
public final StandardOutputStreamLog log = new StandardOutputStreamLog();
@Autowired // 自动将 CompactDisc 类型的bean对象注入
private CompactDisc cd;
@Autowired // 自动将 CDPlayer 类型的bean对象注入
private CDPlayer player;
@Test // 测试 属性cd是否为null
//不为null则Spring能够发现CompactDisc类,并自动在上下文中将其创建为bean并注入到测试代码中
public void cdShouldNotBeNull(){
assertNotNull(cd);
}
@Test
public void play(){
player.play();
assertEquals("Playing Sgt.Pepper's Lonely Hearts Club Band" +
" by The Beatles\r\n",log.getLog());
}
}
5、在main函数中调用
public class Main {
public static void main(String args[]){
//1、创建Spring的IOC容器的上下文对象
// 这里传入的参数为配置文件的class 文件
ApplicationContext acx = new AnnotationConfigApplicationContext(CDPlayerConfiger.class);
//2、从IOC的容器中获取Bean的实例
CDPlayer cdPlayer = (CDPlayer) acx.getBean("cdPlayer");
cdPlayer.play();
}
}