java配置类装配bean
在我另一篇文章 Spring bean的装配-自动化装配 中讲述了Spring中自动装配的实现方式,那么本文呢,我会主要讲一下使用java配置类实现显式装配。
我们知道使用自动装配对于开发来说很方便,但是在有的场景却不适合自动装配。比如我要使用第三方的代码,我们不能直接在别人代码上加注解,这时候就需要我们明确的配置Spring。我们可以使用java配置类 和 XML 方式来显式配置bean。本文主要讲java配置类如何装配bean
按照之前的音响系统案例,我们首先创建一个CD接口,以及它的实现类CDImpl,再创建一个CDPlayer类,以及创建一个CDPlayerConfig配置类用于配置bean。
CD接口
package com.abiao._02_Autowiring;
/**
* CD光盘接口
**/
public interface CD {
/** CD播放 */
void play();
}
CD实现类
package com.abiao._02_Autowiring;
/**
* CD接口的实现类
**/
public class CDImpl implements CD {
public void play() {
System.out.println("CD在播放。。。");
}
}
CDPlayer(CD播放器类)
package com.abiao._02_Autowiring;
import org.springframework.beans.factory.annotation.Autowired;
/**
* CD播放器
**/
public class CDPlayer implements Player{
private CD cd;
@Autowired
public CDPlayer(CD cd){
this.cd = cd;
}
public void play() {
cd.play();
}
public CD getCd(){
return cd;
}
}
CD播放器配置类
package com.abiao._02_Autowiring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* CD播放器配置类
**/
@Configuration
public class CDPlayerConfig {
@Bean
public CDPlayer cdPlayer(){
return new CDPlayer(cd());
}
@Bean
public CDPlayer cdPlayer2(){
return new CDPlayer(cd());
}
@Bean
public CD cd(){
return new CDImpl();
}
}
测试装配结果
import com.abiao._02_Autowiring.CD;
import com.abiao._02_Autowiring.CDPlayer;
import com.abiao._02_Autowiring.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;
/**
* CD播放器测试
**/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDPlayerTest {
@Autowired
private CD cd;
@Autowired
private CDPlayer cdPlayer;
@Autowired
private CDPlayer cdPlayer2;
@Test
public void play(){
System.out.println(cd);
System.out.println(cdPlayer.getCd());
System.out.println(cdPlayer2.getCd());
cdPlayer.play();
}
}
结果:
我们能够看到bean的装配已经成功了,但是我们细心一点能够发现前三个CD bean 他们是同一个对象,并没有创建三个不同的bean。这是因为他们在注入CD bean的时候,调用的是一个方法cd()。
表面上看CD bean都是通过调用cd()方法获取的,但情况并非完全如此。因为cd()方法上添加了@Bean注解,Spring会拦截所有对它的调用,确保每次返回正确的bean,并不是每次都对该方法进行实际的调用。
默认情况下,Spring中的bean都是单例的,我们并没有必要每次为CD bean创建相同的实例。那为什么cdPlayer对象不是同一个呢,因为他们在注入bean的时候调用的是两个不同的方法,cdPlayer()和cdPlayer2()。
Java配置类装配bean的细节
- 我们只需要在类上打上@Configuration注解,该类则被定义为一个Java配置类
- 在配置类中提供一个公共可访问的方法,并打上@Bean注解,表示该方法返回的对象将作为bean的实例。
- 原则上我们可以使用任意Java代码来产生bean实例。默认情况下,会将方法名作为bean的名称,我们当然也可以在@Bean注解后加name属性对bean名称进行重命名。
每天进步一点点,越慢才能越快!