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之间的依赖关系

posted on 2018-03-31 19:18  dreamstar  阅读(61)  评论(0编辑  收藏  举报