后端开发原理
配置的优先级
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应用开发。
主要特点:
-
简化依赖管理:只需引入一个起步依赖,Spring Boot会自动引入相关依赖,避免手动添加多个依赖项。
-
版本一致性:Spring Boot管理的依赖版本经过测试,确保兼容性,减少版本冲突。
-
功能模块化:每个起步依赖对应一个功能模块,如
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);}
}