SpringBoot SpringBoot 原理篇 1 自动配置 1.13 bean 依赖属性配置

news2025/7/8 3:48:57

SpringBoot

【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】

SpringBoot 原理篇

文章目录

      • SpringBoot
      • SpringBoot 原理篇
      • 1 自动配置
        • 1.13 bean 依赖属性配置
          • 1.13.1 环境准备
          • 1.13.2 bean 依赖属性配置
          • 1.13.3 小结

1 自动配置

1.13 bean 依赖属性配置

1.13.1 环境准备

创建一个全新的Maven 工程模块

在这里插入图片描述

直接创建

在这里插入图片描述

OK, 一个全新的Maven 工程

【添加坐标】

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>2.7.4</version>
    </dependency>
</dependencies>

在这里插入图片描述

OK

【实体类】

package com.dingjiaxiong.bean;

/**
 * ClassName: Cat
 * date: 2022/10/25 13:03
 *
 * @author DingJiaxiong
 */
public class Cat {
}
package com.dingjiaxiong.bean;

/**
 * ClassName: Mouse
 * date: 2022/10/25 13:03
 *
 * @author DingJiaxiong
 */

public class Mouse {
}

【运行类】

package com.dingjiaxiong;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * ClassName: App
 * date: 2022/10/25 13:03
 *
 * @author DingJiaxiong
 */

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(App.class);

        

    }

}

OK, 基本环境就准备好了

1.13.2 bean 依赖属性配置

来一个业务层【拍猫和老鼠的动画片】

package com.dingjiaxiong.bean;

import org.springframework.stereotype.Component;

/**
 * ClassName: CartoonCatAndMouse
 * date: 2022/10/25 13:06
 *
 * @author DingJiaxiong
 */

@Component
public class CartoonCatAndMouse {

    private Cat cat;
    private Mouse mouse;

    public void play(){
        System.out.println("3岁的tom和4岁的jerry打起来了");
    }

}

OK, 在运行程序中获取这个bean

package com.dingjiaxiong;

import com.dingjiaxiong.bean.CartoonCatAndMouse;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * ClassName: App
 * date: 2022/10/25 13:03
 *
 * @author DingJiaxiong
 */

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(App.class);

        CartoonCatAndMouse bean = context.getBean(CartoonCatAndMouse.class);
        bean.play();
    }

}

OK,直接运行

在这里插入图片描述

没啥问题,现在就是一个调用打印

现在的问题就是这句打印的数据都是一个字符串写死的,所以要换

先导一个lombok

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
</dependency>

在这里插入图片描述

修改实体类

package com.dingjiaxiong.bean;

import lombok.Data;

/**
 * ClassName: Cat
 * date: 2022/10/25 13:03
 *
 * @author DingJiaxiong
 */

@Data
public class Cat {

    private String name;
    private Integer age;

}
package com.dingjiaxiong.bean;

import lombok.Data;

/**
 * ClassName: Mouse
 * date: 2022/10/25 13:03
 *
 * @author DingJiaxiong
 */

@Data
public class Mouse {

    private String name;
    private Integer age;

}

OK,现在属性都有了

修改业务代码

package com.dingjiaxiong.bean;

import org.springframework.stereotype.Component;

/**
 * ClassName: CartoonCatAndMouse
 * date: 2022/10/25 13:06
 *
 * @author DingJiaxiong
 */

@Component
public class CartoonCatAndMouse {

    private Cat cat;
    private Mouse mouse;

    public CartoonCatAndMouse() {
        cat = new Cat();
        cat.setName("tom");
        cat.setAge(3);

        mouse = new Mouse();
        mouse.setName("jerry");
        mouse.setAge(4);
    }

    public void play(){
        System.out.println(cat.getAge() + "岁的" + cat.getName() + "和" + mouse.getAge() + "岁的" + mouse.getName() + "打起来了");
    }

}

OK,直接运行

在这里插入图片描述

这样就不是写死的数据了而且实现相同的效果

现在问题就是,当前这样子写,如果想正常运行

在这里插入图片描述

这些数据必须得告诉程序,但是如果有一天猫或者老鼠出意外了,导致咱们必须从外部修改这些“演员”,怎么做?

先来一个配置文件

cartoon:
  cat:
    name: tom
    age: 3

  mouse:
    name: jerry
    age: 4

在业务中读取值

package com.dingjiaxiong.bean;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * ClassName: CartoonCatAndMouse
 * date: 2022/10/25 13:06
 *
 * @author DingJiaxiong
 */

@Component
@Data
@ConfigurationProperties(prefix = "cartoon")
public class CartoonCatAndMouse {

    private Cat cat;
    private Mouse mouse;

    public void play(){
        System.out.println(cat.getAge() + "岁的" + cat.getName() + "和" + mouse.getAge() + "岁的" + mouse.getName() + "打起来了");
    }

}

直接运行

在这里插入图片描述

可以看到, 这样子数据也上来了

修改一下配置文件

在这里插入图片描述

OK, 数据也正常替换了

但是如果我压根儿不给老鼠的数据

在这里插入图片描述

没给就导致业务中的mouse 没有初始化,然后又直接使用,就这样儿了

而且现在的问题是

在这里插入图片描述

现在这个类已经绑死了 yml 中的数据,如果yml 不提供数据,这个类就没法儿用了【这好像也不太行,有解决办法吗?】

答案是当然的

先来一个全新的类

package com.dingjiaxiong.bean;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * ClassName: CartoonProperties
 * date: 2022/10/25 13:27
 *
 * @author DingJiaxiong
 */

@Component
@Data
@ConfigurationProperties(prefix = "cartoon")
public class CartoonProperties {

    private Cat cat;
    private Mouse mouse;

}

之前的去使用这个属性类

package com.dingjiaxiong.bean;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * ClassName: CartoonCatAndMouse
 * date: 2022/10/25 13:06
 *
 * @author DingJiaxiong
 */

@Component
@Data

public class CartoonCatAndMouse {

    private Cat cat;
    private Mouse mouse;

    private CartoonProperties cartoonProperties;

    public CartoonCatAndMouse(CartoonProperties cartoonProperties) {
        this.cartoonProperties = cartoonProperties;
        cat = new Cat();
        cat.setName("tom");
        cat.setAge(3);

        mouse = new Mouse();
        mouse.setName("jerry");
        mouse.setAge(4);
    }

    public void play(){
        System.out.println(cat.getAge() + "岁的" + cat.getName() + "和" + mouse.getAge() + "岁的" + mouse.getName() + "打起来了");
    }

}

先直接打印看看,

在这里插入图片描述

说明现在这些值拿的还是本类构造方法中设置的值

改一下

cat.setName(StringUtils.hasText(cartoonProperties.getCat().getName()) ? cartoonProperties.getCat().getName() : "tom");

意思是如果属性类中有值,就用属性类的值对tom 进行覆盖

直接运行

在这里插入图片描述

OK, 没毛病

如果配置文件中没配猫的name

在这里插入图片描述

就还是tom

现在达到的效果 就是如果配置里面设置 了新的,就用新的,如果没有,就用老的

现在我把整个猫都拿掉

在这里插入图片描述

这样会报错,因为属性类中的cat 为空了,再去拿空的name 就报错了,所以要再加个条件

cat.setName(cartoonProperties.getCat() != null && StringUtils.hasText(cartoonProperties.getCat().getName()) ? cartoonProperties.getCat().getName() : "tom");

OK,再次运行

在这里插入图片描述

这样就行了,现在我仅仅是把猫的名字注掉

在这里插入图片描述

OK, 还是可以用

按照这种判断形式,完善一下业务代码

package com.dingjiaxiong.bean;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

/**
 * ClassName: CartoonCatAndMouse
 * date: 2022/10/25 13:06
 *
 * @author DingJiaxiong
 */

@Component
@Data

public class CartoonCatAndMouse {

    private Cat cat;
    private Mouse mouse;

    private CartoonProperties cartoonProperties;

    public CartoonCatAndMouse(CartoonProperties cartoonProperties) {
        this.cartoonProperties = cartoonProperties;
        cat = new Cat();
        cat.setName(cartoonProperties.getCat() != null && StringUtils.hasText(cartoonProperties.getCat().getName()) ? cartoonProperties.getCat().getName() : "tom");
        cat.setAge(cartoonProperties.getCat() != null && cartoonProperties.getCat().getAge() != null ? cartoonProperties.getCat().getAge() : 3);

        mouse = new Mouse();

        mouse.setName(cartoonProperties.getMouse() != null && StringUtils.hasText(cartoonProperties.getMouse().getName()) ? cartoonProperties.getMouse().getName() : "jerry");
        mouse.setAge(cartoonProperties.getMouse() != null && cartoonProperties.getMouse().getAge() != null ? cartoonProperties.getMouse().getAge() : 4);
        
    }

    public void play(){
        System.out.println(cat.getAge() + "岁的" + cat.getName() + "和" + mouse.getAge() + "岁的" + mouse.getName() + "打起来了");
    }

}

现在的效果,就是配置文件的值和属性中的值融合

在这里插入图片描述

去掉一个单一属性

在这里插入图片描述

就是这样

整个猫都拿掉

在这里插入图片描述

如果全部拿掉

在这里插入图片描述

没毛病

现在就没有在真正的动画片类中去强制和配置文件绑死了【通过一个属性类解耦了】

在这里插入图片描述

OK, 差不多就是这样 了,但还有个小问题,在属性类中

在这里插入图片描述

加上这个注解后,这个属性类最终肯定会被加载成 bean

如果现在我们不用动画片那个业务类的了的话,这个属性类也就没有必要加载了

如果直接删掉这个注解

在这里插入图片描述

可以看到,如果不是一个bean了,就不能读取配置文件中的数据了

【解决办法】

在这里插入图片描述

这样就可以把它强制整个一个bean了

OK, 这个问题解决了,顺带的问题又来了

在这里插入图片描述

这个类现在也一定会被加载成bean,好家伙,也拿掉?

在这里插入图片描述

拿掉之后,到运行类中使用@Import 进行加载

在这里插入图片描述

这样达到的效果就是

在这里插入图片描述

这两个东西现在都没有强制声明成bean 了

【但是现在能用吗?试试】

在这里插入图片描述

没毛病

现在的感觉就是在运行类中,导入这样一个功能,

在这里插入图片描述

就能用了

做了这么多步骤:

核心:

  • 现在我们可以“合理”的读取配置文件中的数据了,配了我就读,没配我就默认
  • 而且对于业务类和属性类,我都无需声明成bean,只需要在用的地方写清楚就行了

OK,回顾一下

将业务功能bean运行需要的资源抽取成独立的属性类(******Properties),设置读取配置文件信息

在这里插入图片描述

配置文件中使用固定格式为属性类注入数据

在这里插入图片描述

定义业务功能bean,通常使用@Import导入,解耦强制加载bean

在这里插入图片描述

使用@EnableConfigurationProperties注解设定使用属性类时加载bean

在这里插入图片描述

1.13.3 小结
  1. 业务bean的属性可以为其设定默认值
  2. 当需要设置时通过配置文件传递属性
  3. 业务bean应尽量避免设置强制加载,而是根据需要导入后加载,降低spring容器管理bean的强度

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

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

相关文章

【软件测试】作为测试人,因工作与开发吵了一架碰撞,该咋办......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试与开发在工作中…

【网页设计】HTML+CSS保护野生动物北极熊介绍网页设计专题

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

傻白入门芯片设计,RDL/Interposer/EMIB/TSV(五)

一、再分配层&#xff08;RDL&#xff09; 主要原理就是在晶片表面沉积金属层和介电层。它形成了一个再分配层&#xff0c;以携带相应的金属布线模式&#xff0c;并在芯片外的松散区域上重新排列芯片的IO端口。由于RDL形成的金属布线的线宽和间距较小&#xff0c;从而提供了更…

MySQL之InnoDB架构浅析

InnoDB是一个兼顾高可靠性和高性能的通用存储引擎。在 MySQL 5.7 中&#xff0c;InnoDB是默认的 MySQL 存储引擎。 InnoDB 的主要优势 支持事物&#xff0c;具备crash-safe的能力支持行锁以及MVCC&#xff0c;具备良好的多用户并发性和性能Buffer Pool&#xff0c;提升热点数…

第8章 综合案例—构建DVD租赁商店数据仓库

目录 章节概要 案例背景介绍 数据仓库的架构模型 数据仓库的架构模型 数据库sakila的下载和安装 数据库sakila简介 数据库sakila中 数据表之间的关系 数据表简介 用于储存电影基本信息及相关介绍的数据&#xff0c;该数据表各个字段的含义如表。 用于储存定义电影id所…

Python爬虫

前言 这个故事&#xff0c;从头讲起。 2022 年上班第一天&#xff0c;我们做了一个重要决定&#xff0c;就是打造精品学习路线&#xff0c;为初学者指明前进的方向&#xff0c;以及常见的避坑技巧。 &#xff08;文末送读者福利&#xff09; 我承认这是一件非常有挑战的事情…

自动驾驶感知算法实战6——目标分类详解(ResNet、VGG、GoogLeNet等)

自动驾驶感知算法实战专栏:https://blog.csdn.net/charmve/category_12097938.html目录 1 网络分类2 详解 ResNet3 详解 VGG4 稠密连接网络(DenseNet)5 详解 GoogLeNet6 详解 Fast R-CNN1 网络分类 来自:https://charmve.github.io/computer-vision-in-action/#/book_prefa…

构建房地产行业智慧采购新模式,采购协同商城系统护航企业采购数字化转型

采购是房地产企业控制成本的龙头&#xff0c;同时还直接影响着工程质量。随着采购工作推进的不断深化&#xff0c;对地产物资采购精细化管理的要求也在日益加强&#xff0c;如何做好采购工作成为房地产企业实现数字化转型升级进程必须突破的壁垒。 房地产作为一个资源整合性行…

排序算法及java实现

简介 排序算是非常基础的算法&#xff0c;为什么我们需要排序算法呢&#xff1f;假设我们只有10个数&#xff0c;或者100个数&#xff0c;其实根本不需要研究这么多的排序算法&#xff0c;正常我们会使用的插入排序或者选择排序足够了&#xff0c;没必要发明快排&#xff0c;基…

第九章 哈希表 AcWing 2 1549. 集合相似度

第九章 哈希表 AcWing 2 1549. 集合相似度 原题链接 AcWing 1549. 集合相似度 算法标签 哈希表 位运算 思路 使用unordered_set数据结构将数据插入指定集合 如何计算Nc&#xff08;两集合交集&#xff09; 如何计算Nt&#xff08;两集合并集&#xff09; 输出问题 WA 精…

干掉 “重复代码”,这三种方式绝了!

软件工程师和码农最大的区别就是平时写代码时习惯问题&#xff0c;码农很喜欢写重复代码而软件工程师会利用各种技巧去干掉重复的冗余代码。 业务同学抱怨业务开发没有技术含量&#xff0c;用不到设计模式、Java 高级特性、OOP&#xff0c;平时写代码都在堆 CRUD&#xff0c;个…

BCD编码和ASCII码

计算机里&#xff0c;字母&#xff0c;各种字符以及指挥计算机执行操作的指令&#xff0c;均用二进制数的组合表示&#xff0c;称为二进制编码 目录 ASCII码&#xff08;汇编语言程序设计的时候会常用&#xff09; BCD码&#xff08;了解&#xff09; ASCII码&#xff08;汇…

等数值计算方法学习笔记第4章第三部分【数值积分(数值微分)】

高等数值计算方法学习笔记第4章第三部分【数值积分&#xff08;数值微分&#xff09;】六、数值微分&#xff08;第四次课&#xff09;1、中点方法与误差分析2、插值型的求导公式3、习题和表格4、知识结构图六、数值微分&#xff08;第四次课&#xff09; 1、中点方法与误差分析…

【图像处理】小波编码图像中伪影和纹理的检测(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

一年一度的科技狂欢盛会——2022亚马逊云科技re:Invent全球大会

一年一度的科技狂欢盛会&#xff0c;2022年亚马逊云科技re:Invent全球大会即将于北京时间2022年11月29日盛大开启&#xff01;届时全球各领域关注“云计算圈”发展的人都将齐聚一堂&#xff0c;共同聆听5大重磅嘉宾的主题演讲&#xff0c;700前沿技术话题…… 携全球合作伙伴&…

《计算机工程》投稿经验分享

历经两个月终于录用了 投稿过程真的太心酸了 第一次投计算机工程与应用&#xff1a;历时两周&#xff0c;拒稿 第二次投计算机科学&#xff1a;加急15天&#xff0c;增刊录用&#xff0c;撤稿 第三次投计算机应用与软件&#xff1a;说文件太大&#xff0c;修改文件大小重投&…

选择合作伙伴是最大关键:网宿科技的云业务拓展之路

关注IT圈子的小伙伴们&#xff0c;对网宿科技这个名字想必都是耳熟能详。在众多发力云计算业务的科技企业当中&#xff0c;近年来业绩表现出众的网宿科技&#xff0c;无疑是相当引人瞩目的一家。那么问题就来了&#xff1a;网宿科技当初是怎样走上了这条云业务拓展之路&#xf…

【知识网络分析】二模网络(two node)、多模网络(multi node)与多级别网络(multi level)

二模网络(two node)、多模网络(multi node)与多级别网络(multi level) 1 二模网络(two node)1.1 读取本地文献并构建二模网络数据集1.2 网络数据集精简1.3 网络图绘制及美化2 多模网络(multi node)3 多级别网络(multi level)1 二模网络(two node) 1.1 读取本地文…

web期末网站设计大作业 奶茶店网站美食餐饮网站设计与实现(HTML+CSS+JavaScript)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

【网页设计】HTML做一个属于我的音乐页面(纯html代码)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…