上一篇博客中, 我们讲解了使用组件扫描和自动装配实现自动化装配 bean, 这也是最好的使用方式.
但是某些场景下, 我们可能无法使用自动装配的功能, 此时就不得不显式的配置 bean.
比如我们引用了一个第三方类库, 需要将类库中的某个类装配到项目中, 我们不可能在该类上添加 @Component 注解, 因此无法使用自动装配的功能.
Spring 中有以下两种方式显式配置 bean:
通过 JavaConfig 配置 bean
通过 xml 配置 bean
本篇博客主要讲解下通过 JavaConfig 配置 bean 的实现方法, 通过 xml 配置 bean 的实现方法后续再单独写一篇博客.
我们还使用上一篇博客中的例子, 不过代码会做适当修改.
- package soundsystem.javaconfig;
- public interface CompactDisc {
- void play();
- }
- package soundsystem.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 soundsystem.javaconfig;
- public class CDPlayer {
- private CompactDisc compactDisc;
- public CDPlayer(CompactDisc compactDisc) {
- this.compactDisc = compactDisc;
- }
- public void play() {
- compactDisc.play();
- }
- }
注意: 和上一篇博客相比, 我们去掉了 SgtPeppers 类和 CDPlayer 类上的 @Component 注解.**
1. 创建配置类
- package soundsystem.javaconfig;
- import org.springframework.context.annotation.Configuration;
- @Configuration
- public class CDPlayerConfig {
- }
2. 声明 bean
在 JavaConfig 中, 我们使用 @Bean 注解来声明 bean, 如下所示:
- package soundsystem.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, 不过我们可以自定义:
- @Bean(name = "lonelyHeartsClub")
- public CompactDisc sgtPeppers() {
- return new SgtPeppers();
- }
上面声明的 bean 比较简单, 没有任何其它依赖, 但是有些复杂的 bean, 比如 CDPlayer, 它依赖于 CompactDisc, 那我们该如何声明呢?
简单的一种方式是, 直接使用刚刚定义的 sgtPeppers() 方法作为 CDPlayer 构造器的参数依赖:
- @Bean
- public CDPlayer cdPlayer() {
- return new CDPlayer(sgtPeppers());
- }
不过更建议的是以下方式, 将依赖项作为 bean 方法的参数, Spring 会自动匹配到参数依赖项:
- @Bean
- public CDPlayer cdPlayer(CompactDisc compactDisc) {
- return new CDPlayer(compactDisc);
- }
此时配置类的代码为:
- package soundsystem.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);
- }
- }
3. 验证 bean 是否装配成功
新建测试类 CDPlayerTest:
- package soundsystem.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 装配成功.
4. 源码地址
https://github.com/zwwhnly/SpringStudyDemo.git , 欢迎大家下载, 有问题可以多多交流.
来源: https://www.cnblogs.com/zwwhnly/p/10484501.html