Spring装配Bean ---通过Java代码装配Bean

看Spring实战(第4版)笔记

Spring装配Bean。 Bean有两种不依赖其他Bean的简单Bean 如CompactDisc Bean 和 依赖其他Bean的Bean 如CDPlayer Bean。其实就是讲如何声明这两种Bean 让Spring知道 我们想把这两种对象注册成Spring的Bean 让Spring来管理。

Spring装配Bean方式的选择:

     推荐使用自动化装配的方式来装配Bean,但是有些场景不能使用@Component和@Autowired注解来实现自动装配,比如:你想要将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加@Component和@Autowired注解的,因此就不能使用自动化装配的方案了。这时候就必须采用显示配置的方式。显示配置包括Java配置和xml配置。

     显示配置中JavaConfig是更好的方案,因为它更强大,类型安全并且对重构友好。

     JavaConfig就是Java代码,但是和其它的Java代码又有所区别。JavaConfig是配置代码,它不应该包含任何业务逻辑,也不应该侵入到业务逻辑的代码之中。通常将JavaConfig放到单独的包中,使它和应用程序的逻辑分离开来。

1.通过JavaConfig声明Bean  ---声明不依赖其他Bean的简单Bean

     JavaConfig通过@Configuration注解 和 @Bean注解实现。 @Configuration注解的类是可以用来替代xml文件。以前配置bean时,都是写在applicationContext.xml文件中的。有了这个注解后,我们就可以编写一个类在其上面加上该注解。即配置类。 在配置类中可以在方法上加@Bean注解定义其中的Bean

     JavaConfig 等价于 代替 xml文件 定义bean

     JavaConfig 等价于 自动装配Bean 里的自动扫描(@Controller @Service @Repository @Component 注解 和 @ComponentScan )

     在配置类里 声明一个public方法 并且用@Bean注解。该方法的方法名就是Bean Id, 方法体 创建所需类型的实例并返回@Bean注解 告诉告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean

     给bean指定Id 可以使用@Bean注解的name属性 @Bean(name="compactDiscId") 

     代码示例如下 

public class CompactDisc {
	
	private String artist = "dream_s";
	private String music = "litter bird";
	public void play() {
	   System.out.println("JAVA CONFIG   playing  "+ music + "  by  "+ artist);
	}
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CDPlayerConfig {
	@Bean
	public CompactDisc compactDisc() {
		return new CompactDisc();
	}	
}

2.通过JavaConfig实现注入----通过JavaConfig声明 依赖其它Bean 的Bean ---在配置类中声明Bean时实现注入

     就是代替 自动装配 里的@Autowired 注解 

     比如CDPlayer Bean 需要依赖CompactDisc Bean。那么在配置类中声明 CDPlayer Bean 有两种写法

      在JavaConfig中装配bean的最简单方式就是引用创建CompactDisc bean的方法,或者请求一个CompactDisc作为参数.

      推荐第二种 这样 它不会要求将CompactDisc Bean声明到同一个配置类之中。 甚至没有要CompactDisc 的声明方式,它可以是在JavaConfig中声明, 也可以通过组件扫描功能自动发现 或者通过XML来进行配置。

public class CDPlayer {

    //通过构造器 实现DI功能
    private CompactDisc compactDisc;   
	
    public CDPlayer(CompactDisc compactDisc) {
		this.compactDisc = compactDisc;
	}
	
    public  void  play() {
		compactDisc.play();		
	}
}

     在配置类中 声明CDPlayer Bean 代码如下 

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CDPlayerConfig {
	@Bean
	public CompactDisc compactDisc() {
		return new CompactDisc();
	}
	//引用创建bean的方法
	@Bean
	public CDPlayer cdPlayer(){
		return new CDPlayer(compactDisc());
	}
 	//或者 cdPlayer()方法请求一个CompactDisc作为参数
	@Bean
	public CDPlayer cdPlayer(CompactDisc compactDisc){
		return new CDPlayer(compactDisc);
	}
	
}

3.测试 JavaConfig 装配Bean

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();
	}
}

控制台输入 两行 :JAVA CONFIG   playing  litter bird  by  dream_s

posted on 2019-04-12 16:51  dreamstar  阅读(74)  评论(0编辑  收藏  举报