JavaWeb-Springboot-2

配置优先级

image-20240311131236747

从上至下优先级

image-20240311131859933

命令行参数>java系统属性

Bean管理

Spring项目启动时,会把bean都创建好放到IOC容器当中,如果想要主动获取这些bean:

image-20240311133629292

image-20240311134105870

bean的获取

image-20240311134034393

在spring容器中,bean默认是单例的

作用域 说明
singleton 容器内同 名称 的 bean 只有一个实例(单例)(默认)
prototype 每次使用该 bean 时会创建新的实例(非单例)
request 每个请求范围内会创建新的实例(web环境中,了解)
session 每个会话范围内会创建新的实例(web环境中,了解)
application 每个应用范围内会创建新的实例(web环境中,了解)
1
2
3
4
5
6
@Scope("prototype")
@RestController
@RequestMapping("/depts")
public class DeptController {
}

注意事项

默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)。

prototype的bean,每一次使用该bean的时候都会创建一个新的实例。

实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性。

第三方bean

1
2
3
4
5
@Component
@Controller
@Service
@Repository

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

image-20240311141158692

一、用启动类,不建议

二、用第三方bean对象

用配置类声明第三方bean对象

image-20240311142532205

通过 @Bean注解的name/value属性指定bean名称,如果没有指定,默认是方法名

SpringBoot原理

起步依赖

Maven存在一个依赖传递,只要提供一个起步依赖

自动配置

SpringBoot的自动配置就是当spring容器启动之后,一些配置类,bean对象就自动的存入了IOC容器中,不需要我们手动去声明

当想要实现从另外一个项目引入

image-20240311145118080

springboot只能扫描到启动类及其子包,扫描不到其他的包

方案一:ComponentScan(使用繁琐,效率低)

1
2
3
4
5
@ComponentScan({"com.example","com.itheima"})
@SpringBootApplication
public class SpringbootWebConfig2Application {
}

image-20240311145621804

方案二:@Import 导入。

使用@Import导入的类会被Spring加载到IOC容器中,导入形式主要有以下几种

  • 导入 普通类
  • 导入 配置类
  • 导入 ImportSelector 接口实现类

@EnableXxxx注解,封装@Import注解

image-20240311150440558

image-20240311150642205

image-20240311150707450

源码跟踪

@SpringBootApplication

——->

1
2
3
4
5
6
7
8
9
10
@SpringBootConfigration
这个注解只是封装了一个注解@Configuration

@ComponentScan
用来scan子包之类的;组件扫描,默认扫描当前引导类所在包及其子包。


@EnableAutoConfiguration
自动配置的核心注解--》底层封装的@import注解
--》@Import(AutoConfigurationTmportSelector.class)

image-20240311155050608

@Conditional

以conditional开头的注解都是条件装配的注解

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

位置:方法、类

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

  • @ConditionalOnClass:判断环境中是否有对应字节码文件,才注册bean到IOC容器。
  • @ConditionalOnMissingBean:判断环境中没有对应的bean(类型 或 名称) ,才注册bean到IOC容器。
  • @ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器。

image-20240311155517846

image-20240311155831161

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Bean
@ConditionalOnClass(name = "io.jsonwebtoken.Jwts") //当前环境存在指定的这个类时,才声明该bean
public HeaderParser headerParser(){...}


@Bean
@ConditionalOnMissingBean //当不存在当前类型的bean时,才声明该bean
public HeaderParser headerParser(){...}
//指定的类型(value属性)或者 名称(name属性)
//通常用来设置一个默认的bean对象

@Bean
@ConditionalOnProperty(name = "name",havingValue = "itheima") //配置文件中存在对应的属性和值,才注册bean到IOC容器。
public HeaderParser headerParser(){...}
//name表示配置项的名字,havingValue表示配置项的值

image-20240311160715872

image-20240311160922672

自定义starter

image-20240311162501274

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

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

image-20240311162756249

image-20240311162942568

不想听了

总结

三层架构

image-20240311164359672

image-20240311164625979

image-20240311164645808

image-20240311164810304