1. 背景

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

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

2. 代码 & 解说

接口: CompactDisc.java

packagesoundsystem;public interfaceCompactDisc {voidplay();

}

接口: MediaPlayer.java

packagesoundsystem;public interfaceMediaPlayer {voidplay();

}

SgtPeppers.java

packagesoundsystem;public class SgtPeppers implementsCompactDisc {private String title = "Sgt. Pepper's Lonely Hearts Club Band";private String artist = "The Beatles";

@Overridepublic voidplay() {

System.out.println("Playing " + title + " by " +artist);

}

}

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

CDPlayer.java

packagesoundsystem;importorg.springframework.beans.factory.annotation.Autowired;public class CDPlayer implementsMediaPlayer {privateCompactDisc cd;

@AutowiredpublicCDPlayer(CompactDisc cd) {this.cd =cd;

}

@Overridepublic voidplay() {

cd.play();

}

}

借助JavaConfig实现注入

CDPlayerConfig.java

packagesoundsystem;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;

@Configurationpublic classCDPlayerConfig {

@BeanpublicCompactDisc compactDisc() {return newSgtPeppers();

}

@BeanpublicCDPlayer cdPlayer(CompactDisc compactDisc) {return newCDPlayer(compactDisc);

}

}

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

测试CDPlayerTest.java

packagesoundsystem;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.test.context.ContextConfiguration;importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(classes=CDPlayerConfig.class)public classCDPlayerTest {

@AutowiredprivateMediaPlayer player;

@Testpublic voidplay() {

player.play();

}

}

3. 深入了解JavaConfig

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

packagesoundsystem;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;

@Configurationpublic classCDPlayerConfig {

@BeanpublicCompactDisc sgtPeppers() {return newSgtPeppers();

}

@BeanpublicCDPlayer cdPlayer() {return newCDPlayer(sgtPeppers());

}

}

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

@BeanpublicCDPlayer() {return newCDPlayer(sgtPeppers());

}

@BeanpublicanotherCDPlayer() {return new CDPlayer(sgtPeppers());

}

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

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

@BeanpublicCompactDisc compactDisc() {return newSgtPeppers();

}

@BeanpublicCDPlayer cdPlayer(CompactDisc compactDisc) {return newCDPlayer(compactDisc);

}

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

java 装配_Spring 通过Java代码装配bean相关推荐

  1. spring java配置_Spring基于java的配置

    我们之前都了解过spring基于xml的配置,我们也可以通过配置类来完成基于xml的配置,我们会在下面以一个例子来讲述一下Spring基于java的配置. 首先第一步准备工作: 1)创建一个Dog类 ...

  2. Spring装配bean的三种方法:自动化装配,java代码装配,XML装配及它们的混合使用

    一.自动化装配 首先,把可能被装配的类声明为组件类,告知spring要为这个类创建bean如: import org.springframework.stereotype.Component;@ Co ...

  3. java 装配_JAVA入门[13]-Spring装配Bean

    一.概要 Sping装配bean主要有三种装配机制: 在XML中进行显式配置. 在Java中进行显式配置. 隐式的bean发现机制和自动装配. 原则: 建议尽可能地使用自动配置的机制,显式配置越少越好 ...

  4. bean的作用域_Spring 框架基础(02):Bean的生命周期,作用域,装配总结

    一.装配方式 Bean的概念:Spring框架管理的应用程序中,由Spring容器负责创建,装配,设置属性,进而管理整个生命周期的对象,称为Bean对象. 1.XML格式装配 Spring最传统的Be ...

  5. spring框架学习(一):Bean的装配方式 ——基于注解的装配、自动装配

    Bean的装配方式 基于注解装配 常用注解: 总结 自动装配 [序言] 在前面的例子中我们就可以看到了使用基于XML方式的缺点了:如果应用中有较多的Bean对象,则会导致xml文件过于臃肿,给后续的维 ...

  6. java jax-rs_在Java EE 7和WildFly中使用Bean验证来验证JAX-RS资源数据

    java jax-rs 我过去已经两次接触过这个主题. 首先,在我的文章< 在Java EE 6中将Bean验证与JAX-RS集成>中 ,描述了甚至在Java EE平台规范中尚未定义之前, ...

  7. 在Java EE 7和WildFly中使用Bean验证来验证JAX-RS资源数据

    我过去已经两次接触过这个主题. 首先,在我的文章< 在Java EE 6中将Bean验证与JAX-RS集成>中 ,介绍了甚至在Java EE平台规范中未定义之前,如何在JBoss AS 7 ...

  8. java cglib map转bean_Java工具集-Bean对象与Map集合相互转换工具

    代码示例 package com.simple.util.bean; import org.springframework.cglib.beans.BeanMap; import java.util. ...

  9. java大嘴鱼游戏代码_Java编写大嘴怪游戏--原创

    第一步:大嘴鱼类 package fish; import java.awt.Color; import java.awt.Graphics; import java.awt.event.Action ...

最新文章

  1. 深入理解MySQL执行过程及执行顺序
  2. mysql语句中事务可靠性_MySql的事务使用与示例详解
  3. 虚拟机centos7 识别不出网卡的解决方案
  4. 关于navicat提权的方法
  5. 牛客 - 四等分的角度(几何)
  6. django language_Python+Django— 入门通关(三)| admin:后台管理界面
  7. [投资习惯对比]投资大师vs失败投资…
  8. ubuntu系统下如何修改host
  9. vue用公共组件页面传值_vuejs几种不同组件(页面)间传值的方式
  10. ubuntu部署django详细教程
  11. DWORD WINAPI
  12. 读取U盘 PID,VID,SN等信息
  13. 2.7——golang数据类型【字符串类型】
  14. 如何用CANSLIM法则选股
  15. 【多元统计分析】一、多元统计分析概述
  16. 算法的时间与空间复杂度(精细+举例)
  17. 爱马仕Hermès手表怎么样?
  18. html中如何引用其外部字体,css引入外部字体
  19. mysql公有库和私有库_带有公有和私有子网的 VPC (NAT) - Amazon Virtual Private Cloud
  20. 曝光“AI已具备人格”的谷歌研究员,被罚带薪休假了

热门文章

  1. Impala-shell 启动异常 - Python版本为3.x 启动脚本为2.x
  2. Quick BI产品核心功能大图(六)开放集成
  3. 如何将一棵LSM-Tree塞进NVM
  4. 中邮智递通过数加和datav将系统和服务迁移到大数据平台
  5. 阿里云TSDB在大数据集群监控中的方案与实战
  6. 张勇:新技术是阿里“五新战略”的引擎
  7. 京信通信:数据智能为生产调试“增效瘦身”
  8. 想要成为数据科学家?知道这11种机器学习算法吗?
  9. 当你和天猫精灵对话时,它在想什么?阿里智能对话技术深度解读
  10. Nutanix,在转型的道路上越走越远 | 人物志