spring容器怎么启动

IOC容器设计及spring源码剖析

Spring核⼼容器(Core Container)容器Spring框架最核⼼的部分,它管理着Spring应⽤中 bean的创建、配置和管理。在该模块中,包括了Spring bean⼯⼚,它为Spring提供了DI的功能。基于bean⼯⼚,我们还会发现有多种Spring应⽤...

Spring Boot 容器镜像分层构建

一 、 场景 最 常见 的 是 容器 镜像 , 将 依赖 、 代码 、 配置 分层 后 可以 利用 容器 镜像 层 缓存 机制 加快 构建 和 下载 , 这 个 场景 使用 分层 是 最 优 最 简单 的 。 k8 s 移除 Docker 后 , 文档 中 的 Docker 都 去掉 了 … 现在 也 把 常 说 的 Docker 镜像 改成 了 容器 镜像 二 、 分层 配置 如果 不 需要 自 定义 分层 , 这 一步 可以 跳 过 在 项目 根 目录 中 添加 layers . xml 配置 文件 , 文件 内容 如下 : < layers xmlns = " http : / / www . springframework . org / schema / boot / layers " xmlns : xsi = " http : / / www . w 3 . org / 2001 / XMLSchema - instance " xsi : schemaLocation = " http : / / www . springframework . org / schema / boot / layers https : / / www . springframework . org / schema / boot / layers / layers - 2 . 6 . xsd " > < application > < into layer = " spring - boot - loader " > < include > org / springframework / boot / loader / * * < / include > < / into > < into layer = " application " / > < / application > < dependencies > < into layer = " application " > < includeModuleDependencies / > < / into > < into layer = " snapshot - dependencies " > < include > * : * : * SNAPSHOT < / include > < / into > < into layer = " sencond - dependencies " > < include > com . example : * : * < / include > < / into > < into layer = " dependencies " / > < / dependencies > < layerOrder > < layer > dependencies < / layer > < layer > spring - boot - loader < / layer > < layer > sencond - dependencies < / layer > < layer > snapshot - dependencies < / layer > < layer > application < / layer > < / layerOrder > < / layers > 和 官方 示例 相比 这里 增加 了 sencond - dependencies , 算是 二 方 库 依赖 , 如果 公司 有 自己 框架 , 自己 平台 , 根据 依赖 的 稳定 性 ( 修改 频率 ) 进行 更 细 的 分层 。 依赖 分层 设计 , 可以 参考 企业 Maven 依赖 管理 层次 结构 设计 。 使用 IDEA , 并且 下载 layers - 2 . 6 . xsd 的 情况 下 , < includeModuleDependencies / > 会 报 红 , 如下 图 所 示 : 通过 查看 官方 文档 和 spring boot 代码 , 发现 文档 、 代码 和 xsd 定义 存在 不 一致 的 地方 , 提 了 issues # 31115 、 pr # 31117 、 pr # 31126 , 代码 已经 合并 , xsd 经过 修改 , 和 文档 保持 一致 。 增加 上面 的 配置 后 , 修改 插件 使用 该 配置 : < plugin > < groupId > org . springframework . boot < / groupId > < artifactId > spring - boot - maven - plugin < / artifactId > < version > $ { spring - boot . version } < / version > < executions > < execution > < id > repackage < / id > < goals > < goal > repackage < / goal > < / goals > < / execution > < / executions > < configuration > < layers > < enabled > true < / enabled > < configuration > $ { project . basedir } / layers . xml < / configuration > < / layers > < / configuration > < / plugin > 三 、 容器 镜像 构建 镜像 有 多种 方式 , 官方 文档 介绍 了 Dockerfile 和 Buildpacks 两 种 。 3 . 1 Dockerfile 通过 layertools 可以 将 fat jar 按照 分层 定义 中 的 层 进行 解压 , 命令 如下 : Usage : java - Djarmode = layertools - jar my - app . jar Available commands : list List layers from the jar that can be extracted extract Extracts layers from the jar for image creation help Help about any command 通过 java - Djarmode = layertools - jar my - app . jar extract 即可 解压 jar 包 到 当前 目录 。 为了 方便 , 可以 直接 通过 Dockerfile 的 多 阶段 构建 进行 , Dockerfile 如下 : FROM eclipse - temurin : 11 - jre as builder WORKDIR application ARG JAR _ FILE = target / * . jar COPY $ { JAR _ FILE } application . jar RUN java - Djarmode = layertools - jar application . jar extract FROM eclipse - temurin : 11 - jre WORKDIR application COPY - - from = builder application / dependencies / . / COPY - - from = builder application / spring - boot - loader / . / COPY - - from = builder application / snapshot - dependencies / . / COPY - - from = builder application / application / . / ENTRYPOINT [ " java " , " org . springframework . boot . loader . JarLauncher " ] 如果 有 自 定义 分层 , 记得 按 顺序 加入 到 COPY 部分 一般 情况 下 target 下面 只有 一个 jar 后缀 的 包 , 此时 可以 直接 执行 下面 的 Docker 命令 : docker build - - tag imageName : version . 如果 有 多 个 jar , 需要 通过 参数 指定 : docker build - - build - arg JAR _ FILE = path / to / myapp . jar - - tag imageName : version . 构建 后 查看 镜像 信息 : IMAGE CREATED CREATED BY SIZE COMMENT e1 d22 f 48893 d 11 seconds ago ENTRYPOINT [ " java " " org . springframework . boot … 0 B buildkit . dockerfile . v 0 < missing > 11 seconds ago COPY application / application / . / # buildkit 55 . 1 kB buildkit . dockerfile . v 0 < missing > 11 seconds ago COPY application / snapshot - dependencies / . / # … 46 . 1 MB buildkit . dockerfile . v 0 < missing > 12 seconds ago COPY application / spring - boot - loader / . / # bu … 252 kB buildkit . dockerfile . v 0 < missing > 12 seconds ago COPY application / dependencies / . / # buildkit 216 MB buildkit . dockerfile . v 0 < missing > 10 minutes ago WORKDIR / application 0 B buildkit . dockerfile . v 0 < missing > 2 months ago / bin / sh - c set - eux ; arch = " $ ( dpkg - - print - … 210 MB < missing > 2 months ago / bin / sh - c # ( nop ) ENV JAVA _ VERSION = 8 u 322 0 B < missing > 2 months ago / bin / sh - c # ( nop ) ENV LANG = C . UTF - 8 0 B < missing > 2 months ago / bin / sh - c # ( nop ) ENV PATH = / usr / local / openj … 0 B < missing > 2 months ago / bin / sh - c { echo ' # / bin / sh ' ; echo ' echo " $ J … 27 B < missing > 2 months ago / bin / sh - c # ( nop ) ENV JAVA _ HOME = / usr / local / … 0 B < missing > 2 months ago / bin / sh - c set - eux ; apt - get update ; apt - g … 4 . 88 MB < missing > 2 months ago / bin / sh - c # ( nop ) CMD [ " bash " ] 0 B < missing > 2 months ago / bin / sh - c # ( nop ) ADD file : d 48 a 85028743 f16 ed … 80 . 4 MB 层 信息 : " RootFS " : { " Type " : " layers " , " Layers " : [ " sha 256 : 1401 df 2 b 50d 5 de 5a 743 b7 bac 3238 ef 3 b7 ce 905 ae 39 f 54707 b0 ebb 8 eda 3 ab 10 bc " , " sha 256 : 43015 d 7 c 36457 e91 ff 0994082 e 7016335 d5 aa 7690 e8 b 5 c 799 d 41 c2 bab 47f 086 c " , " sha 256 : f1 bceed 991 c 5891 bd 4 bf 3 ad6 e1 ade 5334 e2c 40 ada 40305 b 59 fbf 0 a 275 ebbed 17 " , " sha 256 : 7a 49a 2f 5a 65e 2f 57886 dd 32 ffe 85542283 b 249 ccefd 7 a 1 b 5379632030912 d 804 " , " sha 256 : 8791 c 93670 dee 0 e 973 efce 4424 ea 9 b33 caa 49 e7 ef 15c 8e 0 bde 1912 b 51 c 349524 " , " sha 256 : 94 c 6796 cee 53 f 42 ae 2478 affbfc 8510 c 97 c76 e 65015 ec 46309 f 83265 df 078 ef 8 " , " sha 256 : 033 be 8a 54968 fe 881 ce 71510862 eacc 0 c3 f 3 bdb 6 eb 2 af 1 a 9130704 bbe 7442 ae 8 " , " sha 256 : ab 0700832472168 ad 4a 9060 b3 fbedf 8 cc 44 f22 ff 1d 074 aebb 67 d9 ee 466796515 " , " sha 256 : 06a 62903 d 01189112 c 0 c8 b6 b68 debaa 170228 e 9 d 7cf 868 e1 b 9959001 e 877 a4 c4 " ] } 对 代码 进行 简单 修改 后 , 重新 构建 镜像 , 再次 查看 : IMAGE CREATED CREATED BY SIZE COMMENT cc 399 ec 3 ba 61 13 seconds ago ENTRYPOINT [ " java " " org . springframework . boot … 0 B buildkit . dockerfile . v 0 < missing > 13 seconds ago COPY application / application / . / # buildkit 52 . 9 kB buildkit . dockerfile . v 0 < missing > 3 minutes ago COPY application / snapshot - dependencies / . / # … 46 . 1 MB buildkit . dockerfile . v 0 < missing > 3 minutes ago COPY application / spring - boot - loader / . / # bu … 252 kB buildkit . dockerfile . v 0 < missing > 3 minutes ago COPY application / dependencies / . / # buildkit 216 MB buildkit . dockerfile . v 0 < missing > 13 minutes ago WORKDIR / application 0 B buildkit . dockerfile . v 0 < missing > 2 months ago / bin / sh - c set - eux ; arch = " $ ( dpkg - - print - … 210 MB < missing > 2 months ago / bin / sh - c # ( nop ) ENV JAVA _ VERSION = 8 u 322 0 B < missing > 2 months ago / bin / sh - c # ( nop ) ENV LANG = C . UTF - 8 0 B < missing > 2 months ago / bin / sh - c # ( nop ) ENV PATH = / usr / local / openj … 0 B < missing > 2 months ago / bin / sh - c { echo ' # / bin / sh ' ; echo ' echo " $ J … 27 B < missing > 2 months ago / bin / sh - c # ( nop ) ENV JAVA _ HOME = / usr / local / … 0 B < missing > 2 months ago / bin / sh - c set - eux ; apt - get update ; apt - g … 4 . 88 MB < missing > 2 months ago / bin / sh - c # ( nop ) CMD [ " bash " ] 0 B < missing > 2 months ago / bin / sh - c # ( nop ) ADD file : d 48 a 85028743 f16 ed … 80 . 4 MB 层 信息 : " RootFS " : { " Type " : " layers " , " Layers " : [ " sha 256 : 1401 df 2 b 50d 5 de 5a 743 b7 bac 3238 ef 3 b7 ce 905 ae 39 f 54707 b0 ebb 8 eda 3 ab 10 bc " , " sha 256 : 43015 d 7 c 36457 e91 ff 0994082 e 7016335 d5 aa 7690 e8 b 5 c 799 d 41 c2 bab 47f 086 c " , " sha 256 : f1 bceed 991 c 5891 bd 4 bf 3 ad6 e1 ade 5334 e2c 40 ada 40305 b 59 fbf 0 a 275 ebbed 17 " , " sha 256 : 7a 49a 2f 5a 65e 2f 57886 dd 32 ffe 85542283 b 249 ccefd 7 a 1 b 5379632030912 d 804 " , " sha 256 : 8791 c 93670 dee 0 e 973 efce 4424 ea 9 b33 caa 49 e7 ef 15c 8e 0 bde 1912 b 51 c 349524 " , " sha 256 : 94 c 6796 cee 53 f 42 ae 2478 affbfc 8510 c 97 c76 e 65015 ec 46309 f 83265 df 078 ef 8 " , " sha 256 : 033 be 8a 54968 fe 881 ce 71510862 eacc 0 c3 f 3 bdb 6 eb 2 af 1 a 9130704 bbe 7442 ae 8 " , " sha 256 : ab 0700832472168 ad 4a 9060 b3 fbedf 8 cc 44 f22 ff 1d 074 aebb 67 d9 ee 466796515 " , " sha 256 : 4c 0 f 187537195 a 34793722097 d 719 f 0 c 1247 fec 1648 a6 bdcf 08 f 42556348 af 74 " ] } 和 上面 相比 只有 最 上面 的 一 层 不同 , 通过 分层 尽 可能 利用 Docker 层 缓存 , 可以 减小 镜像 的 差异 , 使得 镜像 更新 时 , 只 需要 下载 有 差异 的 这 一 小 部分 。 构建 镜像 后 , 我们 通过 grype 检测 镜像 是否 存在 安全 漏洞 : $ grype 镜像 名 : 版本 ✔ Vulnerability DB [ no update available ] ✔ Loaded image ✔ Parsed image ✔ Cataloged packages [ 521 packages ] ✔ Scanned image [ 136 vulnerabilities ] NAME INSTALLED FIXED - IN TYPE VULNERABILITY SEVERITY apt 2 . 2 . 4 deb CVE - 2011 - 3374 Negligible aviator 3 . 3 . 0 java - archive GHSA - xpv 2 - 8 ppj - 79 hh Critical bsdutils 1 : 2 . 36 . 1 - 8 + deb 11 u1 deb CVE - 2022 - 0563 Negligible coreutils 8 . 32 - 4 + b1 deb CVE - 2017 - 18018 Negligible coreutils 8 . 32 - 4 + b1 ( won ' t fix ) deb CVE - 2016 - 2781 Low e2 fsprogs 1 . 46 . 2 - 2 ( won ' t fix ) deb CVE - 2022 - 1304 High gzip 1 . 10 - 4 1 . 10 - 4 + deb 11 u1 deb CVE - 2022 - 1271 Unknown libapt - pkg 6 . 0 2 . 2 . 4 deb CVE - 2011 - 3374 Negligible . . . 还 可以 对 代码 进行 检查 ( dir : . 当前 目录 ) : $ grype dir : . ✔ Vulnerability DB [ no update available ] ✔ Indexed . ✔ Cataloged packages [ 378 packages ] ✔ Scanned image [ 36 vulnerabilities ] NAME INSTALLED FIXED - IN TYPE VULNERABILITY SEVERITY aviator 3 . 3 . 0 java - archive GHSA - xpv 2 - 8 ppj - 79 hh Critical maven - aether - provider 3 . 1 . 1 java - archive CVE - 2021 - 26291 Critical maven - artifact 3 . 1 . 1 java - archive CVE - 2021 - 26291 Critical maven - common - artifact - filters 3 . 2 . 0 java - archive CVE - 2021 - 26291 Critical maven - core 3 . 1 . 1 java - archive CVE - 2021 - 26291 Critical maven - model 3 . 1 . 1 java - archive CVE - 2021 - 26291 Critical maven - model - builder 3 . 1 . 1 java - archive CVE - 2021 - 26291 Critical maven - repository - metadata 3 . 1 . 1 java - archive CVE - 2021 - 26291 Critical maven - settings 3 . 1 . 1 java - archive CVE - 2021 - 26291 Critical maven - settings - builder 3 . 1 . 1 java - archive CVE - 2021 - 26291 Critical maven - shared - utils 3 . 3 . 3 java - archive CVE - 2021 - 26291 Critical minio 8 . 3 . 8 java - archive CVE - 2021 - 21390 Medium minio 8 . 3 . 8 java - archive CVE - 2020 - 11012 High minio 8 . 3 . 8 java - archive CVE - 2021 - 21287 High 3 . 2 Buildpacks Spring Boot 插件 集成 了 Buildpacks 功能 , 插件 配置 如下 : < build > < plugins > < plugin > < groupId > org . springframework . boot < / groupId > < artifactId > spring - boot - maven - plugin < / artifactId > < executions > < execution > < goals > < goal > build - image < / goal > < / goals > < / execution > < / executions > < / plugin > < / plugins > < / build > 执行 mvn org . springframework . boot : spring - boot - maven - plugin : build - image 即可 构建 镜像 。 构建 完 镜像 后 , 运行 时 可能 会 遇到 中文 乱码 , 可以 通过 下面 两 种 方式 解决 : 1 运行 镜像 时 , 通过 环境 变量 指定 编码 : docker run - e JAVA _ OPTS = " - Dfile . encoding = UTF - 8 " < image _ name > 2 配置 spring boot 插件 , 添加 默认 的 JVM 配置 : < plugin > < groupId > org . springframework . boot < / groupId > < artifactId > spring - boot - maven - plugin < / artifactId > < version > $ { spring - boot . version } < / version > < executions > < execution > < goals > < goal > build - image < / goal > < / goals > < / execution > < / executions > < configuration > < image > < env > < BPE _ DELIM _ JAVA _ TOOL _ OPTIONS xml : space = " preserve " > < / BPE _ DELIM _ JAVA _ TOOL _ OPTIONS > < BPE _ APPEND _ JAVA _ TOOL _ OPTIONS > - Dfile . encoding = UTF - 8 < / BPE _ APPEND _ JAVA _ TOOL _ OPTIONS > < / env > < / image > < / configuration > < / plugin > 环境 变量 配置 规则 文档 https : / / github . com / paketo - buildpacks / environment - variables 上面 两 个 ENV 配置 介绍 如下 : 追加 分隔 符 使用 空格 , xml 配置 保留 空格 ( xml : space = " preserve " ) 。 追加 JVM 参数 四 、 Jar 包 运行 除了 使用 镜像 外 , 当 使用 Jar 包 运行 时 , 通过 jar xf xxxx . jar 可以 解压 jar 包 到 当前 目录 , 解压 后 通过 下面 命令 启动 : java org . springframework . boot . loader . JarLauncher 通过 这种 方式 运行 时 , 可以 相对 方便 的 修改 配置 文件 , 可以 替换 更新 某些 jar 依赖 , 不用 在 对 整个 fat jar 进行 操作 。

Spring容器初始化和解决循环依赖问题的分析

1.Spring IOC容器初始化过程: 2.bean的生命周期 Bean 容器找到配置文件中 Spring Bean 的定义。(beanDefintion) Bean 容器利用 Java Reflection API 创建一个Bean的实例。(执行构造方法) 如果涉及到一些属性值 利用 set()...

Spring启动流程探索

这个是留给子类的模板方法,允许子类对工厂执行一些处理,给Bean设置属性,单例Bean修改为多例,或者移除BeanDefinition从而避免某个Bean在spring容器中的创建。例如: 又或者用它的子类接口 ...

一文带你吃透Spring容器Bean核心模块,面试官再也为难不了你啦

如图1.2所示为Bean被Spring容器组装的简单过程。首先通过XML配置、注解配置或Java配置等3种方式配置元数据,然后装配BeanDefinition属性,如果有增强设置,如实现了BeanFactoryPostProcessor或BeanPostProcessor接口,则进行...

神奇!自己 new 出来的对象一样也可以被 Spring 容器管理

首先在构建 AutowireBeanFactoryObjectPostProcessor 对象时,传入了一个 AutowireCapableBeanFactory 对象,看过 Spring 源码的小伙伴就知道,AutowireCapableBeanFactory 可以帮助我们手动的将一个实例注册到 Spring 容器中...

Spring boot加载web容器tomcat流程源码分析

本文章主要描述spring boot加载web容器 tomcat的部分,为了避免文章知识点过于分散,其他相关的如bean的加载,tomcat内部流程等不做深入讨论。1、在springboot web工程中,全局上下文是...

Spring学习指南:浅析SpringIOC容器

Spring框架的核心是提供了依赖注入(DependencyInjection,DI)机制的控制翻转(Inversion of Control,loc)容器。本章将介绍Spring的DI机制以及loC容器,并展示如何使用Spring开发一个独立的Java应用。在本章的结尾,我们来看一些以...

03《Spring Boot 入门教程》Spring Boot 项目启动机制

Spring 本质上是一个容器,里面存放的是 Java 对象,放入容器的 Java 对象被称为 Spring 组件(Bean)。而 XML/注解/Java 类三种配置方式,只是形式不同,目的都是在容器中注册 Bean。三种方式可以同时使用,只是需要注意,...

Spring 配置文件的炼金术:如何制造容器化时代的完美配方|京东物流技术团队

综上所述,使用 Spring 的 application.properties 的 profile 配置方式更适合云原生和容器化的部署场景,因为它提供了环境无关性、配置集中化和容器友好性的优势。所以需要通过额…