上一篇博客中,咱们讲解了使用组件扫描和自动装配实现自动化装配bean,这也是最好的使用方式。java
可是某些场景下,咱们可能没法使用自动装配的功能,此时就不得不显式的配置bean。git
好比咱们引用了一个第三方类库,须要将类库中的某个类装配到项目中,咱们不可能在该类上添加@Component注解,所以没法使用自动装配的功能。github
Spring中有如下两种方式显式配置bean:spring
本篇博客主要讲解经过JavaConfig配置bean的实现方法,经过xml配置bean的实现方法后续再单独写一篇博客。微信
咱们还使用上一篇博客中的例子,不过代码会作适当修改。app
package chapter02.javaconfig;
public interface CompactDisc {
void play();
}
复制代码
package chapter02.javaconfig;
public class SgtPeppers implements CompactDisc {
@Override
public void play() {
String title = "Sgt.Pepper's Lonely Hearts Club Band";
String artists = "The Beatles";
System.out.println("Playing " + title + " By " + artists);
}
}
复制代码
package chapter02.javaconfig;
public class CDPlayer {
private CompactDisc compactDisc;
public CDPlayer(CompactDisc compactDisc) {
this.compactDisc = compactDisc;
}
public void play() {
compactDisc.play();
}
}
复制代码
注意:和上一篇博客相比,咱们去掉了SgtPeppers类和CDPlayer类上的@Component注解。ide
package chapter02.javaconfig;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CDPlayerConfig {
}
复制代码
在JavaConfig中,咱们使用@Bean注解来声明bean,以下所示:测试
package chapter02.javaconfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CDPlayerConfig {
@Bean
public CompactDisc sgtPeppers() {
return new SgtPeppers();
}
}
复制代码
默认生成的bean ID和方法名一致,即sgtPeppers,不过咱们能够自定义:this
@Bean(name = "lonelyHeartsClub")
public CompactDisc sgtPeppers() {
return new SgtPeppers();
}
复制代码
上面声明的bean比较简单,没有任何其它依赖,可是有些复杂的bean,好比CDPlayer,它依赖于CompactDisc,那咱们该如何声明呢?spa
简单的一种方式是,直接使用刚刚定义的sgtPeppers()方法做为CDPlayer构造器的参数依赖:
@Bean
public CDPlayer cdPlayer() {
return new CDPlayer(sgtPeppers());
}
复制代码
不过更建议的是如下方式,将依赖项做为bean方法的参数,Spring会自动匹配到参数依赖项:
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc) {
return new CDPlayer(compactDisc);
}
复制代码
此时配置类的代码为:
package chapter02.javaconfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CDPlayerConfig {
@Bean
//@Bean(name = "lonelyHeartsClub")
public CompactDisc sgtPeppers() {
return new SgtPeppers();
}
/*@Bean public CDPlayer cdPlayer() { return new CDPlayer(sgtPeppers()); }*/
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc) {
return new CDPlayer(compactDisc);
}
}
复制代码
新建测试类CDPlayerTest:
package chapter02.javaconfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class CDPlayerTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(CDPlayerConfig.class);
CompactDisc compactDisc = (SgtPeppers) applicationContext.getBean("sgtPeppers");
compactDisc.play();
CDPlayer cdPlayer = applicationContext.getBean(CDPlayer.class);
cdPlayer.play();
}
}
复制代码
运行结果:
从运行结果能够看出,bean装配成功。
源码地址:github.com/zwwhnly/spr…,欢迎下载。
Craig Walls 《Spring实战(第4版)》
最后,欢迎关注个人微信公众号:「申城异乡人」,全部博客会同步更新。