Springboot细节补充

一、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.mfbz.cn/a/139963.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CCF ChinaSoft 2023 论坛巡礼 | 云原生与智能化运维论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

[原创]仅需小小的改变,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;也服务于国外。为了低成本所以使用一套代码。在产品线之间隔离&#…

14.求n!和1!+2!+...+20!和2^1+2^2+……++2^20和2^1+2^3+……++2^19

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 四、举一反三一、题目描述&#xff1a;求1&#xff01;2&#xff01;...20! 二、题目分析 三、解题 程序运行代码1程序运行代码2 一、题目描述&#xff1a;求求2^1^2^2^……2^20^二、解题 程序运行代码 一、题目…

大数据毕业设计选题推荐-消防监控平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

通过百度翻译API完成Java中的中英文翻译

因为要做英文文献索引分词&#xff0c;所以对于索引词汇必须得是英文&#xff0c;将表中的中文都转换成英文 这里用到百度的翻译API 首先需要注册成为百度翻译开发者&#xff1a;百度翻译开放平台 注册成为个人开发者就可以&#xff0c; 这里可以完善相关信息&#xff0c;要记…

每日互动(个推)全新推出AITA智选人群工具,助力品牌营销升级

11月9日&#xff0c;在2023年世界互联网大会“新产品新技术特色场景发布活动”上&#xff0c;数据智能服务商每日互动&#xff08;个推&#xff09;全新打造的AITA智选人群工具首次正式对外发布。作为每日互动在品牌营销领域的大模型应用最新成果&#xff0c;AITA智选人群工具将…

《数据结构、算法与应用C++语言描述》-代码实现键值有序链表跳表

跳表 定义 在一个用有序链表描述的 n 个数对的字典中进行查找&#xff0c;至多需要 n 次关键字比较。如果在链表的中部节点加一个指针&#xff0c;则比较次数可以减少到 n/21。这时&#xff0c;为了查找一个数对&#xff0c;首先与中间的数对比较。如果查找的数对关键字比较小…

【数据仓库】数仓分层方法

文章目录 一. 数仓分层的意义1. 清晰数据结构。2. 减少重复开发3. 方便数据血缘追踪4. 把复杂问题简单化5. 屏蔽原始数据的异常6. 数据仓库的可维护性 二. 如何进行数仓分层&#xff1f;1. ODS层2. DW层2.1. DW层分类2.2. DWD层2.3. DWS 3. ADS层 4、层次调用规范 一. 数仓分层…

全域全自主建设,亚信科技AntDB数据库助力广电5G业务上线运行

自2019年6月&#xff0c;中国广电成功获得5G牌照以来&#xff0c;迅速推进网络建设目标&#xff0c;成为5G网络覆盖广、应用场景多、用户体验出色的第四大运营商。其依托全球独有的700MHz频谱资源&#xff0c;具备覆盖能力强、容量足、速率高的优势。通过不断深化和中国移动的共…

【JavaEE】Servlet(创建Maven、引入依赖、创建目录、编写及打包、部署和验证、smart Tomcat)

一、什么是Servlet&#xff1f; Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app 1.1 Servlet能干什么&#xff1f; &#x1f695;允许程序猿注册一个类, 在 Tomcat 收到某个特定的 HTTP 请求的时候, 执行这个类…

自动化测试项目:浅谈分层设计的思路

本文以笔者当前使用的自动化测试项目为例&#xff0c;浅谈分层设计的思路&#xff0c;不涉及到具体的代码细节和某个框架的实现原理&#xff0c;重点关注在分层前后的使用对比&#xff0c;可能会以一些伪代码为例来说明举例。 接口测试三要素&#xff1a; 参数构造发起请求&a…

通配符SSL证书:保护多个子域名的最佳选择

很多网站和应用程序采用了多个子域名来提供不同的服务或内容。为了确保这些子域名的安全性和数据加密&#xff0c;使用通配符SSL证书成为一个理想的解决方案。 首先&#xff0c;通配符SSL证书的最大优势在于其灵活性和经济性。不同于单个SSL证书只能保护一个特定的域名&#xf…

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

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

【游戏开发算法每日一记】使用随机prime算法生成错综复杂效果的迷宫(C#和C++)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

Peter算法小课堂—自定义容器

太戈编程第308题 暴力法 cin>>n>>m; for(int i0;i<n;i) cin>>name[i]>>year[i]; for(int i0;i<m;i){int x;string y;cin>>x>>y;int OK0;for(int j0;j<n;j){if(name[j]y&&year[j]x){OK1;break;}}cout<<OK<<…

WH4530A可检测0-100cm环境光+距离检测功能

台湾旺泓推出的WH4530A是一款结合了先进环境光传感器&#xff08;ALS&#xff09;先进接近传感器&#xff08;PS&#xff09;和高效率的红外LED灯三合一为一体的光距感接近传感器&#xff1b;可测距范围0-100cm;采用I2C接口&#xff0c;可实现超高灵敏度、精准测距检测范围广等…

介绍公司的软文怎么写

软文推广成为企业提高知名度和市场竞争力的主要方式之一&#xff0c;通过软文推广&#xff0c;公司能够被更多消费者熟知并在他们心中留下深刻印象&#xff0c;一篇好的软文&#xff0c;不仅能传递公司的产品和服务信息&#xff0c;还可以传递出公司的理念、文化等&#xff0c;…

【Linux】进程等待

文章目录 tips一、进程等待是什么&#xff1f;二、为什么要有进程等待&#xff1f;三、怎么做到进程等待&#xff1f;先看看什么是进程等待wait和waitpidstatus参数options参数非阻塞轮询 进程等待的原理 总结 tips 下面的代码可以循环检测进程。 while :; do ps ajx | head …

ASK、PSK、FSK的调制与解调

ASK、PSK、FSK的调制与解调 本文主要涉及数字信号的调制与解调&#xff0c;内容包括&#xff1a;2ASK、2PSK、2FSK的调制与解调以及频谱分析 关于通信原理还有其他文章可参考&#xff1a; 1、信息量、码元、比特、码元速率、信息速率详细解析——实例分析 2、模拟系统的AM信号的…