SpringBoot学习(7)(Bean对象注册)(自定义组合注解)

news2024/11/15 18:01:12

目录

一、引言

二、案例学习

(一)@Bean

(二)@Import

三、补充

(1)关于Java中collection.toArray(new String[0])解释

(2)组合注解


一、引言

  • 上次学习了解到,springboot可以默认自动的扫描启动类所在的包及其子包
  • 现在查看还有哪些注解会被扫描到并解析,从而把对应的Bean对象注册到Ioc容器中
  • Bean对象的注册,在spring中学习过。可以添加下面这些注解,从而把该类对象注册到Ioc容器中。其中@Component注解是一个通用的。而其下面的@Controller、@Service、@Repository这三个注解是一个衍生注解,它们经常controller层、service层、dao层的类中,从而让代码的可读性更高

  • 如果要把第三方的jar包中的Bean对象注入到Ioc容器中,上面的注解还能继续使用吗??答案不能,因为如下在导入的外部库里面找到一个jar包,然后进去找到一个类,想直接在上面注入对象,发现无法编辑(只读)。所有如果是第三方jar包的类的对应的对象,并不能在类上添加上面四个注解,然后把bean对象注入进去。

  • 也就是如果要注册的Bean对象来自于第三方,或者这个类不是我们自定义的,是无法使用@Component及其衍生注解声明Bean的
  • spring提供了两个注解来解决上面的问题

二、案例学习

(一)@Bean

(1)安装一个自己写的jar包到本地仓库,然后在工程里添加其依赖



目标是把这个两个类的对应的Bean对象给它注入到Ioc容器中

(2)现在开始尝试操作

  • jar包中的两个实体类,Country、Province

  • SpringApplication.run(...)方法会把spring初始化好的容器返回回来。这里可以用一个ApplicationContext contextSpringApplication.run(...),来接收一下容器。然后调用这个容器的方法getBean()去获取对象。

(3)但是一般不用上面的写法。

  • 因为启动类里一般只做启动活,不要去做注册的事情。而是一般采用在配置类中集中注册。可以定义一个配置类,叫做CommonConfig。并且要将它变成配置类,就要添加一个注解@Configuration

  • 我们可以在配置类中声明一模一样的方法。在类上方添加注解@Configuration在方法上添加一个注解@Bean注意这个配置类,要放到启动类所在的包或子包中,才能被扫描到

(4)再次尝试操作

  • 新建包和类

  • 在配置类添加注解和书写方法

  • 注入对象的默认的名字是方法名(也可以通过注解@Bean("....")括号里指定的自定义名称)。这里在启动类中获取Ioc容器已经注册好的两个类的Bean对象。控制台全部都拿到了对应的对象并打印输出。

  • 如果方法的内部需要使用到Ioc容器中已经存在的Bean对象,那么只需要在方法上声明即可,spring会自动的注入

(二)@Import

(1)我们可以在启动类添加注解@Import,导入其它类。spring会自动的把指定的类对应的Bean对象注入到Ioc容器中。且这个指定的类,可以是任意的类(普通类、配置类)。

(2)实际开发中,一般导入以下的两种类最多

(3)开始尝试操作

  • 将之前启动类所在包的配置类移动到其它的包下,这样就会扫描不到。然后是不是之前在启动类就拿不到注册的Bean对象。这时就要用@Import注解。


  • 当我们这样写了spring就会将CommonConfig配置类中已经注册好的Bean对象放到Ioc容器中
  • 如果配置类很多,可以采用花括号里一个一个填(数组)解决


但是这样如果很长很多,不好看、不优雅。就会提到另外一个东西。

  • springboot会自动调用selectImports()方法,得到里面的数组,然后把这些对应的类的Bean对象自动的注入到Ioc容器中



  • 接着在启动类里就注解@Import不引入配置类了,而是引入实现类

  • 其次在实现类里面的类名都是一般在配置文件中读取出来。(为了让程序变得更加灵活)需要哪些对象需要注入,就把这个对应的全类名写到配置文件中去就可以了。


  • 去resources目录下创建配置文件


(这个文件中每一个类对应写一行就可以了)也就是有多个Bean对象需要注入,就换行写就行了。

  • 现在就可以去CommonImportSelector实现类读取配置文件里的内容,用List集合接收。要通过类加载器来读取这个配置文件。类名.class.getClassLoader().getResourceAsStream("..."),括号里面写上面的配置文件名:"common.imports"。这个会得到一个输入流,然后给它进行一个封装(BufferedReader)得到一个缓冲字符流br。然后再创建一个变量,记录行数,一行一行的读取。读完之后记得关闭流(close)。会报错,try...catch一下即可(ctrl+alt+t)

  • 最后return返回的就是集合imports里面读取到的数据。集合转换为数组(toArray(new String[0])

  • 最后完成启动工程验证了之后。发现还可以进行一些修改。让下面这个注解变成组合注解,变得更加好看


  • 仿照启动类里面的组合注解的写法(复制粘贴)并介绍一下

第一个代表:当前这个注解可以再类上使用。第二个代表这个注解会保留在运行时间段。



  • 最后回到启动类,再把之前的注解注释掉,书写新的组合注解

三、补充

(1)关于Java中collection.toArray(new String[0])解释
  • String[] x = (String[]) v.toArray(new String[0]); 注意,toArray(new Object[0]) 和 toArray() 在功能上是相同的。 
  • <T> T[] toArray(T[] a),T:泛型。会返回你一个list长度的String 类型的数组,需要一个T[] a,new String[0]相当于开辟了一个长度为0的String[],并且指定了泛型。这样函数的调用是将list转换了一个String的数组。
  • 这里的用new String[0]只是为了指定函数的形参数,最终返回的String[]的长度是由你的list存储内容的长度决定了。new String[0]就是起一个模板的作用,指定了返回数组的类型,0是为了节省空间,因为它只是为了说明返回的类型
  • list.toArray(new String[0]);//转化成String数组
  • list.toArray(new int[0]);//转化成int数组

此解释来源于csdn另外一篇(Java中collection.toArray(new String[0])的语法解释-CSDN博客

(2)组合注解

这种情况经常会在第三方的起步依赖或者源码中看到。

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

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

相关文章

基于机器学习的阿尔兹海默症智能分析预测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 阿尔兹海默症&#xff08;Alzheimers Disease, AD&#xff09;是一种常见的神经退行性疾病&#xff0c;主要影响老年人的认知功能。随着全球人口老龄化的加剧&#xff0c;阿尔兹海默症的患病率逐年…

nodejs 使用kafka案例,node-red配置kafka案例,从安装配置kafka开始

生产者测试&#xff1a; bin/kafka-console-producer.sh --broker-list 1.2.3.4:9092 --topic test-topic消费者测试&#xff1a; bin/kafka-console-consumer.sh --bootstrap-server 1.2.3.4:9092 --topic test-topic --from-beginningconst { Kafka } require(kafkajs)con…

【AIGC数字人】EchoMimic:基于可编辑关键点条件的类人音频驱动肖像动画

GitHub&#xff1a;https://github.com/BadToBest/EchoMimic 论文&#xff1a; https://arxiv.org/pdf/2407.08136 comfyui&#xff1a; https://github.com/smthemex/ComfyUI_EchoMimic 相关工作 Wav2Lip Wav2Lip是一个开创性的工作 &#xff0c;但输出会出现面部模糊或扭…

粒子群算法原理的示例介绍

一&#xff1a;粒子群优化算法的介绍 粒子群优化算法&#xff08;PSO&#xff09;是一种基于群体智能的优化算法&#xff0c;于1995年提出。它受到鸟群狩猎行为的启发&#xff0c;通过模拟鸟群或鱼群的社会行为来进行问题的求解。 基本原理 粒子群算法中&#xff0c;每个解决…

顶刊算法 | Matlab实现鹈鹕算法POA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测,优化前后对比

顶刊算法 | Matlab实现鹈鹕算法POA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测&#xff0c;优化前后对比 目录 顶刊算法 | Matlab实现鹈鹕算法POA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测&#xff0c;优化前后对比预测效果基本介绍…

一种小众且适合发文的智能优化算法应用——三维TSP问题

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 今天给大家介绍一种非常小众的智能优化算法应用&am…

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大&#xff0c;但不同的语言在不同领域都有着自己的优势&#xff0c;为了强强联合&#xff0c;LabVIEW提供了强大的外部程序接口能力&#xff0c;包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等…

2024/9/9 408“回头看”:

B树是什么&#xff1f;有什么作用&#xff1f;B树的插入和删除具体细节是什么&#xff1f;除了B树还有一个是B&#xff0b;树、还是B-树&#xff0c;他们有什么区别&#xff0c;又有什么相同点&#xff1f; b树在王道考研查找这一章&#xff0c;所以他的主要作用就是查找。 在…

MySQL中binary放在判断语句之前有什么作用

为什么要加binary进行判断 ① 因为 mysql中等号比较是不区分大小写的&#xff0c;select aA这个输出结果为1。 ② 在判断语句之前 加上binary可以以区分大小写比较 &#xff0c;因为这样底层会用二进制形式比较&#xff0c;实现精确匹配。 代码比较 忽略大小写比较 select …

Ftrans跨域文件传输方案,数据流动无阻的高效路径

大型集团企业由于其规模庞大、业务广泛且往往将分支机构、办事处分布在多个地域&#xff0c;因此会涉及到跨域文件传输的需求。主要源于以下几个方面&#xff1a; 1.业务协同&#xff1a;集团内部的不同部门或子公司可能位于不同的地理位置&#xff0c;但需要进行紧密的业务协…

【C++】STL学习——priority_queue(了解仿函数)

目录 priority_queue介绍迭代器种类priority_queue实现仿函数仿函数的使用 priority_queue介绍 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆&#xff0c;在堆中可以随时插入元素&#x…

Linux 磁盘管理-RAID磁盘冗余阵列看这一篇就够了

今天给伙伴们分享一下Linux 磁盘管理-RAID磁盘冗余阵列&#xff0c;希望看了有所收获。 我是公众号「想吃西红柿」「云原生运维实战派」作者&#xff0c;对云原生运维感兴趣&#xff0c;也保持时刻学习&#xff0c;后续会分享工作中用到的运维技术&#xff0c;在运维的路上得到…

机器学习深度学习

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 深度学习概述 1.1 定义与历史背景 深度学习作为机器学习领域的一个重要分支,其核心在于构建由多层(深层)的人工神经网络组成的计算模型,这些模型能够学习数据的多层次抽象表示。深度学习的…

东大成贤资源库-数据挖掘技术与应用 实验一:数据预处理_熟悉数据挖掘数据预处理流程。 基于给定的数据集(csv)文件,完成下列数据处理。 1

【实验内容】 程序清单 import pandas as pd import numpy as np# 读入文件&#xff0c;存放在字典data里 data pd.read_csv("D:\\Desktop\\data1.csv")# 填入Id列空缺的值 for i in range(1,len(data)):if pd.isnull(data[Id][i]):data[Id][i]i1# Id属性列去重&a…

虚拟机的安装步骤

我这里使用的是VMware 1.下载centos7 2.配置 跟这图来就好 开启虚拟机 第一个页面直接回车,忘了截图 等待安装 选择语言,看自己 点击完成 点击继续安装 设置账号密码 然后等待就行 安装完成之后会有一个重启,点击(又忘了截图) 完成许可和网络 最后就可以了

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代&#xff0c;文本到语音&#xff08;Text-to-Speech, TTS&#xff09;技术已成为人机交互的关键桥梁&#xff0c;无论是为视障人士提供辅助阅读&#xff0c;还是为智能助手注入声音的灵…

数据权限的设计与实现系列7——前端筛选器组件Everright-filter用法说明

背景 官方给了全局性的介绍和示例&#xff0c;不过到了具体使用环节&#xff0c;介绍就不是那么清楚明确了&#xff0c;往往是直接放 demo&#xff0c;需要去推测和揣测&#xff0c;然后动手验证。去百度了下&#xff0c;也没找到现成的对该组件的使用说明&#xff0c;得以开荒…

Unreal Fest 2024 虚幻引擎影视动画制作的普遍问题

一 毛发缓存数据巨大的问题&#xff08;及5个解决方案&#xff09; 在引擎里模拟毛发&#xff0c;并且把它缓存下来&#xff0c;我们就不需要从外部导入了&#xff0c;所以我们要解决的问题就是怎么样在引擎里自由地控制毛发 1.物理场控制 延申 [技术分享]《UE中的世界物理场…

迭代器模式iterator

学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 &#xff08;列表、 栈和树等&#xff09; 的情况下遍历集合中所有的元素

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍&#xff11;、W25Q64简介&am…