博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring 通过Java代码装配bean
阅读量:7015 次
发布时间:2019-06-28

本文共 3124 字,大约阅读时间需要 10 分钟。

阅读目录

1. 背景

书接上文

尽管在很多场景下通过组件扫描和自动装配实现Spring的自动化扫描配置是更为推荐的方式,但在有些情况下自动化扫描的方案行不通,如想要将第三方库中的组件装配到自己的应用中。在这种情况下必须通过显示 装配的方式。

显示装配有两种可选方案:Java和XML。JavaConfig是更好的方案:更强大、类型安全并对重构友好。因他就是Java代码。

2. 代码 & 解说

接口: CompactDisc.java

package soundsystem;public interface CompactDisc {  void play();}

接口: MediaPlayer.java

package soundsystem;public interface MediaPlayer {  void play();}

 

SgtPeppers.java

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

注:区别与自动转配,这里去掉了@compenent注解

CDPlayer.java

package soundsystem;import org.springframework.beans.factory.annotation.Autowired;public class CDPlayer implements MediaPlayer {  private CompactDisc cd;  @Autowired  public CDPlayer(CompactDisc cd) {    this.cd = cd;  }  @Override  public void play() {    cd.play();  }}

 

借助JavaConfig实现注入

CDPlayerConfig.java

package soundsystem;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class CDPlayerConfig {    @Bean  public CompactDisc compactDisc() {    return new SgtPeppers();  }  @Bean  public CDPlayer cdPlayer(CompactDisc compactDisc) {    return new CDPlayer(compactDisc);  }}

注:区别与自动装配,这里去掉了@ComponentScan注解,而是显式的声明了Bean。@Bean注解告诉了Spring上下文这个方法会将返回一个对象,该对象要注册为Spring应用上下文中的bean,方法体重包含了最终产生bean实例的实现逻辑。

测试CDPlayerTest.java

package soundsystem;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;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes=CDPlayerConfig.class)public class CDPlayerTest {  @Autowired  private MediaPlayer player;  @Test  public void play() {    player.play();  }}

3. 深入了解JavaConfig

别于上面代码中的实现方式,还可以这样配置JavaConfig

package soundsystem;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class CDPlayerConfig {    @Bean  public CompactDisc sgtPeppers() {    return new SgtPeppers();  }  @Bean  public CDPlayer cdPlayer() {    return new CDPlayer(sgtPeppers());  }}

cdPlayer没有使用默认的构造函数,而是调用了CompactDisc对象。看起来是通过调用sgtPeppers()得到的,实际不是这样的。原因是sgtPeppers方法是上添加了@Bean注解,Spring将会拦截所有对它的调用,而是直接返回方法所创建的bean,而不是每次都对其进行实际的调用。以下为证

@Beanpublic CDPlayer() {    return new CDPlayer(sgtPeppers()); }@Beanpublic anotherCDPlayer() {    return new CDPlayer(sgtPeppers()); }

假如每次都调用sgtPeppers()方法,那么每个CDPlayer实例将会有一个特有的SgtPepper实例,但实际上是相同的实例。

相比于前面代码中的声明方式,还是推荐上述代码中的方式,那样更容易理解。如

@Bean  public CompactDisc compactDisc() {    return new SgtPeppers();  }  @Bean  public CDPlayer cdPlayer(CompactDisc compactDisc) {    return new CDPlayer(compactDisc);  }

这种方法不用明确引用@Bean方法也能将CompactDisc注入到CDPlayer的构造器中。这种方式是引用其他bean的最佳方式,它不需要要求将CompactDisc必须在JavaConfig中声明。

本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/6984234.html,如需转载请自行联系原作者

你可能感兴趣的文章
P1019 单词接龙
查看>>
linux下的开源移动图像监测程序--motion编译与配置【转】
查看>>
git的版本回退探索
查看>>
记一次docker问题定位(perf,iostat等性能分析)
查看>>
H3c 配置ssh acl
查看>>
【IntellJ IDEA】idea上 实现了Serializable接口,要自动生成serialVersionUID的方法
查看>>
帮助函数
查看>>
自己动手写Android插件化框架,让老板对你刮目相看
查看>>
[转]Object.keys()和for in的排序问题
查看>>
Dedecms判断当前栏目下是否有子栏目
查看>>
常见的加密和解密算法—AES
查看>>
HTTPS那些事(二)SSL证书(转载)
查看>>
【PIC学习第2例】PIC16F877A LED闪烁
查看>>
Orchard CMS前台页面为什么没有Edit链接?
查看>>
判断URL文件是不是在于在。
查看>>
GNU C中的零长度数组(转载)
查看>>
SQL2005中时,Diagrams的问题
查看>>
[转]软件架构的一致性
查看>>
拨云见日,任重道远 ——第六届云计算大会感悟
查看>>
PID控制器的应用:控制网络爬虫抓取速度
查看>>