Spring学习笔记之通过Java代码装配Bean

Easter79
• 阅读 264

自建博客地址:https://bytelife.net,欢迎访问! 本文为博客自动同步文章,为了更好的阅读体验,建议您移步至我的博客👇

本文作者: Jeffrey
本文链接: https://bytelife.net/articles/2868.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!


虽然很多场景下可以使用组件扫描和自动装配来实现Spring的自动化配置,但有些时候自动化配置的方案是行不通的,因此需要明确配置Spring。比如你想讲第三方库中的组件装配到你的应用中,在这种情况下,你必须要显式装配。在进行显式配置的时候,有两种方案,Java和XML。

下面介绍通过Java代码显式装配Bean。

一、创建配置类

创建配置类的关键在于@Configuration注解,@Configuration注解表明该类是一个配置类,该类包含了在Spring上下文中如何创建Bean的细节。

package cn.javacodes.spring.configuration;
import org.springframework.context.annotation.Configuration;
/**
 * Created by Eric on 2016/10/16.
 */
@Configuration
public class CDPlayerConfig {
}

二、声明简单的Bean

要在JavaConfig中声明Bean,我们需要写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加@Bean注解。比如下面的代码声明了CompactDisc Bean:

    @Bean
    public CompactDisc transfer(){
        return new Transfer();
    }

@Bean注解会告诉Spring这个方法会返回一个对象,该对象要注册为Spring应用上下文中的bean。方法体中包含了最终产生bean对象的逻辑。

默认情况下,bean的ID于带有@Bean注解方法的名称是一样的。在上面的例子中,bean的名字将会是“transfer”。如果你想为它设置一个不同的名字,可以通过name属性指定它的ID:

    @Bean(name = "transfer-cd")
    public CompactDisc transfer(){
        return new Transfer();
    }

另外,方法中的方法体可以是任何你想创建Bean的逻辑,比如你想在一组CD中随机选取一个CD进行播放也是可以的。

三、借助JavaConfig实现注入

前面声明的CompactDisc Bean是非常简单的,因为它没有任何依赖,那么现在想要声明一个CDPlayer Bean,它依赖于CompactDisc。

(一)引用创建Bean的方法

    @Bean
    public CDPlayer cdPlayer(){
        return new CDPlayer(transfer());
    }

这里同样使用了@Bean注解,并在构造CDPlayer时将CompactDisc作为CDPlayer构造器的参数传入。

注意:这里虽然看起来是通过调用transfer()方法得到CompactDisc,但由于transfer方法使用了@Bean注解,实际上Spring会拦截所有对它的调用,并确保直接返回该方法所创建的Spring上下文中的bean,而不是每次都对其进行实际的调用。

比如说,假设你引入了另一个其他的CDPlayer Bean,它和之前的那个bean完全一样。

    @Bean
    public CDPlayer cdPlayer(){
        return new CDPlayer(transfer());
    }
    @Bean
    public CDPlayer anotherCDPlayer(){
        return new CDPlayer(transfer());
    }

默认情况下,Spring中的bean都是单例的,我们并没有必要为第二个CDPlayer Bean创建完全相同的CompactDisc实例。Spring会拦截对@Bean注解标注方法的调用并确保返回的是Spring创建的Bean。

(二)将依赖作为参数

可以看到通过引用创建Bean的方法来解决这个问题有些让人疑惑,下面这种方式看起来更为容易理解:

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

在这里,cdPlayer()方法请求一个CompactDisc作为参数。当Spring调用cdPlayer()方法创建bean的时候,它会自动装配一个CompactDisc到配置方法中。这样方法体就可以在合适的位置使用它,通过这种方式可以避免明确的调用@Bean方法。

通过这种方式来引用其它Bean是最佳的选择,因为它不要求将依赖声明到同一个配置类当中,甚至它不要求必须要在JavaConfig中声明,实际上它可以通过组件扫描功能来自动发现或者通过XML来进行配置。

本例中使用了CDPlayer的构造器实现了DI(依赖注入),但是完全可以使用其它风格的DI,比如,你可以使用setter的方式进行注入。

--Posted from Rpc

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Easter79 Easter79
2年前
Swift项目兼容Objective
!456.jpg(http://static.oschina.net/uploads/img/201509/13172704_1KcG.jpg"1433497731426906.jpg")本文是投稿文章,作者:一叶(博客(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2F00red
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Easter79 Easter79
2年前
Spring学习笔记之自动化装配Bean
自建博客地址:https://bytelife.net(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fbytelife.net),欢迎访问!本文为博客自动同步文章,为了更好的阅读体验,建议您移步至我的博客👇本文作者:Jeffrey(https://www.oschina
Python进阶者 Python进阶者
2个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k