java 装配_Spring 通过Java代码装配bean

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中声明。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生物智能与AI——关乎创造、关乎理解(下)

无监督学习,迁移学习和工程设计 AI系统与人类学习之间的另一个主要差异在于AI系统所需的大量标记数据才可以达到人类级别的性能。例如,最近的语音识别系统在11940小时的语音训练后才能对齐转录。如果我们每天大声地听到另一个人类阅读文本两个小时&…

如何利用tcpdump抓包?

文章目录一、基本使用1. 安装tcpdump2. 使用方法二、案例实战2.1. 企业案例背景2.2. 抓包实战三、网卡接口获取3.1. centos7.x使用3.2. centos6.x使用一、基本使用 1. 安装tcpdump yum install tcpdump -y2. 使用方法 tcpdump -i 网卡接口 协议 -n 注:协议可以接…

Gartner 发布2019年超融合魔力象限:新增深信服一员!

近日,国际权威研究分析机构Gartner公布了2019全球《超融合基础设施魔力象限》报告。 报告显示国内仅有三家云计算厂商进入2019超融合基础设施魔力象限,分别是深信服、华为、华云数据。其中深信服超融合(sangfor aCloud)凭借技术优…

java对象组合_java并发编程(三): 对象的组合

对象的组合:如何将现有的线程安全组件,组合成我们想要的更大规模的程序。设计线程安全的类:设计线程安全类的三个要素:1.找出构成对象状态的所有变量;2.找出约束状态变量的不变性条件;3.建立对象状态的并发…

深度学习目标检测系列:一文弄懂YOLO算法|附Python源码

在之前的文章中,介绍了计算机视觉领域中目标检测的相关方法——RCNN系列算法原理,以及Faster RCNN的实现。这些算法面临的一个问题,不是端到端的模型,几个构件拼凑在一起组成整个检测系统,操作起来比较复杂&#xff0c…

Keepalived时主备负载均衡器都有VIP的问题:VRRP协议问题

文章目录一、企业案例背景二、异常现象三、分析结论解决思路3.1. 分析结论3.2. 解决思路四、SElinux 处理4.1. 查看SElinux的状态:4.2. 关闭SElinux五、Firewalld防火墙配置5.1. 开启vrrp 协议5.2. 重新启动防火墙5.3. 查看启动日志5.4. 虚拟ip验证5.5. 停止master节…

数据不足,如何进行迁移学习?

现在,人工智能的发展处于跳跃式阶段,我们也对AI在大型数据集的应用进展感到吃惊。更重要的是,那些我们没有跟踪的数十亿张照片或餐厅的评论并没有被遗漏掉:迁移学习技术让收集数据变得更加“容易”。另外,得益于PyTorc…

MongoDB+阿里云 最新数据库独家上线!

近日,开源数据库厂商MongoDB与阿里云在北京达成战略合作,作为合作的第一步,最新版MongoDB 4.2数据库产品正式上线阿里云平台。 目前阿里云成为全球唯一可提供最新版MongoDB服务的云厂商,双方合作打通了企业在云上使用最新版开源数…

一天超2000次,阿里如何打响音视频超时空战役?

在阿里,音视频会议已经成为跨地区沟通、开会以及招聘的首选方式。据悉,目前阿里巴巴的办公网络与音视频会议已经覆盖全球33个国家和地区,其中,音视频会议在过去3个月平均每天召开超过2000余场。在使用如此频繁、覆盖面如此之广的音…

java pppoe_PPPoE拨号流程

PPP会话的建立,需要两端的设备都发送LCP数据包来配置和测试数据通信链路。用户主机与接入集中器根据在发现阶段所协商的PPP会话连接参数进行PPP会话。一旦PPPoE会话开始,PPP数据就可以以任何其他的PPP封装形式发送。所有的以太网帧都是单播的。PPPoE会话…

Flutter路由管理代码这么长长长长长,阿里工程师怎么高效解决?(实用)

背景: 在flutter的业务开发过程中,flutter侧会逐渐丰富自己的路由管理。一个轻量的路由管理本质上是页面标识(或页面路径)与页面实例的映射。本文基于dart注解提供了一个轻量路由管理方案。 不论是在native与flutter的混合工程&…

正则表达式简单语法及常用正则表达式

基本符号: ^ 表示匹配字符串的开始位置 (例外 用在中括号中[ ] 时,可以理解为取反,表示不匹配括号中字符串) $ 表示匹配字符串的结束位置 * 表示匹配 零次到多次表示匹配 一次到多次 (至少有一次) ? 表示匹配零次或一次 . 表示匹配单个字符 | 表示为或者,…

用PyTorch创建一个图像分类器?So easy!(Part 1)

经过了几个月的学习和实践,我完成了优达学城网站上《Python Programming with Python Nanodegree》课程的学习,该课程的终极项目就是使用Pytorch为102种不同类型的花创建一个图像分类器。 在完成这个项目的过程中,我和其他学员一样&#xff…

正则表达式中的开头和结尾

^  表示匹配 以 后一个字符开头有两个作用1)匹配以指定字符开头  ^[a-zA-Z_]\w  必须以小写字母、大写字母、下划线开头2)用在[]内部用于取反  [^hz]    匹配不含有hz的字符$  表示匹配以 前一个字符结尾\d$  以数字结尾

阿里上市,四大洲8个国家的十位代表敲锣;全球首款支持5G双卡双待的芯片发布;撕裂者3990X:桌面史上第一次64核128线程……...

关注并标星星CSDN云计算速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周两次,打卡即read更快、更全了解泛云圈精彩newsgo go govivo X30新细节曝光:搭载潜望式超远摄支…

支付宝客户端架构分析:自动化日志收集及分析

小蚂蚁说: 《支付宝客户端架构解析》系列将从支付宝客户端的架构设计方案入手,细分拆解客户端在“容器化框架设计”、“网络优化”、“性能启动优化”、“自动化日志收集”、“RPC 组件设计”、“移动应用监控、诊断、定位”等具体实现,带领…

java 快速生成有残午餐_写出优质Java代码的4个技巧

译者注:如果现在要求对你写的Java代码进行优化,那你会怎么做呢?作者在本文介绍了可以提高系统性能以及代码可读性的四种方法,如果你对此感兴趣,就让我们一起来看看吧。以下为译文。本文我们将介绍一些有助于解决常见问…

在Kubernetes上运行区块链服务(BaaS)

本文是在2018年11月15日由Linux基金会CNCF主办的KubeCon & CloudNativeCon China 2018大会的“Running Blockchain as a Service (BaaS) on Kubernetes”演讲内容基础上整理而成,从技术上介绍了阿里云如何将基于区块链Hyperledger Fabric的BaaS和容器集群技术Ku…

RabbitMQ 镜像集群之同步策略_专栏讲解

文章目录一、 基础知识汲取1.1. 镜像集群简述1.2. 策略参数说明1.3. 策略案例二、HA mode 同步方式2.1. 参数说明2.2. 案例2.3. 命令终端形式2.4. MQ管控台设置2.5. 队列同步2.5. 优缺点三、Ha async mode 同步方式(推荐使用)3.1. 参数说明3.2. 案例3.3.…

bug要改一天?

大家应该都听过下面的一个段子~女生:亲爱的,我来亲戚了男生:多喝热水......女生:我好像要感冒了,亲爱的~男生:多喝热水......女生:我现在好难受哦,快撑不下去了男生:多喝…