Springboot细节补充

news2025/1/11 19:58:28

一、Bean是怎么装配的?

1、bean扫描

在之前的ssm中,spring要么用标签的形式来扫描包,要么使用注解@ComponentScan来扫描

但是在Springboot中,启动类上默认有一个注解@SpringBootApplication,里面就包含了@ComponentScan

注意,springboot默认扫描启动类所在的包及其子包。

也就是说,如果你给启动类也单独放进了一个目录或是把启动类放进了别的包下,那么程序就无法正常运行

但如果你非要给启动类创建一个单独的目录存放,那么就把@ComponentScan单独拿出来。

@ComponentScan(basePackages = "指定包")

但是尽量别这么做

2、bean注册

学习spring的时候就提到过

问:如果我将第三方的jar包(不是自定义的)注入到ioc容器中,那么这些注解还可以使用吗?

答:

        不能,spring提供了两个注解来解决这个问题

        @Bean

        @Import

@Bean

使用@Bean需要在启动类中注册

但是不建议使用这种方式,启动类就让他起到一个启动入口就行了,最好别给他添加太多功能

如果要注册第三方bean,建议在配置类中集中注册

@Confiugration是为了标识是一个配置类,注意要放在启动类的同包或子包下才能使用

问:return回去的这个对象的名称是什么?

答:

        默认方法名是bean对象的名称,在@Bean注解中修改

问:如果方法内部要使用ioc中已经存在的bean对象怎么办?

答:

@Import

我们先写一个配置类,里面用@Bean注册几个bean

在上面说过,配置类注意要放在启动类的同包或子包下才能使用,如果并不想放在同包下,那么就需要使用@Import引入了

在启动类上添加@Import注解其底层是一个数组列表,所以如果有多个配置类的话用{}括起来就行了

不过我们更多还是使用ImportSelector接口实现

写一个接口实现类,然后将一开始写的配置类放进去。不过类太多这样书写也不方便,我们在实际开发中有更清晰的设计,就是将这些配置类统一放在一个配置文件中。resources是管理配置文件的目录,将这些配置类的名称放进去        

public class CommonImportSelector implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        //读取配置文件的内容
        List<String> imports = new ArrayList<>();
        InputStream is = CommonImportSelector.class.getClassLoader().
                getResourceAsStream("common.imports");
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String line = null;
        try{
            while((line = br.readLine()) != null){
                imports.add(line);
            }
        }catch (IOException e){
            throw new RuntimeException(e);
        }finally {
            if (br != null){
                try {
                    br.close();
                }catch (IOException e){
                    throw new RuntimeException(e);
                }
            }
        }

        return imports.toArray(new String[0]);
    }
}

然后在启动类上@Import的就不是配置类.class了,而是ImportSelector的实现类.class

3、合并注解

上面的例子中,启动类上会有很多个注解,这样看起来很繁琐,不美观。我们想更有逼格一点。

我们之前就说过,启动类的注解@SpringBootApplication就是多个注解组合到一起的,那么我们也可以手动将多个注解组合到一起

Ctrl + 鼠标左键点击@SpringBootApplication注解查看底层

其中最重要的是上最上面的两个注解

        @Target:表示当前注解可以在类上使用

        @Retention:表示当前注解可以在运行时保存

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import({CommonImportSelector.class})
public @interface EnableCommonConfig {
    
}

最终的启动类如下 


二、注册条件

大部分情况下,我们最好别直接将数据写在java代码中,而是写在配置文件中方便修改。但是这样就又有了问题

数据的使用我们在上一篇博客中已经学过了使用@Value来获取配置文件中的数据。但是当数据不存在的时候就会报错,导致程序停止运行,这是我们在开发中所不希望看到的。因此springboot提供了设置注册生效的注解@Conditional。

不过注解本体使用起来较为麻烦,所以我们最多的还是使用他的几个子类

注解说明
@ConditionalOnProperty配置文件中存在对应属性,才声明该bean
@ConditionalOnMissingBean当不存在当前类型的bean时,才声明该bean
@ConditionalOnClass当前环境存在指定的这个类时,才声明该bean

@ConditionalOnPropetry( prefix = "配置文件中的要使用的数据的前缀" , name = {"数据1","数据n"})

假设现在并没有配置country的信息

那么在我们在进行getbean的时候就会报错,提示这里不存在该对象


三、自动配置原理

遵循约定大约配置的原则,在boot程序启动后,起步依赖中的一些bean对象会自动注入到ioc容器中。

我们之前的步骤并不是完全自动装配,我们除了手动装配bean之外,还需要自己导入到启动类里

先看源码,启动类@SpringBootAutoConfigApplication中组合了@Configuration(说明启动类其实也是一个配置类)、@EnableAutoConfigration

翻源码翻到最后看到一个@ConditionalOnClass,里面一个DispatcherServlet.class。也就是说,若环境中没有DispatcherServlet这个类,那么springboot便不会开启自动装配。而这个类存在于springboot的web起步依赖中,也就是说只有引入springboot的web依赖,我们才可以使用完全自动装配

 springboot自动配置的原理

 

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

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

相关文章

五、L2TPv2 VPN

L2TPv2 VPN 1、L2TPv2概述1.1.目的1.2.特点 2、L2TP原理2.1.基本概念2.2.工作原理2.2.1.协议架构2.2.2.报文结构2.2.3.报文封装2.2.4.报文传输 3、工作过程4、应用场景4.1、远程拨号用户发起L2TP隧道连接4.2、LAC接入拨号请求发起L2TP隧道连接4.3、LAC接入PPPoE用户发起L2TP隧道…

Makefile的简单语法学习

通配符 假如一个目标文件所依赖的依赖文件很多&#xff0c;那样岂不是我们要写很多规则&#xff0c;这显然是不合乎常理的&#xff0c;我们可以使用通配符&#xff0c;来解决这些问题。 我们对上节程序进行修改&#xff0c;代码如下&#xff1a; test : a.o b.ogcc -o test $…

bclinux aarch64 ceph 14.2.10 文件存储 Ceph File System, 需要部署mds: ceph-deploy mds

创建池 [rootceph-0 ~]# ceph osd pool create cephfs_data 64 pool cephfs_data created [rootceph-0 ~]# ceph osd pool create cephfs_metadata 32 pool cephfs_metadata created cephfs_metadata 64 报错 官方说明&#xff1a; 元数据池通常最多可容纳几 GB 的数据。为…

“谐波”分析治理,电能质量在线监测

安科瑞 崔丽洁 摘要&#xff1a;在国家鼓励半导体材料国产化的政策导向下&#xff0c;本土半导体材料厂商不断提升半导体产品技术水平和研发能力&#xff0c;逐渐打破了国外半导体厂商的垄断格局&#xff0c;推进中国半导体材料国产化进程&#xff0c;促进中国半导体行业的发展…

ubuntu20.04有公网ip如何做端口映射?

一&#xff0c;有公网IP时如何做端口映射&#xff1f; 然后打开浏览器&#xff0c;输入192.168.2.1自己路由地址&#xff0c;进入路由器的控制面板&#xff08;如果不知道用户名和密码&#xff0c;可以在自己路由设备背面可见默认帐号密码&#xff09;。 点击转发规则&…

深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)

本章的内容: 什么是函数栈帧&#xff1f; 理解函数栈帧能解决什么问题&#xff1f; 函数栈帧的创建和销毁解析 本文放到 --> 该专栏内&#xff1a;http://t.csdnimg.cn/poMzA 目录 什么是函数栈帧❓ 理解函数栈帧能解决什么问题呢&#xff1f;&#x1f4a2; 函数栈帧的…

抖音商城双11好物节,从供需两侧重新定义“好货”

【潮汐商业评论/原创】 你用的第一款护肤品是什么&#xff1f; 大部分人回忆起童年的时候&#xff0c;想起来的都是那款有着牛奶香味的、塑料包装的小袋白色乳霜——郁美净儿童霜。 但是不知何时&#xff0c;它逐渐淡出了很多人、特别是年轻人的视野&#xff0c;直到今年在互…

iManager云套件支持配置kingbase

作者 yangjunlin 前言 越来越多的涉密单位对于信创环境的要求逐渐升高&#xff0c;服务应用对国产数据库的依赖性也在提高&#xff0c;针对超图iManager for k8s产品中的开源数据库替换为kingbase等国产化数据库的客户需求和场景也就随之而来&#xff0c;因此本文将带着读者一步…

ChatGPT微信小程序系统源码/开源支持二开/AI聊天微信小程序源码/人工智能ChatGPT实现的微信小程序

源码简介&#xff1a; 关键字&#xff1a;人工智能 ChatGPT 二开ChatGPT微信小程序源码&#xff0c;作为AI聊天微信小程序源码&#xff0c;它是人工智能ChatGPT实现的微信小程序。它可以适配H5和WEB端 支持AI聊天次数限制。 ChatGPT-MP(基于ChatGPT实现的微信小程序&#xf…

广东食养食疗国际研讨会成功举行

经商务部批准的第20届中国国际保健博览会11月11日在广州隆重开幕。广东省养生文化协会召开的食养食疗国际研讨会首次亮相展会&#xff0c;备受大众关注。来自20多个国家地区的代表&#xff0c;通过线下线上、现场演讲、书面交流等不同形式参加本次活动。30多个商协会负责人和近…

后门程序2

System\CurrentControlSet\Services\Disk\Enum Windows 操作系统注册表中的一个路径。这个路径通常包含有关磁盘设备的信息。在这个特定的路径下&#xff0c;可能存储了有关磁盘枚举的配置和参数 Enum&#xff08;枚举&#xff09;子键通常包含了系统对磁盘的枚举信息&#xf…

Python实现WOA智能鲸鱼优化算法优化循环神经网络回归模型(LSTM回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 鲸鱼优化算法 (whale optimization algorithm,WOA)是 2016 年由澳大利亚格里菲斯大学的Mirjalili 等提…

Spring的Redis客户端

如何在Spring中操作redis 在创建springboot项目的时候引入redis的依赖. 在配置文件里指定redis主机的地址和端口,此处我们配置了ssh隧道,所以连接的就是本机的8888端口. 创建一个controller类,注入操作redis的对象. 前面使用jedis,是通过jedis对象里的各种方法来操作redis的,此…

[原创]仅需小小的改变,B++ Builder 12的代码完成提示即可完美工作.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、Eclipse、C Bui…

实验室试剂耗材安全管理:从热点事件看其重要性

随着科学技术的不断发展&#xff0c;实验室试剂耗材在各个学科领域的应用越来越广泛。然而&#xff0c;随之而来的实验室试剂耗材安全管理问题也日益凸显。近年来&#xff0c;一系列实验室安全事件引发了社会广泛关注&#xff0c;使我们深刻认识到实验室试剂耗材安全管理的重要…

HslCommunication模拟西门子读写数据

导入HslCommunication C#端代码&#xff08;上位机&#xff09; 这里要注意的是上位机IP用的当前电脑的IP。 using HslCommunication; using HslCommunication.Profinet.Siemens; using System; using System.Collections.Generic; using System.ComponentModel; using Syste…

Ridgeline plot / 远山图 / 山脊图 怎么画?怎么优化?

工具 Origin 2022 当然&#xff0c;用Matlab、Python也是可以的。 颜色配置 色卡调整

ehcart散点图x轴不按照顺序排列的问题

如图所示&#xff0c;一开始我x轴用的type为category&#xff0c;所以导致x轴的顺序是乱的&#xff0c;如下所示&#xff1a; 后来去官网看了下文档&#xff0c;才知道只需要type改成value就可以了&#xff01;&#xff01;&#xff01;差点就去写for循环排序了呀

正交矩阵的定义

对于n阶矩阵A&#xff0c;如果&#xff0c;其中为单位矩阵&#xff0c;为A的转置矩阵&#xff0c;那么就称A为正交矩阵。 对于正交矩阵&#xff0c; 对于正交矩阵&#xff0c;其列向量都是单位向量&#xff0c;行向量都是单位向量

Databend 开源周报第 119 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 用户案例&#…