Spring装配Bean ---自动化装配bean
看Spring实战(第4版)笔记
Spring 的bean配置方式有三种:注解配置(自动配置),JavaConfig配置,xml配置。 其中JavaConfig可以完全替代xml配置。
推荐使用注解配置 和 JavaConfig相结合的方式。 选择注解方式的原则是:
全局配置使用JavaConfig,比如(数据库相关配置,MVC相关配置)(JavaConfig通过@Configuration,@Bean实现的)
业务Bean的配置使用注解配置(@Controller @Service @Repository @Component ,@Autowired,@ComponentScan)
这里通过一个 可以运行的maven java 程序 来测试。前提 在eclipse中 new 一个 maven java project,并且加载spring依赖
Spring 通过 组件扫描 和 自动装配 实现自动化装配Bean
组件扫描:Spring 会自动发现应用上下文中所创建的bean
自动装配:Spring 自动满足bean之间的依赖
1.组件扫描----创建可以被Spring发现的Bean(声明不依赖其他Bean的简单Bean)
使用 @Controller @Service @Repository @Component 注解 这4个注解:告诉spring这个类会作为组件类,要为这个类创建bean
用注解来向Spring容器注册Bean。注解和在XML文件中配置是等价的,只是,注解这种方式更方便明显。如果一个类用注解标识
了,就表示把这个类交给Spring容器来管理
import org.springframework.stereotype.Component;
@Component //声明不依赖其他Bean的简单Bean
public class CompactDisc {
private String artist = "dream_s";
private String music = "litter bird";
public void play() {
System.out.println("playing "+ music + " by "+ artist);
}
}
2.自动装配 ----使用@Autowired实现 自动装配(通过自动装配声明 依赖其它Bean 的Bean)
自动装配就是让Spring在创建Bean时 自动满足bean依赖的一种方法,在满足依赖时,会在Spring应用上下文中寻找 匹配该Bean需求的其它bean。
比如CDPlayer Bean 需要依赖CompactDisc Bean。那么CDPlayer Bean声明时就可以 使用@Autowired注解自动注入CompactDisc Bean
声明的Bean还是 使用 @Controller @Service @Repository @Component 注解 这4个注解:告诉spring这个类会作为组件类,要为这个类创建bean
为被依赖的Bean CompactDisc bean 添加 @Autowired 注解来实现自动装配, 在spring 创建 CDPlayer 这bean 时,会满足 它对CompactDisc的依赖, 把CompactDisc对象 注入.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component //通过自动装配声明 依赖其它Bean 的Bean
public class CDPlayer {
@Autowired //自动装配 被依赖的Bean
private CompactDisc compactDisc;
public void play() {
compactDisc.play();
}
}
3.开启组件扫描-----启动组件自动扫描----基于java配置
启动Spring的组件扫描有两种方式:基于Java配置启动组件扫描 和 基于xml配置启动组件扫描
在类上加注解 @Configuration 说明 这是个配置类 = xml 配置文件
使用@ComponentScan 自动扫描包名下 所有使用 @Controller @Service @Repository @Component 注解 的类,并注册为bean
在 基于java配置的 配置类上 使用注解 @ComponentScan = 基于xml 配置的 配置文件中使用<context:component-scan>
@Configuration
@ComponentScan
public class CDPlayerConfig {
}
基于xml 配置 启动组件扫描 省略
4.测试 自动化装配Bean
使用 Spring的SpringJUnit4ClassRunner,以便在测试开始的时候自动创建Spring的应用上下文
@ContextConfiguration 会告诉它需要在CDPlayerConfig中加载配置
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)
@ContextConfiguration(classes=CDPlayerConfig.class)
public class CDPlayerTest {
@Autowired
private CDPlayer cdPlayer; //依赖其它Bean 的Bean
@Autowired
private CompactDisc compactDisc; //不依赖其他Bean的简单Bean
@Test
public void testPlayer(){
compactDisc.play();
cdPlayer.play();
}
}
运行testPlayer方法 会在控制台 输出两行:playing litter bird by dream_s
4.为组件扫描的bean 命名
Spring 应用上下文中的bean都会有唯一的id。如果没有明确为bean指定id。spring 会 默认 bean id = 类名第一个字母小写。
使用@Component("")为组件 定义id,但是 这个id 并不影响自动装配时的写法
所以 bean id 到底啥时候用到了?
@Component("newBeanId")
public class SgtPepperss{
private String artist = "dream_s";
private String music = "litter bird";
public void play() {
System.out.println("play "+ music + " by "+ artist);
}
}
5.设置组件扫描的基础包
组件扫描的基础包默认 :配置类 所在的包,也就是组件扫描 会 扫描基础包和它的子包。
如果需要 指定一个或多个 基础包,可以 通过 basePackages 属性 来 设置基础包,它可以接收一个string数组
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
//@ComponentScan("basePackage")
//@ComponentScan(basePackages= "basePackage")
@ComponentScan(basePackages={"basePackage1","basePackage2"})
public class CDPlayerConfig {
}
如果需要 指定一个或多个 基础包,也可以 通过basePackageClasses属性 设置类所在的包为基础包 ,它可以接收一个类的数组
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackageClasses={SgtPepperss.class})
public class CDPlayerConfig {
}
Spring 怎么创建应用上下文 ,创建应用上下文时 会创建bean 和 注入 bean之间的依赖关系