SpringBoot 之自动装配简单使用

news2024/11/17 11:31:27

什么是自动装配?

Spring Boot 自动装配是指 Spring Boot 应用程序在启动时,框架会自动根据应用程序的配置来创建和连接各种对象之间的依赖关系。这意味着,在应用程序中使用的对象可以通过声明它们的依赖关系来自动创建,而不需要人为地创建这些对象。

Spring Boot 自动装配使用依赖注入(DI)技术来实现自动装配。在依赖注入中,对象之间的依赖关系通过将依赖项注入到客户端中来建立。 Spring Boot 自动装配使用配置文件来声明对象之间的依赖关系,然后在运行时自动创建并连接这些对象。

使用 Spring Boot 自动装配可以简化应用程序开发流程,并使应用程序更易于维护和扩展。它还可以帮助减少代码量,并使应用程序更易于测试。之前要用一个功能还要使用各种的 @EnableXxx 注解,现在完全不需要,统一使用 @EnableAutoConfiguration 即可。但是就必须遵守规范,才能达到想要的效果。

下面就通过自定义一个缓存功能模块,然后通过自动装配装配到 Spring 容器中供使用。

代码演示

新建一个普通 Maven 工程(推荐普通 Maven 工程,SpringBoot 工程导入 Jar 包过多),总体项目结构如下:

在这里插入图片描述

然后就可以在这个工程中开始自定义功能模块开发了。

1、引入 maven 依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>cache-test</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.22</version>
        </dependency>
    </dependencies>

</project>

2、在 resources 下新建文件和文件夹 META-INF/spring.factories

其中 spring.factories 文件配置如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.gwm.MyCacheAutoConfiguration

注意文件夹和文件名称不能写错也不能修改就是固定住的,以为 Spring 源码中就是这样写死的。然后 spring.factories 中的内容 key 也是固定这样写的,因为 SpringBoot 中默认寻找的 key 就是 @EnableAutoConfiguration 注解的全路径名,所以要想被自动扫描到就乖乖遵守规范。

对于 spring.factories 配置的 value 值就是你要被 Spring 扫描装载的功能配置类。注意也是全路径包名。下面就会介绍到。

3、自定义功能入口类 MyCacheAutoConfiguration

一般功能模块的入口类相当于个大管家,管理大家出生,组装大家之间的关系(DI),各个元素通过 @Bean 注解完成装载,MyRedisCacheTemplate 类就是该功能模块中的核心成员。

@Configuration
public class MyCacheAutoConfiguration {

    @Bean
    public MyRedisCacheTemplate redisCacheTemplate() {
        return new MyRedisCacheTemplate();
    }
}

public class MyRedisCacheTemplate {
    private Map<String, Object> map = new ConcurrentHashMap<>();

    public void put(String key, Object t) {
        map.put(key, t);
    }

    public boolean delete(String key) {
        map.remove(key);
        return true;
    }

    public Object get(String key) {
       return map.get(key);
    }
}

现在依赖、配置、代码都已经完成!现在要将这个模块打包导出并放入到共享仓库供给大家使用。

4、打包该功能模块提供给大家使用,因为大家都是用 maven 所以最好是打包下形成一个 maven 坐标,别人使用起来贼方便

常用的两种方式:

1)、手动打包

mvn install:install-file -Dfile=cache-test-1.0-SNAPSHOT.jar -DgroupId=org.example -DartifactId=cache-test -Dversion=1.0-SNAPSHOT -Dpackaging=jar
   <dependency>
    	<groupId>org.example</groupId>
    	<artifactId>cache-test</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

2)、idea 打包

先点击 clean、然后 compile、完成之后直接 install 即可。然后提示 BUILD SUCCESS 就是成功打包完成。

在这里插入图片描述

5、在其他项目中导入上述功能组件,其实就是引入 maven 坐标即可

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud2022</artifactId>
        <groupId>com.gwm.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-alibaba-nacos-order9211</artifactId>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!--导入功能模块然后通过 @Autowire 就可以使用啦-->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>cache-test</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

6、@Autowired、或者 @Resource 使用此功能模块

通过 DI 注解 @Autowired、或者 @Resource 可以获取到 MyRedisCacheTemplate 对象,然后就可以开始使用了!

@SpringBootApplication
public class NacosOrderMain9211 {

    @Autowired
    private MyRedisCacheTemplate myRedisCacheTemplate;

    public static void main(String[] args) {
        SpringApplication.run(NacosOrderMain9211.class, args);
    }
}

okay,现在就完成了自定义功能模块的自动装配,我们就配了点配置文件,写了点相关的代码,其实额外的事情没干,这个功能导入 jar 包就直接可以使用了,再也不用像以前还要写 @EanbleXxx 这样的注解,省事不容易忘记。

总结

其实归根结底还是 Spring 的 SpringFactoriesLoader 工厂加载机制 + @Import(DeferredImportSelector) 实现的,之前说配置文件必须写死 META-INF/spring.factories 规范也就是 Spring 的 SpringFactoriesLoader 规范。
上升到 SpringBoot 就完美利用这两点功能实现了自动装配。然后 SpringBoot 将 @EnableXxx 各式各类注解统一
命名成 @EnableAutoConfiguration 简单明了!这也就是为什么 spring.factories 文件中的 key 必须要写死 @EnableAutoConfiguration 注解的全路径名!

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

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

相关文章

Linux中wait()函数

编程过程中&#xff0c;有时需要让一个进程等待另一个进程&#xff0c;最常见的是父进程等待自己的子进程&#xff0c;或者父进程回收自己的子进程资源包括僵尸进程。这里简单介绍一下系统调用函数&#xff1a;wait() 函数原型是#include <sys/types.h>#include <wai…

GPT学习路线分享

初代GPT-3展示了三个重要能力&#xff1a; 语言生成&#xff1a;遵循提示词&#xff08;prompt&#xff09;&#xff0c;然后生成补全提示词的句子。这也是今天人类与语言模型最普遍的交互方式。 上下文学习 (in-context learning): 遵循给定任务的几个示例&#xff0c;然后为…

深入浅出详解进制转换

1.进制转换 1.十进制转其他进制 1.整数转换(短除法) 以十进制数520为例&#xff0c;分别转换为二进制、八进制、十六进制&#xff0c;转换过程如下&#xff1a; 短除法&#xff1a;转进制除以几&#xff0c;余数倒过来为结果 2.小数转换 例如&#xff1a;转换为2进制&#…

Java | 详解创建Web项目、配置Tomcat服务器、实现登录效果

本Demo为本人自学&#xff0c;部分技术已不是前沿技术&#xff0c;望谅解。 目录 一、相关工具及技术 1、相关工具 2、相关技术 3、相关 jar 包 二、IDEA 创建 web 项目 1、创建空项目 2、classes目录和lib目录配置 3、tomcat 服务器配置 三、MySQL 配置 1、登录 mysql 2、创…

Leetcode - 485. 最大连续 1 的个数

与其后悔与抱怨&#xff0c;不如从现在改变 485. 最大连续 1 的个数 - Easy 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解释&#xff1a;开头的两位和最后的三位都是连续…

原油期货在哪里交易?美原油期货和布伦特原油期货选择哪个交易更好?

石油是与人类社会及经济息息相关的能源&#xff0c;从工业生产、交通运输&#xff0c;以至制造塑胶产品、化妆品及衣服纤维等&#xff0c;无孔不入地渗透我们的日常生活与工商业活动。石油经开采后&#xff0c;未经加工的状态通称为原油&#xff0c;既是不可或缺的能源&#xf…

新茶饮 200+ 门店优化库存成本,需要几个数据分析师?

小 L 是一家茶饮门店的店长&#xff0c;她所在的新茶饮企业已经在全国布局了超过 200 家实体门店。小 L 每周除了整理 Excel 数据向区域总监汇报外&#xff0c;还要抽时间站到柜台前&#xff0c;完成总部要求的“在前线做决策”。虽然忙碌&#xff0c;但还能 Hold 得住&#xf…

云图联动创宇智脑,打造高价值威胁情报赋能的威胁处置闭环与攻击溯源

网络对抗日趋激烈&#xff0c;《关基保护要求》提出更高检测防御要求&#xff0c;高级威胁检测面对需求升级&#xff0c;知道创宇推出创宇云图与创宇威胁情报网关、创宇智脑威胁情报平台联防联控方案&#xff0c;打破单个网络安全产品的孤岛&#xff0c;充分发挥产品联动方案的…

数据结构(2)—算法

&#xff08;1&#xff09;小白建议学习青岛大学王卓老师的数据结构视频&#xff0c;或者购买程杰老师的大话数据结构。 &#xff08;2&#xff09;邀请加入嵌入式社区&#xff0c;您可以在上面发布问题&#xff0c;博客链接&#xff0c;公众号分享&#xff0c;行业消息&#x…

【SpringMVC】数据格式化+数据验证

目录 一、前言 二、目录结构 三、数据格式化 四、数据验证 五、数据格式化、验证梳理图 六、数据格式化、验证梳理图 相关文章 【SpringMVC】入门篇&#xff1a;带你了解SpringMVC的执行流程【SpringMVC】入门篇&#xff1a;带你了解SpringMVC的执行流程 【SpringMVC】使用篇&a…

ref的使用方法 ,组件通信父传子,组件通信子传父,组件分离模块化, v-model 传值的3种方式

原生获取一个节点&#xff1a;document.getElementById() vue方式操作dom节点&#xff1a;ref 通过给元素设定ref属性在vue实例中获取这个元素: <input type"text" ref"input" placeholder"请输入内容"> 组件挂载后(mounted)才能访问…

【重要】有三AI技术专栏作者邀请,5大权益助力共同成长

知识分享平台众多&#xff0c;我们有三AI公众号是其中一个&#xff0c;在过去的3年里&#xff0c;我们已经写了700多篇&#xff0c;超过200万字的技术文&#xff0c;其中一些专栏作者的贡献功不可没。我们公众号只做原创内容&#xff0c;因为我并不希望平台成为一个靠复制转载内…

通过运维编排实现自动化智能运维与故障自愈

自动化帮助用户消除重复性任务&#xff0c;从而降低运营成本、提高效率并提高团队生产力。但是&#xff0c;将自动化引入复杂的 IT 环境还需要编排。编排是指一次性自动执行多项任务&#xff0c;涉及到计算机系统、中间件和服务的自动布置、协调和管理&#xff0c;利用自动执行…

10个最频繁使用的聚类算法 Python 实现(附完整代码)

大家好&#xff0c;聚类或聚类分析是无监督学习问题。它通常被用作数据分析技术&#xff0c;用于发现数据中的有趣模式&#xff0c;例如基于其行为的客户群。 有许多聚类算法可供选择&#xff0c;对于所有情况&#xff0c;没有单一的最佳聚类算法。相反&#xff0c;最好探索一…

46. 批量规范化

训练深层神经网络是十分困难的&#xff0c;特别是在较短的时间内使他们收敛更加棘手。 本节将介绍批量规范化&#xff08;batch normalization&#xff09;,这是一种流行且有效的技术&#xff0c;可持续加速深层网络的收敛速度。 再结合在 将介绍的残差块&#xff0c;批量规范…

盘点 | 基于小程序语法的跨端开发平台

最近&#xff0c;微信于2022年12月18日悄悄的推出了一款名叫“Donut”的开发平台。根据开发文档的产品介绍来看&#xff0c;该平台的核心是多端框架&#xff0c;支持使用小程序进行代码编写&#xff0c;并进行多端编译&#xff0c;从而实现多端开发。 目前Donut开发平台已经开…

Android 音视频入门/进阶教程

后续的音视频文章&#xff0c;都会在这里更新 作为安卓开发仔&#xff0c;对音视频这块&#xff0c;一直是比较感兴趣的&#xff0c;所以&#xff0c;本着学习和记录的态度&#xff0c;我也把我所学的知识记录起来&#xff0c;希望对想音视频感兴趣的小伙伴有所帮忙。 一. 基础…

SpringBoot maven 项目 JDBC 连接多源数据库

此方法支持 mysql&#xff0c;oracle&#xff0c;postgre&#xff0c;sqlserver等等 基本逻辑&#xff1a;1. 加载驱动; 2. 通过DriverManager传入数据库地址&#xff0c;用户名&#xff0c;密码&#xff0c;获取本地数据库连接 1. pom文件下添加依赖 <dependency><…

Android 多线程下载以及断点续传

多线程下载 在日常开发中&#xff0c;我们不可避免的会接到类似这样的需求&#xff0c;下载一个比较大的素材文件或者安装包文件&#xff0c;以此实现APP的自动更新&#xff0c;APP内的素材替换等。由于一般此类文件都比较大&#xff0c;一般会在50M以上&#xff0c;如果我们不…

高效好用的开发工具箱——猿如意

目录 前言&#xff1a; 1.我常用的功能介绍 2.主要功能chatGPT测评 3.我的使用体验和改进建议 前言&#xff1a; 猿如意是一款帮助开发的效率工具&#xff0c;集成了许多有用的工具和文档教程。帮助开发者提升开发效率&#xff0c;帮你从“问题”找到“答案”。尤其是12月…