[Java]SpringBoot能力进阶

配置优先级

SpringBoot中支持三种格式的配置文件

  1. 优先级: application.properties文件 > application.yml文件 > application.yaml文件

SpringBoot除了通过配置文件配置属性, 还支持Java系统属性和命令行参数的方式 进行属性配置

1.在IDEA中配置java系统属性和命令行参数

2.在命令行中配置java系统属性和命令行参数

配置文件和java属性以及命令行参数的优先级

bean的管理

手动获取bean

默认情况下, Spring项目启动时, 会把bean对象都创建好放在IOC容器中, 如果需要主动获取这个bean, 可以通过下面的方法

@SpringBooTest
class SpringbootWebConfig2ApplicationTest {@Autowiredprivate ApplicationContext applicationContext;  //注入IOC容器对象//获取bean对象//根据bean的名称获取//获取到的bean是Object类型, 所以要进行强转 DeptController bean1 = (DeptController) applicationContext.getBean("deptController");System.out.println(bean1);//根据bean的类型获取DeptController bean2 = applicationContext.getBean(DeptController.class);System.out.println(bean2);//根据bean的名称及类型获取DeptController bean3 = applicationContext.getBean("deptController",DeptController.class);System.out.println(bean3);
}

执行效果

  1. 默认情况下bean是单例模式, 所以拿到的是同一个bean对象

bean的作用域

Spring支持五种作用域, 后三种在web环境才生效

可以通过 @Scope("作用域值")注解 设置bean的作用域

  1. 默认springboot中的bean, 在容器启动时就会被创建,
  2. 可以使用 @Lazy注解 来延迟初始化(延迟到第一次使用时创建)
  3. prototype的bean, 每一次使用该bean的时候都会创建一个新的实例
  4. 实际开发中, 绝大部分的bean都是单例的, 不需要配置scope属性

第三方bean

如果要管理的bean对象来自于第三方, 是无法用 Component及其衍生注解 声明bean的, 而是需要SpringBoott提供的 @Bean注解 完成bean的声明

@SpringBootTest
class TliasWebManagementApplicationTests {// 第三方bean的管理@Testpublic void testThirdBean() throws Exception {SAXReader saxReader = new SAXReader();Document document = saxReader.read(this.getCLass().getClassLoader().getResource('1.xml'));Element rootElement = document.getRootElement();String name = rootElement.element("name").getText();String age = rootElement.element("age").getText();System.out.printIn(name + ":" + age)}}
  1. 第三方文件是只读的, 无法通过添加 @Compoment 注解的形式完成bean的声明
  2. 此时使用第三方对象是只能手动创建, 但是执行效率比较低, 因为无法复用该对象, 耗费资源

在启动类中注册第三方bean对象, 非常简单, 但是不推荐, 因为启动类要保持简洁

@SpringBootApplication
public class TliasWebManagementApplication {public static void main(String[] args) {SpringApplication.run(TliasWebManagementApplication.class, args);}// 声明第三方bean// 将当前方法的返回值对象,交给IOC容器管理,称为IOC容器的bean @Beanpublic SAXReader saxReader() {return new SAXReader();   }
}
@SpringBootTest
class TliasWebManagementApplicationTests {@Autowiredprivate SAXReader saxReader;@Testpublic void testThirdBean() throws Exception {// 不再需要手动创建对象,而是自动注入bean对象// SAXReader saxReader = new SAXReader();Document document = saxReader.read(this.getCLass().getClassLoader().getResource('1.xml'));Element rootElement = document.getRootElement();String name = rootElement.element("name").getText();String age = rootElement.element("age").getText();System.out.printIn(name + ":" + age)}}

若要管理第三方bean对象, 建议对这些bean进行集中分类配置, 可以通过 @Configuration注解 声明配置类

@Configuration //声明为配置类
public class commonConfig {// 声明第三方bean// 将当前方法的返回值交给IOC容器管理,成为bean对象@Bean  public SAXReader saxReader(DeptServer deptServer){// 第三方bean依赖其他的bean对象, 可以通过形参声明, // springboot会根据类型自动注入对象System.out.printIn(deptServer);return new SAXReader();}// 还可以继续声明其他bean
}
@SpringBootTest
class TliasWebManagementApplicationTests {// 使用时注入bean@Autowiredprivate SAXReader saxReader;@Testpublic void testThirdBean() throws Exception {Document document = saxReader.read(this.getCLass().getClassLoader().getResource('1.xml'));Element rootElement = document.getRootElement();String name = rootElement.element("name").getText();String age = rootElement.element("age").getText();System.out.printIn(name + ":" + age)}}

  1. 项目中自定义的对象, 使用@Componet及其衍生注解, 即可交给IOC容器管理
  2. 项目引用的第三方对象, 使用 @Bean注解, 交给IOC容器管理

SpringBoot原理

Spring Boot框架简化Spring配置的核心就是 起步依赖 和 自动配置

  1. Spring家族的框架都是基于Spring Framework框架运行的,
  2. 直接基于Speing Framework进行项目开发, 需要我们进行大量的依赖引入和配置, 这个过程非常繁琐,
  3. 所以Spring又推出了Spring Boot框架来简化Spring Frameword的配置,
  4. 让我们可以专注于业务的实现, 减少框架层面的配置

起步依赖

如果使用spring框架开发, 需要自己下载用到的依赖, 还要管理依赖的版本

使用springboot开发, 只需要引入web开发的起步依赖, 就完成了依赖的配置

  1. 起步依赖的原理, 就是maven的依赖传递, 只要引入起步依赖, 与其相关的依赖也会被引入
  2. 并且项目中依赖的版本也会由起步依赖统一管理, 不会出现版本冲突的问题

自动配置

Springboot的自动配置就是当spring容器启动后, 我们自己定义的bean对象, 还有一些内置的配置类和bean对象就自动创建并存入到ioc容器中, 不需要我们手动去声明, 就可以注入使用, 从而简化开发, 省去了繁琐的配置操作

自动配置的关键: 如何把pom.xml中依赖的jar包中的配置类自动的加载到ICO容器中?

实现方案

自动配置的核心就是包扫描, 想要实现自动配置, 只需要让spring扫描到依赖包, spring就会自动把依赖包的配置类交给IOC容器管理

方案1: 在启动类中, 使用@ComponentScan() 注解修改组件扫描的范围, 把第三方包添加到组件扫描的范围内

  1. 实际开发中会使用很多第三方包, 如果都要手动添加, 需要频繁修改, 并不合适

方案2: 使用 @import 导入的类会被Spring加载到IOC容器中, 支持多种导入形式

  1. 使用导入类的方式完成自动配置, 我们要清楚的知道第三方依赖所用到的配置类和bean对象, 还是繁琐

方案3: 使用第三方提供的@EnableXxxx注解

  1. 第三方依赖包的作者, 肯定比我们更加清楚, 依赖包中使用到了哪些配置类,
  2. 所以作者会自己封装@EnableXxxx注解, 注解中使用@import注解导入使用到的配置类和bean对象
  3. 我们只需要使用作者提供的 @EnableXxxx注解, 就可以完成依赖的自动配置, 把依赖交给IOC容器管理

源码跟踪

@Conditional注解

原理总结

  1. 实现自动装配的核心注解是 @EnableAutoConfiguration
  2. @EnableAutoConfiguration 注解 封装了 @Import注解
  3. @Import注解 引入了自动配置类,
  4. 自动配置类 实现了selectImport方法,
  5. selectImport方法会读取jar包的两份配置文件
  6. 配置文件中 有很多自动配置类
  7. 满足装配条件的自动配置类会被方法返回, 最终被IOC容器管理

自定义starter

  1. 官方起步依赖命名: spring-boot-starter-功能:版本
  2. 第三方起步依赖命名: 功能-spring-boot-starter:版本

实现步骤

1.创建aliyun-oss-spring-boot-starte模块

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.5</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.aliyun.oss</groupId><artifactId>aliyun-oss-spring-boot-starter</artifactId><version>0.0.1-SNAPSHOT</version><properties><java.version>11</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency>// 引入自动配置模块<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies></project>

2.创建 aliyun-oss-spring-boot-auticonfigure 模块, 该模块要实现自动配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.5</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.aliyun.oss</groupId><artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId><version>0.0.1-SNAPSHOT</version><properties><java.version>11</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--阿里云OSS--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version></dependency><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version></dependency><dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version></dependency><!-- no more than 2.3.3--><dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version></dependency></dependencies></project>

3.引入文件, 并且改造部分代码

package com.aliyun.oss;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;// 手动提供get/set方法 替换 @Data注解public String getEndpoint() {return endpoint;}public void setEndpoint(String endpoint) {this.endpoint = endpoint;}public String getAccessKeyId() {return accessKeyId;}public void setAccessKeyId(String accessKeyId) {this.accessKeyId = accessKeyId;}public String getAccessKeySecret() {return accessKeySecret;}public void setAccessKeySecret(String accessKeySecret) {this.accessKeySecret = accessKeySecret;}public String getBucketName() {return bucketName;}public void setBucketName(String bucketName) {this.bucketName = bucketName;}
}
package com.aliyun.oss;import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
/*** 阿里云 OSS 工具类* @Component 和 @Autowired 不能使用*/
public class AliOSSUtils {// 阿里云参数配置对象private AliOSSProperties aliOSSProperties;public AliOSSProperties getAliOSSProperties() {return aliOSSProperties;}public void setAliOSSProperties(AliOSSProperties aliOSSProperties) {this.aliOSSProperties = aliOSSProperties;}/*** 实现上传图片到OSS*/public String upload(MultipartFile file) throws IOException {//获取阿里云OSS参数String endpoint = aliOSSProperties.getEndpoint();String accessKeyId = aliOSSProperties.getAccessKeyId();String accessKeySecret = aliOSSProperties.getAccessKeySecret();String bucketName = aliOSSProperties.getBucketName();// 获取上传的文件的输入流InputStream inputStream = file.getInputStream();// 避免文件覆盖String originalFilename = file.getOriginalFilename();String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));//上传文件到 OSSOSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(bucketName, fileName, inputStream);//文件访问路径String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;// 关闭ossClientossClient.shutdown();return url;// 把上传到oss的路径返回}}

4.定义自动配置类

package com.aliyun.oss;import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration // 标明配置类
@EnableConfigurationProperties(AliOSSProperties.class) //把类交给IOC容器管理
public class AliOSSAutoConfiguration {@Bean // 把对象交给IOC容器管理public AliOSSUtils aliOSSUtils(AliOSSProperties aliOSSProperties){AliOSSUtils aliOSSUtils = new AliOSSUtils();aliOSSUtils.setAliOSSProperties(aliOSSProperties);return aliOSSUtils;}}

5.定义自动加载文件

右键resources -> new -> Directory -> META-INF/spring

右键 META-INF/spring -> new File -> 文件名 -> ok

文件名: org.springframework.boot.autoconfigure.AutoConfiguration.imports

6.以后使用阿里云oss只需要引入我们自定义的起步依赖就可以了

<dependency><groupId>com.aliyun.oss</groupId><artifactId></artifactId><version>0.0.1-SNAPSHOT</version></dependency>
#阿里云OSS
aliyun:oss:endpoint: https://oss-cn-beijing.aliyuncs.comaccessKeyId: LTAI5tFE6zMbdaLyhSvNM9J1accessKeySecret: jeHMl9EBnCOErmomdgKrZrmCKMcKTtbucketName: tlias-web-practice
@RestController
public class UploadController {// 注入自定义依赖中的工具类@Autowiredprivate AliOSSUtils aliOSSUtils;@PostMapping("/upload")public String upload(MultipartFile image) throws Exception {//上传文件到阿里云 OSSString url = aliOSSUtils.updload(image);return url;}}

技术归类

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

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

相关文章

网络安全-shire写任务计划、反弹shell、写私钥

目录 一、环境 二、 介绍 三、开始做题 四、写公钥 一、环境 网上自己找 二、 介绍 我们经过前面文章很清楚知道&#xff0c;shiro是将数据存储在内存当中&#xff0c;内存落盘实现一个数据存储&#xff0c;而当其结合python&#xff0c;python将登录的session存储到shiro里…

python绘制月亮

import matplotlib import matplotlib.pyplot as plt import moviepy.editor as mpymatplotlib.rcParams[font.family] SimHei# 坐标列表 positions [(0, 0), (1 / 4, 1 / 4), (1 / 3, 1 / 4), (1 / 2, 1 / 4), (2 / 3, 1 / 4),(3 / 4, 1 / 4), (1, 1 / 4), (5 / 4, 1 / 4), …

桌面上的文件突然不见了怎么找回?快速恢复技巧分享

在日常使用电脑的过程中&#xff0c;我们习惯于将经常使用的文件或者快捷方式放置在桌面上&#xff0c;以便于快速访问。然而&#xff0c;有时我们会发现桌面上的某些文件突然不见了&#xff0c;这可能会让人感到惊慌和困惑。面对这种情况&#xff0c;我们应该如何找回这些突然…

路由器全局配置DHCP实验简述

一、路由器配置 reset saved-configuration Warning: The action will delete the saved configuration in the device. The configuration will be erased to reconfigure. Continue? [Y/N]:y Warning: Now clearing the configuration in the device. Info: Succeeded in c…

02 基于STM32的按键控制继电器驱动电机

本专栏所有源资料都免费获取&#xff0c;没有任何隐形消费。 注意事项&#xff1a;STM32仿真会存在各种各样BUG&#xff0c;且尽量按照同样仿真版本使用。本专栏所有的仿真都采用PROTEUS8.15。 本文已经配置好STM32F103C8T6系列&#xff0c;在PROTUES仿真里&#xff0c;32单片…

教程 | ArcGIS Pro如何自动保存数据编辑内容

目录 1、工程自动保存 2、数据编辑自动保存 世界上最痛苦的事情就是&#xff1a; 软件崩溃&#xff0c;我没保存&#xff01;&#xff01;&#xff01; 电脑死机&#xff0c;我没保存&#xff01;&#xff01;&#xff01; 突然断电&#xff0c;我没保存&#xff01;&…

开源项目的悲哀

开源下载器 Aria 的开发者因为其项目被诈骗人员使用&#xff0c;导致开发者遭受跨省追捕&#xff0c;作者于 2024 年 8 月 16 日在 GitHub 上宣布删除了项目的全部源码。 Aria 是一个高性能、轻量级、易于使用的文件下载框架&#xff0c;主要应用于Android 平台&#xff0c;拥有…

10个A/B测试指标以分析结果和衡量成功

为什么A/B测试分析很重要&#xff1f; 到现在&#xff0c;您可能已经熟悉了A/B测试的基本概念及其用途。 简而言之&#xff0c;A/B测试是将两个或多个着陆页、营销资产或单个元素&#xff08;如标题&#xff09;进行对比&#xff0c;以帮助您找出哪个表现最好。 这些测试帮助…

Varjo在芬兰开设新工厂,以满足国防部门在XR模拟训练中的需求

在军事国防领域&#xff0c;全新技术的投入使用最看重的就是保密与安全。作为全球领先的XR头戴式显示器提供商Varjo&#xff0c;近日正式宣布将在位于芬兰的赫尔辛基开设一家新的安全制造工厂。 此次工厂扩建将使Varjo能够满足国防训练和模拟领域对其高分辨率XR解决方案日益增…

Qwen2-VL环境搭建推理测试

引子 2024年8月30号&#xff0c;阿里推出Qwen2-VL&#xff0c;开源了2B/7B模型&#xff0c;处理任意分辨率图像无需分割成块。之前写了一篇Qwen-VL的博客&#xff0c;感兴趣的童鞋请移步&#xff08;Qwen-VL环境搭建&推理测试-CSDN博客&#xff09;&#xff0c;这么小的模…

揭秘!当业务方需求模糊,产品经理如何施展‘化雾为金’的神奇策略!

引言 在产品管理的实践中&#xff0c;产品经理经常会遇到业务方无法清晰表达需求的情况。这可能是由于业务方对问题的理解不够深入&#xff0c;或者缺乏将业务需求转化为产品需求的经验。作为资深产品经理&#xff0c;我们需要采取一系列策略来应对这一挑战&#xff0c;确保产…

​‌Macbook如何玩《黑神话:悟空》‌2024最新详细方法

‌Mac用户可以通过几种方法玩《黑神话&#xff1a;悟空》‌。 ‌使用虚拟机‌&#xff1a;通过Parallels Desktop等虚拟机软件&#xff0c;在Mac上运行Windows系统&#xff0c;并在其中安装和运行《黑神话悟空》。这种方法需要Mac电脑满足游戏的基础配置要求。 不过如果电脑有虚…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于模型-数据混合驱动的区域能源互联网韧性在线评估》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

带你深入了解C语言指针(五)

目录 前言一、数组和指针笔试题解析1.整型数组2.字符数组2.1 sizeof2.2strlen()2.2.1字符数组2.2.2字符串2.2.3字符串指针2.2.4二维数组 总结 前言 前面我们已经讲指针的主要知识学完了&#xff0c;这期我们主要进行一些题目的分析&#xff1b;话不多说&#xff0c;正文开始。…

JAVA操作Itext向pdf模板中填充数据,图片,复选框!

第一步模板制作&#xff1a; 在word中先把模板画好&#xff0c;另存为pdf&#xff0c;具体步骤为&#xff1a;wps—》工具------》开发工具。如图所示 图片也是设置为文本域&#xff0c;千万不要设置为图片域&#xff0c;否则图片会被覆盖&#xff01; 图片也是设置为文本域&a…

攻防世界---->流浪者

做题笔记。 下载 查壳。 32ida打开。 程序运行状态&#xff1a; 一开始以为&#xff0c;&#xff0c;&#xff0c;base62 去解密 不对。。哈哈哈。 跟进看看。 动调一下发现&#xff0c;input不在这个函数里面。 对函数进行跟踪。 逆推就好。 先通过密文&#xff0c;逆推密文…

动手学习RAG: 大模型向量模型微调 intfloat/e5-mistral-7b-instruct

动手学习RAG: 向量模型动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习动手学习RAG&#xff1a;rerank模型微调实践 bge-reranker-v2-m3动手学习RAG&#xff1a;迟交互模型colbert微调实践 bge-m3动手学习RAG: 大模型向量模型微调 intfloat/e5-mistral-7b-instruct动手学…

5.内容创作的未来:ChatGPT如何辅助写作(5/10)

引言 在信息爆炸的时代&#xff0c;内容创作已成为连接品牌与受众、传递信息与知识、以及塑造文化与观念的重要手段。随着数字媒体的兴起&#xff0c;内容创作的需求日益增长&#xff0c;对创作者的写作速度和质量提出了更高的要求。人工智能&#xff08;AI&#xff09;技术的…

国家标准参编周期一般是多久?参编的流程有哪些?

在当今快速发展的时代&#xff0c;标准的重要性日益凸显。国家标准作为规范行业发展、保障产品质量、促进技术进步的重要依据&#xff0c;吸引着众多企业积极参与其中。而国家标准参编&#xff0c;为企业提供了一个提升自身竞争力、展示技术实力的良好平台。那么&#xff0c;国…

SLAM面经1(百度)

百度面经 百度共三面,如果面试效果俱佳,会增加一个hr面。前二面主要是技术面,分为在线coding+代码知识+专业知识+工程能力。第三面是主管面,偏向于管理方面,和hr面相似。 一面 1)在线coding 在线coding的考试内容为下面力扣的变种。 2)专业面 (1)VINS-FUSION与ORB…