【SpringBoot2】二:基础入门---自动配置原理(SpringBoot特点+容器功能)

news2024/12/25 12:50:51

文章目录

  • 1.SpringBoot特点
    • 1.1 依赖管理
    • 1.2 自动配置
  • 2.容器功能
    • 2.1 组件添加
      • 2.1.1@Configuration
      • 2.1.2 @Bean、@Component、@Controller、@Service、@Repository
      • 2.1.3 @ComponentScan、@Import
      • 2.1.4 @Conditional
    • 2.2 原生配置引入@ImportResource
    • 2.3 配置绑定
      • 2.3.1 @Component + @ConfigurationProperties
      • 2.3.2 @EnableConfigurationProperties + @ConfigurationProperties

1.SpringBoot特点

1.1 依赖管理

  • 父项目做依赖管理
    在这里插入图片描述
    在这里插入图片描述
    几乎包含所有开发需要的依赖。

在这里插入图片描述

  • 无需关注版本号,自动版本仲裁
    1、引入依赖默认都可以不写版本
    2、引入非版本仲裁的jar,要写版本号。
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

在这里插入图片描述

  • 可以修改默认版本号

在这里插入图片描述

    <properties>
        <mysql.version>5.1.43</mysql.version>
    </properties>
  • 开发导入starter场景启动器
    (1)
    spring-boot-starter-* : *就某种场景
    只要引入starter,这个场景的所有常规需要的依赖我们都自动引入
    (2)
    见到的 *-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器。
    在这里插入图片描述

我们可以看到我们只是引入spring-boot-starter-web,但是实际上是引入了不止一个的依赖
在这里插入图片描述

1.2 自动配置

自动配置详解
自动配好Tomcat(1)引入Tomcat依赖。(2)配置Tomcat
自动配好SpringMVC(1)引入SpringMVC全套组件(2) 自动配好SpringMVC常用组件(功能)
自动配好Web常见功能,如:字符编码问题SpringBoot帮我们配置好了所有web开发的常见场景
默认的包结构(1)主程序所在包及其下面的所有子包里面的组件都会被默认扫描进(2)无需以前的包扫描配置(3)想要改变扫描路径,@SpringBootApplication(scanBasePackages=“com.xxxx”)或者@ComponentScan 指定扫描路径【注:@SpringBootApplication等同于@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(“com.xxxx.boot”)】
各种配置拥有默认值(1)默认配置最终都是映射到某个类上,如:MultipartProperties(2)配置文件的值最终会绑定每个类上,这个类会在容器中创建对象
按需加载所有自动配置项(1)非常多的starter(2)引入了哪些场景这个场景的自动配置才会开启(3)SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面

2.容器功能

2.1 组件添加

2.1.1@Configuration

两个Bean
【Pet.java】

package com.sdnu.boot.bean;

public class Pet {
    private String name;

    public Pet() {
    }

    public Pet(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

【User.java】

package com.sdnu.boot.bean;

public class User {
    private String name;
    private Integer age;

    public User() {
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

在这里插入图片描述
原来注册方式:
【beans.xml】

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user1" class="com.sdnu.boot.bean.User">
        <property name="name" value="xiaoming"/>
        <property name="age" value="20"/>
    </bean>
    <bean id="dog" class="com.sdnu.boot.bean.Pet">
        <property name="name" value="zhangao"/>
    </bean>
</beans>

我们使用springboot后就不需要写xml文件了,我们只需要定义一个类用@Configuration标注。

【MyConfig.java】

package com.sdnu.boot.config;

import com.sdnu.boot.bean.Pet;
import com.sdnu.boot.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//@Bean标注在类上给容器注册组件, 配置类本身也是组件
//告诉springboot这是一个配置类
@Configuration(proxyBeanMethods = true)
public class MyConfig {
    //返回类型是组件类型
    //方法名是组件id
    //返回的值,就是组件在容器中的实例
    @Bean
    public User User1(){
        return new User("xiaoming", 20);
    }
    //组件id为指定的tom
    @Bean("tom")
    public Pet myPet(){
        return new Pet("zhangao");
    }
}

【测试】

package com.sdnu.boot;

import com.sdnu.boot.bean.Pet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * [@SpringBootApplication 表示这是一个启动类
 */
@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        //返回IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        String[] beanDefinitionNames = run.getBeanDefinitionNames();
        //查看容器中有哪些组件
        for(String name : beanDefinitionNames){
            System.out.println(name);
        }
        Pet tom1 = run.getBean("tom", Pet.class);
        Pet tom2 = run.getBean("tom", Pet.class);
        System.out.println("组件1:" + tom1);
        System.out.println("组件2:" + tom2);
    }
}

在这里插入图片描述
在这里插入图片描述
我们通过结果还可以看出配置类里面使用@Bean标注在方法上给容器注册组件,默认是单实例的.

  • 注释proxyBeanMethods是为了让使用@Bean注解的方法被代理而实现bean的生命周期的行为。
  • Full模式
    设置为true,那么直接调用方法获取bean,不会创建新的bean,而是会走bean的生命周期的行为。(保证每个@Bean方法被调用多少次返回的组件都是单实例的)
  • Lite模式
    设置为false, 那么直接调用方法获取bean,会创建新的bean,且不会走bean的生命周期的行为。(每个@Bean方法被调用多少次返回的组件都是新创建的)
  • 组件依赖必须使用Full模式默认。其他默认是否Lite模式

2.1.2 @Bean、@Component、@Controller、@Service、@Repository

@Component , @Repository , @ Controller , @Service 这些注解只局限于自己编写的类,而@Bean注解能把第三方库中的类实例加入IOC容器中并交给spring管理。

2.1.3 @ComponentScan、@Import

给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名

@Import({User.class, DBHelper.class})
public class MyConfig {
}

2.1.4 @Conditional

满足Conditional指定的条件,则进行组件注入
在这里插入图片描述

2.2 原生配置引入@ImportResource

在这里插入图片描述
可以导入之前我们spring使用的xml方式注册的组件。

2.3 配置绑定

使用Java读取到properties文件中的内容,并且把它封装到JavaBean中,以供随时使用

2.3.1 @Component + @ConfigurationProperties

在这里插入图片描述
【car.java】

package com.sdnu.boot.bean;

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

/**
 * 只有在spring容器中的组件才会有这个功能,所有要使用@Component去注册组件
 */
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {
    private String brand;
    private Integer price;

    public Car() {
    }

    public Car(String brand, Integer price) {
        this.brand = brand;
        this.price = price;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", price=" + price +
                '}';
    }
}

2.3.2 @EnableConfigurationProperties + @ConfigurationProperties

@EnableConfigurationProperties(Car.class)
//1、开启Car配置绑定功能
//2、把这个Car这个组件自动注册到容器中
public class MyConfig {
}

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

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

相关文章

如何保障网络安全

网络安全是一个涵盖范围广、深入浅出的话题。随着互联网在现代社会中扮演的重要角色日益突出&#xff0c;网络安全问题成为各个领域所关注的焦点。在此&#xff0c;我们将从以下几个方面来阐述网络安全的重要性&#xff0c;并讨论几种保障网络安全的方式。 一、网络安全的重要性…

K8s(1.20.15版本)部署(3master+2node)

1.准备工作 准备五台centos 7的虚拟机&#xff08;每台虚拟机分配2核2G&#xff0c;存储使用20G硬盘&#xff0c;必须2核不然报错&#xff09;&#xff1a;如下图机器的分配情况&#xff1a; IP节点名称节点类型10.10.10.11k8s-master11master10.10.10.12k8s-master12master1…

解决centos8下域名raw.githubusercontent.com解析错误

在win10环境下执行命令 D:\test>ping raw.githubusercontent.com Ping 请求找不到主机 raw.githubusercontent.com。请检查该名称&#xff0c;然后重试。 解决很简单&#xff0c;把ipv6的DNS服务器设为240c::6666就行了&#xff0c;改完后执行命令 D:\test>ping raw.g…

C语言函数大全-- s 开头的函数(2)

C语言函数大全 本篇介绍C语言函数大全-- s 开头的函数&#xff08;2&#xff09; 1. setlinestyle 1.1 函数说明 函数声明函数功能void setlinestyle( int linestyle, unsigned upattern, int thickness );设置当前绘图窗口的线条样式、线型模式和线条宽度 参数&#xff1a…

SQL中去除重复数据的几种方法,我一次性都告你​

使用SQL对数据进行提取和分析时&#xff0c;我们经常会遇到数据重复的场景&#xff0c;需要我们对数据进行去重后分析。 以某电商公司的销售报表为例&#xff0c;常见的去重方法我们用到distinct 或者group by 语句&#xff0c; 今天介绍一种新的方法&#xff0c;利用窗口函数…

不得不说的行为型模式-命令模式

目录 命令模式&#xff1a; 代码实例&#xff1a; 下面是面试中可能遇到的问题&#xff1a; 命令模式&#xff1a; 命令模式(Command Pattern)是一种行为型设计模式&#xff0c;它允许将请求封装成对象&#xff0c;从而让你能够用不同的请求对客户端进行参数化&#xff0c;对…

Guitar Pro8苹果mac最新版本下载安装教程

Guitar Pro是一款专业的吉他制谱软件&#xff0c;现在已更新至Guitar Pro8&#xff0c;新增了支持添加音频轨道、支持嵌套连音符、直观的效果器视图、让指法一目了然的音阶示意图等实用新功能。下面我们来看Guitar Pro8 Mac如何安装。 guitar pro是一款专业的吉他学习软件&…

Linux内核(十四)Input 子系统详解 I —— 子系统介绍以及相关结构体解析

文章目录 概述input 子系统框架input 子系统相关结构体介绍input_dev结构体input_handler结构体input_handle结构体Evdev事件相关结构体input_event结构体&#xff08;标准按键编码信息&#xff09;设备相关信息结构体 概述 input子系统就是管理输入的子系统&#xff0c;和Lin…

HTML中的常用标签

HTML中的常用标签 &#x1f50e;注释标签&#x1f50e;标题标签&#x1f50e;段落标签&#x1f50e;换行标签&#x1f50e;格式化标签&#x1f50e;图片标签&#x1f50e;超链接标签&#x1f50e;表格标签合并单元格 &#x1f50e;列表标签无序列表有序列表自定义列表 &#x1…

新手如何快速学会Python?

在本文中&#xff0c;我们将介绍如何有效地学习 Python 。你应该知道「数据科学」是用于解决、探究问题并从数据中提取有价值信息的科学。 为了有效地做到这一点&#xff0c;你需要整理数据集、训练机器学习模型、可视化结果等等。 这是学习 Python 的最佳时机。 事实上&#x…

【五一创作】数据可视化之美 ( 三 ) - 动图展示 ( Python Matlab )

1 Introduction 在我们科研学习、工作生产中&#xff0c;将数据完美展现出来尤为重要。 数据可视化是以数据为视角&#xff0c;探索世界。我们真正想要的是 — 数据视觉&#xff0c;以数据为工具&#xff0c;以可视化为手段&#xff0c;目的是描述真实&#xff0c;探索世界。 …

[创新工具和方法论]-01- DOE课程基础知识

文章目录 1.DOE实验设计的介绍1.1 什么是实验设计DOE?1.2 DOE的优势有哪些?1.3 如何开展DoE研究&#xff1f;步骤 2.DOE实验培训3.数据分析步骤4.实验的随机化5.偏差6.R方 相关系数假设检验 7.三因子二水平全因子设计 1.DOE实验设计的介绍 实验设计是一种安排实验和分析实验数…

【网络进阶】服务器模型Reactor与Proactor

文章目录 1. Reactor模型2. Proactor模型3. 同步IO模拟Proactor模型 在高并发编程和网络连接的消息处理中&#xff0c;通常可分为两个阶段&#xff1a;等待消息就绪和消息处理。当使用默认的阻塞套接字时&#xff08;例如每个线程专门处理一个连接&#xff09;&#xff0c;这两…

Ubantu docker学习笔记(八)私有仓库

文章目录 一、建立HTTPS链接1.在仓库服务器上获取TLS证书1.1 生成证书颁发机构证书1.2 生成服务器证书1.3 利用证书运行仓库容器 2.让私有仓库支持HTTPS3.客户端端配置 二、基本身份验证三、对外隐藏仓库服务器3.1 在服务器端3.2 在客户端进行 四、仓库可视化 在前面的学习中&a…

数据库三范式与反范式详解

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;数据库三范式与反范式详解 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林…

阿里云服务器通用算力u1性能测评CPU处理器网络PPS

阿里云服务器u1通用算力型Universal实例高性价比&#xff0c;CPU采用Intel(R) Xeon(R) Platinum&#xff0c;主频是2.5 GHz&#xff0c;云服务器U1实例的基准vCPU算力与5代企业级实例持平&#xff0c;最高vCPU算力与6代企业级实例持平&#xff0c;提供2c-32c规格和1:1/2/4/8丰富…

贪心算法讲解

文章目录 1. 贪心算法的概念2. 讲解贪心 1. 贪心算法的概念 贪心算法是&#xff1a;用一种局部最功利的标准&#xff0c;总是做出当前看来是最好的选择。如果局部最优解可以得出全局最优解&#xff0c;说明贪心假设成立&#xff0c;否则就失败。 举个例子&#xff1a; 这里有…

尚融宝26-投标

目录 一、需求 &#xff08;一&#xff09;投资人投标 &#xff08;二&#xff09;流程 二、标的详情 &#xff08;一&#xff09;需求 &#xff08;二&#xff09;后端 &#xff08;三&#xff09;前端 三、计算收益 &#xff08;一&#xff09;四种还款方式 &#…

基于 A* 搜索算法来优化无线传感器节点网络的平均电池寿命(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 A*&#xff08;念做&#xff1a;A Star&#xff09;算法是一种很常用的路径查找和图形遍历算法。它有较好的性能和准确度。本文…

一篇带你快速入门DDD领域驱动设计

一、什么是领域驱动 领域驱动设计 Domain-Driven Design&#xff0c;简称DDD。软件对于行业并没有这么高的要求&#xff0c;他本身就是帮助其他行业更好的发展&#xff0c;赋能其他行业的。各个行业都有软件的身影&#xff0c;但是他们的业务场景是不同的&#xff0c;所以就需…