前面介绍完了组件扫描和自动装配,这里再来看一下装配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;
}
}