【Spring 核心】装配bean(二) JavaConfig装配

前面介绍完了组件扫描和自动装配,这里再来看一下装配bean的另一种方式JavaConfig。

包路径:

src/main/java

com.bonc-|--config--|--CDPlayerConfig.java (配置类)

                   |--pojo---|--CompactDisc.java      (接口CompactDisc)

                                   |--SgtPeppers.java         (类SgtPeppers实现了CompactDisc)

                                   |--MediaPlayer.java         (接口 MediaPlayer)

                                   |--CDPlayer.java              (类CDPlayer实现了MediaPlayer)

接口 CompactDisc.java

package com.bonc.pojo;

public interface CompactDisc {
	void  play();
}
实现类 SgtPeppers.java

package com.bonc.pojo;

public class SgtPeppers implements CompactDisc {
	
	private String title = "Sgt. Pepper's Lonely Hearts Club Band";
	private String artist = "The Beatles";
	public void play() {
			System.out.println("Playing "+title+"by"+artist);
	}

}
接口 MediaPlayer.java

package com.bonc.pojo;

public interface MediaPlayer {
	void play();
}

实现类CDPlayer.java

package com.bonc.pojo;

public class CDPlayer implements MediaPlayer{

	private CompactDisc cd;
	
	public CDPlayer(){
		super();
	}
	
	public CDPlayer(CompactDisc cd){
		this.cd = cd;
	}
	public void play() {
		cd.play();
	}

	public void setCd(CompactDisc cd) {
		this.cd = cd;
	}

	
}

配置类:(核心内容)

package com.bonc.config;

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

import com.bonc.pojo.CDPlayer;
import com.bonc.pojo.CompactDisc;
import com.bonc.pojo.SgtPeppers;
/*
 * 背景信息:
 *	很多场景下,推荐组件扫描、自动装配。但有些第三方组件是不方便装配的,因此需要显示配置,
 *	显示配置有两种JavaConfig或XML。
 *	进行显示配置,JavaConfig是更好的方案,因为它更加强大、类型安全、易于重构。
 *
 * JavaConfig:
 *	1.@Configuration表明这是一个配置类,该类应该包含Spring上下文如何创建bean的细节。
 *	2.尽管我们可以同时使用组件扫描和显示配置,但在这里我们更加关注显示配置,
 *	3.因此我们将CDPlayerConfig的@ComponentScan注解移除掉了。
 *	4.JavaConfig是配置代码,意味着它不应该包含任何业务逻辑,也不应该侵入到业务代码中。
 *	5.通常会将JavaConfig放到单独的包中,使它与其他应用程序逻辑分离开。
 * 
 * */

@Configuration
public class CDPlayerConfig {

	/*
	 * 方法说明:
	 * @Bean注解告诉Spring这个方法将会返回一个CompactDisc类型的对象,该对象要注册为Spring应用上下文中的bean
	 * 方法体包含了最终产生bean实例的逻辑。
	 * ID:
	 * 默认情况下,bean的ID与带有@Bean注解的方法名是一样的,在本实例中,bean的默认是sgtPeppers
	 * 如果要自定义bean的ID,可以设name属性。
	 * 
	 * 
	 * */
	@Bean
	public CompactDisc sgtPeppers(){
		return new SgtPeppers();
	}
	/*
	 * JavaConfig中装配bean的最简单方式就是引用创建bean的方法
	 * 方法说明:
	 * cdPlayer没有使用默认的构造器创建实例,而是调用了sgtPeppers()
	 * Spring会拦截sgtPeppers()的调用,来确保sgtPeppers的单例
	 * 每次调用sgtPeppers都返回同一个实例
	 * 
	 * */
	@Bean
	public CDPlayer cdPlayer(){
		return new CDPlayer(sgtPeppers());
	}
	
	/*
	 * 更为简单的方式,cdPlayer请求一个CompactDisc作为参数,
	 * 通过这种方式引用其他的bean是最佳的选择,因为它不会要求sgtPeppers()方法在同一个配置类中
	 * 甚至没有要求CompactDisc要在JavaConfig中声明
	 * 实际上它可以通过组件扫描或XML配置进行配置
	 * 你可以将配置分散到多个配置类、XML文件、以及自动扫描和装配bean中,只要功能健全即可。
	 * */
	@Bean
	public CDPlayer cdPlayer(CompactDisc cd){
		return new CDPlayer(cd);
	}
	
	/*
	 * 还可以通过其他风格实现DI功能,不限于构造器和setter方法
	 * */
	@Bean CDPlayer cdPlayer2(CompactDisc compactDisc){
		CDPlayer cdPlayer = new CDPlayer();
		cdPlayer.setCd(compactDisc);
		return cdPlayer;
	}
	
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值