在Spring中装配Bean是学习Spring的第一步,也是理解依赖注入(DI)很好的例子。装配(wiring)指的是创建应用对象之间协作关系的行为,对于Java开发者而言,装配并不是一个陌生的概念,只是我们没有意识到自己所作的事就是装配,举个栗子:
# 1. 已知有一个工具接口
public interface Tool {
void use();
}
# 2. 这个接口有一个实现类
public class FirstTool implements Tool {
public void use() {
}
}
# 3. 这个实现类被Persion这个类所使用
public class Persion {
private FirstTool firstTool;
public Persion() {
this.firstTool = new FirstTool(); #这就是装配
}
void work(){
firstTool.use();
}
}
一、文章目录结构
- 自动化装配Bean
- JavaConfig装配Bean
在开始之前我们先约定一下所有的代码均在chapter2
这个包下
二、自动化装配Bean
Spring中通过组件扫描(Component Scanning)和自动装配(Autowiring)来实现自动化装配,完成自动化装配Bean我们只需要
简单的几步即可
2.1 定义及扫描Bean
将一个普通的类定义为可以被发现的Bean只需要一个注解@Component
即可,如上面的Persion类:
@Component
public class Persion {
private FirstTool firstTool;
public Persion() {
this.firstTool = new FirstTool(); #这就是装配
}
void work(){
firstTool.use();
}
}
如上即完成了将Persion定义为了一个可被发现的Bean,但是Spring中默认是没有开启Bean的扫描的,因此还需要我们开启Bean的扫描,开启扫面在Spring中有两种方式可以实现:
1. 可以单独定义一个配置类:
@Configuration
@ComponentScan
public class BeanScanningConfig {
}
在这个配置类中我们使用了@ComponentScan
这个注解开启Bean的扫描,注意:默认只扫描这个配置类所在包及其子包里的所有Bean,@Configuration
即将这个类声明为一个配置类
2. 在xml文件中开启扫描:
在xml文件中我们通过元素
即可开启Bean的扫描,并通过该元素的base-package
属性指定了要扫描的包
2.2 自动装配Bean
Spring中可以自动帮我们完成文章开头实例的例子中的firstTool
对象的注入,也只需要一个注解即可完成:
@Component
public class Persion {
@Autowired
private FirstTool firstTool;
void work(){
firstTool.use();
}
}
只需要使用@Autowired
这个注解标识我们需要注入的对象,Spring就会帮我们完成这个对象的注入
2.3 测试一下自动装配Bean
我们可以测试一下上面的自动装配是否真的生效了:
import chapter2.impl.FirstTool;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class) //用于加载Spring的应用上下文,Bean的创建依赖应用上下文
@ContextConfiguration(classes = BeanScanningConfig.class) // 要到BeanScanningConfig中去加载配置
public class AutowiringTest {
@Autowired
private FirstTool firstTool;
@Test
public void work(){
assert null != firstTool;
}
}
三、JavaConfig装配Bean
尽管自动装配能够帮我们完成大多数的Bean的装配,但是如果我们要使用其他第三方库的时候,自动装配就行不通了,因为我们无法给第三方库去添加Spring的注解,此时只能通过手动装配Bean的方式了,手动装配Bean又有两种方式,我们先看看优先推荐使用的JavaConfig装配Bean方式:
3.1 定义一个配置类专门来定义Bean
import org.springframework.context.annotation.Configuration;
@Configuration
public class BeansConfig {
}
我们通过@Configuration
这个注解来声明这是个配置类
3.2 定义Bean
import chapter2.impl.FirstTool;
import chapter2.impl.Persion;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BeansConfig {
@Bean
public FirstTool firstTool(){
return new FirstTool();
}
}
我们通过@Bean
这个注解来声明一个Bean