【JavaWeb学习Day22】

embedded/2025/3/10 21:42:40/

后端开发原理

配置的优先级

Springboot中支持三种格式的配置文件:(以及优先级)

(注意:虽然springboot支持多种格式的配置文件,但是在项目开发时,推荐统一使用一种格式的配置,yml是主流)

Springboot除了支持配置文件属性配置,还支持Java系统属性和命令行参数(优先级高)的方式进行属性配置

(系统属性配置优先级高于配置文件)

Bean管理

Bean的作用域:

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

java">@Slf4j
@RequestMapping("/depts")
@RestController
/*** 默认bean是单例的 - singleton ---> 默认是在项目启动时,就会创建这个bean对象,然后会将该bean对象存入IOC容器中*/
@Lazy //延迟初始化 - 懒加载 ---> 延迟到第一次使用的时候再创建这个bean
@Scope("prototype")//设置bean的作用域为prototype,实际开发中绝大部分Bean都是单例的,不用设置
​
public class DeptController {}

第三方Bean:

如果要管理的bean对象来自于第三方(不是自定义的),是无法用@Component以及衍生注解声明bean的,就需要用到@Bean注解。

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

(注意:1.如果要第三方bean需要依赖其他bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。2.通过@Bean注解的name或value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名)

SpringBoot原理

起步依赖:

在Spring Boot中,起步依赖(Starter Dependencies)是一种简化项目配置的方式。它们是一组预定义的依赖项,能够快速集成特定功能或技术栈。起步依赖通过spring-boot-starter-*的形式提供,例如spring-boot-starter-web用于Web应用开发。

主要特点

  1. 简化依赖管理:只需引入一个起步依赖,Spring Boot会自动引入相关依赖,避免手动添加多个依赖项。

  2. 版本一致性:Spring Boot管理的依赖版本经过测试,确保兼容性,减少版本冲突。

  3. 功能模块化:每个起步依赖对应一个功能模块,如spring-boot-starter-data-jpa用于JPA,spring-boot-starter-security用于安全功能。

示例

  • Web应用:引入spring-boot-starter-web,自动包含Spring MVC、Tomcat等依赖。

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    运行 HTML

  • 数据访问:引入spring-boot-starter-data-jpa,自动包含JPA、Hibernate等依赖。

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    运行 HTML

总结:

起步依赖通过预配置的依赖集合,简化了Spring Boot项目的依赖管理,使开发者能够快速集成所需功能。

自动配置:

简介:Springboot的自动配置就是当Spring项目启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。

实现方案:

方案一:主动指定组件扫描@ComponentScan的包(使用频繁,性能低,不推荐)

java">//自动配置实现方案一:@Component + @ComponentScan
@ComponentScan(basePackages = {"com.itheima","com.example"})
​
@SpringBootApplication//具备组件扫描的功能,但是默认扫描的是启动类所在包以及其子包
public class SpringbootWebConfigApplication {
​public static void main(String[] args) {SpringApplication.run(SpringbootWebConfigApplication.class, args);}
​
}
@SpringBootTest
class SpringbootWebTests {@Autowiredprivate TokenParser tokenParser;@Testpublic void TokenParserTest(){tokenParser.parse();}
}

方案二:@Import

java">//自动配置实现方案二:@Import
//@Import(TokenParser.class)//普通类
//@Import(HeaderConfig.class)//配置类
//@Import(MyImportSelector.class)//ImportSelector实现类 - 批量导入
@EnableHeaderConfig//@EnableXxxx注解,封装@Import注解   方便优雅(推荐)
@SpringBootApplication//具备组件扫描的功能,但是默认扫描的是启动类所在包以及其子包
public class SpringbootWebConfigApplication {public static void main(String[] args) {SpringApplication.run(SpringbootWebConfigApplication.class, args);}
}
源码跟踪:

该注解标识在Springboot工程引导类上,是Springboot中最最最重要的注解。该注解由三个部分组成:

1.@SpringBootConfiguration:该注解与 @Configuration注解作用相同,用来声明当前也是一个配置类。

2.@ComponentScan:组件扫描,默认扫描当前引导类所在的包及其子包。

3.@EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解

@ConditionalOnMissingBean该注解根据环境信息智能化决定被注解的bean注册为IOC容器的bean

(注意:在低版本(2.7.0以前)的SpringBoot项目中,自动配置类(XxxxAutoConfiguration)是定义在spring.factories中)

@Conditional:

作用:按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到Spring IOC容器中

位置:方法、类

@Conditional本身是一个父注解,派生出大量的子注解:

1.@ConditionalOnClass:判断环境中是否有对应字节码文件,才注册bean到IOC容器。

2.@ConditionalOnMissingBean:判断环境中没有对应的bean(类型 或 名称),才注册bean到IOC容器。

3.@ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器。

自定义自动配置类的核心是什么,如何完成自动配置?

1.定义自动配置类,通过 @Configuration 和条件注解定义需要自动注册的 Bean。

java">@Configuration  // 声明为配置类
@ConditionalOnClass(SomeService.class)  // 当类路径存在 SomeService 时生效
@EnableConfigurationProperties(SomeProperties.class)  // 启用配置属性绑定
public class SomeAutoConfiguration {
@Bean
@ConditionalOnMissingBean  // 当容器中无 SomeService 时注册
public SomeService someService(SomeProperties properties) {return new SomeService(properties.getConfig());
}}

2.将自动配置类配置在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中

在项目的 resources 目录下创建文件: META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 并在文件中添加自动配置类的全限定名:

com.example.SomeAutoConfiguration
自定义starter:

场景:在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用。而在SpringBoot的项目中,一般会将这些公共组件封装为SpringBoot的starter(包含起步依赖和自动配置的功能)

需求:自定义aliyun-oss-spring-boot-starter,完成阿里云oss操作工具类AliyunOSSOperator的自动配置。

目标:引入起步依赖后,要想使用阿里云OSS,注入AliyunOSSOperator直接使用即可。

步骤:

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

(只保留pom.xml)添加依赖:

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>

2.创建aliyun-oss-spring-boot-autoconfigure模块,在starter中引入该模块

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-oss-spring-boot-starter</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>
java">package com.itheima.controller;
​
@RestController
public class UploadController {
​@Autowiredprivate AliyunOSSOperator aliyunOSSOperator;
​@PostMapping("/upload")public String upload(MultipartFile image) throws Exception {//上传文件到阿里云 OSS
​String url = aliyunOSSOperator.upload(image.getBytes(),image.getOriginalFilename());System.out.println(url);
​return url;}
​
}

3.在aliyun-oss-spring-boot-autoconfigure模块中的定义自动配置功能,并定义自动配置文件META-INF/spring/xxxx.imports

java">/*** AliyunOSS自动配置类*/
@Configuration
@EnableConfigurationProperties(AliyunOSSProperties.class)
public class AliyunOSSAutoConfiguration {
​@Bean@ConditionalOnMissingBeanpublic AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties aliyunOSSProperties){return new AliyunOSSOperator(aliyunOSSProperties);}
​
}


http://www.ppmy.cn/embedded/171587.html

相关文章

Python Flask框架学习汇编

1、总览&#xff1a; 《Flask 全栈学习指南》 2、入门级&#xff1a; 《Python Flask Web 框架入门》 这篇博文条理清晰&#xff0c;由简入繁&#xff0c;案例丰富&#xff0c;分十五节详细讲解了Flask框架&#xff0c;强烈推荐&#xff01; 《python的简单web框架flask【…

Tomcat 新手入门指南

Tomcat 新手入门指南 Apache Tomcat 是一个开源的 Java Servlet 容器和 Web 服务器&#xff0c;广泛用于部署和运行 Java Web 应用程序。以下是 Tomcat 的入门指南&#xff0c;帮助你快速上手。 1. 安装 Tomcat 步骤 1: 下载 Tomcat 访问 Apache Tomcat 官网。选择适合的版…

使用PHP实现RESTful API:常见问题与解决方案

使用PHP实现RESTful API&#xff1a;常见问题与解决方案 引言 RESTful API&#xff08;Representational State Transfer&#xff09;是一种基于HTTP协议的架构风格&#xff0c;广泛应用于现代Web服务和移动应用开发中。PHP作为一种广泛使用的服务器端脚本语言&#xff0c;非…

基于DeepSeek的智慧医药系统(源码+部署教程)

运行环境 智慧医药系统运行环境如下&#xff1a; 前端&#xff1a; HTMLCSS后端&#xff1a;Java AIGCDeepseekIDE工具&#xff1a;IDEA技术栈&#xff1a;Springboot HTMLCSS MySQL 主要角色 智慧医药系统主要分为两个角色。 游客 尚未进行注册和登录。具备登录注册、…

数据库---1.0

1、windows安装MySQL 去官网MySQL :: MySQL Downloads下载msi安装包 2、选择好版本&#xff0c;点击Download 3、直接点击No thanks, just start my download.进行下载 4、下载完成&#xff0c;直接双击进行安装&#xff0c;并点击next继续进行安装 5、选择好安装路径以及数…

Java在小米SU7 Ultra汽车中的技术赋能

目录 一、智能驾驶“大脑”与实时数据 场景一&#xff1a;海量数据的分布式计算 场景二&#xff1a;实时决策的毫秒级响应 场景三&#xff1a;弹性扩展与容错机制 技术隐喻&#xff1a; 二、车载信息系统&#xff08;IVI&#xff09;的交互 场景一&#xff1a;Android Automo…

vue项目纯前端把PDF转成图片并下载

项目需求是把一个pdf转成图片&#xff0c;并在最后添加上二维码&#xff0c;然后下载下来。 经过一番研究以后&#xff0c;作此记录。 主要用到了pdfjs-dist这个包&#xff0c;我用的是2.16.105版本。 废话不多说&#xff0c;直接上代码。 先下载node_modules包 npm i pdf…

网络安全rt是什么意思

1.什么时EDR :完全不同以往的端点被防护思路&#xff0c;而是通过云端威胁情报&#xff0c;机器学习&#xff0c;异常行为分析&#xff0c;攻击指示器等方式&#xff0c;主动发现来自外部或内部的安全威胁 。并进行自动化的阻止&#xff0c;取证&#xff0c;补救和溯源从而有效…