springboot原理

news/2024/9/20 21:41:05

(原创)springboot原理😄


一、配置优先级

> 命令行参数 > java系统属性 > properties文件 > yml文件(主流) > 环境变量

1.java系统属性和命令行参数设置在IDEA中的实现如图:上面的箭头是java系统属性配置端口号为9091,下面的箭头是命令行参数配置端口号为10010。
img

2.执行java指令,运行jar包时设置命令行参数和java系统属性的端口号:
java -jar -Dserver.port=9091 springboot-vue-0.0.1-SNAPSHOT.jar --server.port=10010

二、Bean管理

1.获取bean
  • 默认情况下,Spring项目启动时,会把bean都创建好放在IOC容器中,如果想主动获取这些bean,可以通过以下方式:
  • 1.根据name获取bean:
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Object bean = context.getBean("beanName");
  • 2.根据类型获取bean:
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Object bean = context.getBean(User.class);
  • 3.根据name和类型获取bean:
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Object bean = context.getBean("beanName", User.class);
2.配置作用域

1.默认情况下,Spring创建的Bean都是单例的,即在整个Spring容器中,Bean只有一个实例。
2.在Spring中,可以通过scope属性来配置Bean的作用域,常用的作用域有:

  • singleton:单例作用域,默认值,在整个Spring容器中,Bean只有一个实例。
  • prototype:原型作用域,每次使用Bean时,都会创建一个新的实例(非单例)。
  • request:请求作用域,每次HTTP请求范围内都会创建一个新的实例。
  • session:会话作用域,每次HTTP会话范围内都会创建一个新的实例。
  • application:应用作用域,每个Spring应用范围内都会创建一个实例。
3.配置作用域的示例:
@Configuration
public class AppConfig {@Bean@Scope("prototype") //每次使用bean时都会创建一个新的实例@Lazy //默认singleton的bean在容器启动时被创建。当有该注解时延迟初始化,即第一次使用该bean时才会创建。public User user() {return new User();}
}
4.第三方bean的管理

加上注解@Configuration配置类,加上注解@Bean配置第三方bean

@Configuration
public class AppConfig {@Beanpublic User user() {return new User();}
}

对第三方bean进行依赖注入:

如果第三方bean需要依赖其他bean,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。
对bean的名称修改:
通过@Bean注解的name/value属性可以修改bean的名称,如果不设置name属性,默认使用方法名作为bean的名称。

三、Springboot原理

问:Springboot比spring多了什么?答:多了起步依赖和自动配置。

1.起步依赖

定义

起步依赖就是项目启动时就将常用的依赖配置好,简化了依赖配置。

原理

利用maven传递依赖的特性.

2.自动配置(springboot原理的主要内容)

定义

当spring容器启动后,一些配置类、bean对象自动存入IOC容器中,不需要我们手动配置。从而简化了开发,省去了繁琐的配置操作。

自动配置的实现方式

方案一:通过@ComponentScan注解扫描指定包下的类,将类中的bean存入IOC容器中。

@Configuration
@ComponentScan("com.example.demo") <---指定扫描的包
public class AppConfig {
}

方案二:通过@Import导入。使用@Import导入的类会被加载到IOC容器中,导入的形式有以下几种:

  • 1.导入普通类:
  • 2.导入配置类:
  • 3.导入ImportSelector接口的实现类:
  • 4.EnableXxxx注解,封装@Import注解:
@Import({TokenParser.class}) //导入普通类,交给ioc容器管理
@Import({HeaderConfig.class}) //导入配置类,交给ioc容器管理
@Import({MyImportSelector.class}) //导入ImportSelector接口实现类,交给ioc容器管理@EnableHeaderConfig //导入EnableHeaderConfig注解,EnableHeaderConfig注解中封装了@Import注解,导入HeaderConfig配置类,交给ioc容器管理
@SpringBootApplicationpublic class SpringbootWebConfig2Application {public static void main(String[] args) {SpringApplication.run(SpringbootWebConfig2Application.class, args);}}

自动配置的底层原理

源码追踪:
@SpringBootApplication注解标识在SpringBoot工程引导类上,是最重要的注解。其中包含了三个子注解:@EnableAutoConfiguration:@ComponentScan、@SpringBootConfiguration。

1.@SpringBootConfiguration:标识该类是一个配置类,相当于@Configuration注解。

2.@ComponentScan:标识该类是一个组件扫描器,默认扫描当前引导类所在的包及其子包。

3.@EnableAutoConfiguration:开启自动配置,是SpringBoot自动配置的核心注解。其中包含了@Import注解,导入AutoConfigurationImportSelector类,该类实现了ImportSelector接口,重写了selectImports方法,该方法返回了一个字符串数组,数组中的每个字符串都是一个配置类的全限定名,这些配置类会被Spring容器加载,从而实现自动配置。

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

  • 位置
  • 方法、类。

  • 本身是一个父注解,派生出很多子注解:
  • @ConditionalOnProperty:当配置文件中有对应的属性和值时,才创建该bean到IOC容器。
  • @ConditionalOnMissingBean:当容器中不存在指定类型或者名称的bean时,才创建该bean到IOC容器。
  • @ConditionalOnClass:当类路径下存在指定类型的类或者字节码文件时,才创建该bean到IOC容器。
自定义starter
  • 定义

  • 自定义starter,就是自定义一个starter工程,将常用的依赖配置好,并编写自动配置类,将自动配置类封装到@EnableXxxx注解中,将@EnableXxxx注解封装到@SpringBootApplication注解中,从而实现自动配置。

  • 实现步骤

  • 案例:自定义阿里云oss-starter,完成阿里云OSS操作工具类AliyunossUtil的自动配置。引入依赖之后,要想使用阿里云OSS,注入AliyunOSSUtils直接使用即可。

  • 实现方法:

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

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

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

小知识:

mvn idea:module 是一个 Maven 命令,用于在 IntelliJ IDEA 中生成或更新 Maven 项目的模块文件。

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

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

相关文章

深度学习(FCN)

FCN是全卷积网络,用于做图像语义分割。通常将一般卷积网络最后的全连接层换成上采样或者反卷积网络,对图像的每个像素做分类,从而完成图像分割任务。 网络结构如下:这里并没有完全按照原始网络结构实现,而是尝试upsample和convTranspose2d结合的方式,看看有什么效果。 下…

旋转链表

旋转链表 开头: 对于链表的建立已经熟悉,那我们现在讲讲旋转链表的如何实现,当然旋转链表的建立是在已经掌握普通链表的基础上讲解。 正文: 旋转链表,顾名思义就是让链表“动起来”。即:使链表尾部最后的结点转到链表首部的位置。假设已经建立好一条6个结点的链表,它的初…

多线程五-线程通信之wait与notify

wait与notify用于syncronized的线程间通信的一种,wait用来阻塞线程并释放锁,notify用来唤醒线程。他们与condition作用基本一致,但是由于syncronized为jdk实现,阅读源码有难度,所以通过了解其原理,用来帮助我们后续理解condition的源码。 可以通过下面一张图来理解:下面…

帝国cms忘记了后台密码怎么办

如果你忘记了帝国CMS(EmpireCMS)的后台管理员密码,可以通过以下步骤来重置密码: 方法 1: 通过数据库重置密码登录数据库:使用数据库管理工具(如phpMyAdmin)连接到你的数据库。 登录数据库管理界面。找到用户表:通常表名为 phome_enewsuser(具体表名可能有所不同)。 打…

如何恢复对帝国CMS的访问,忘记账号密码的解决方案

如果你忘记了帝国CMS的后台管理员账号和密码,可以通过以下步骤来恢复对系统的访问: 方法 1: 通过数据库重置密码登录数据库:使用数据库管理工具(如phpMyAdmin)连接到你的数据库。 登录数据库管理界面。找到用户表:通常表名为 phome_enewsuser(具体表名可能有所不同)。 …

编程日记 后端tags过滤器

编程日记 后端tags过滤器这样查出来了所有的信息,不对 检查是这个地方有问题改掉 @Overridepublic List<User> searchUsersByTags(List<String> tagNameList) {//1.先查询所有用户QueryWrapper<User> queryWrapper = new QueryWrapper<>();List<Us…

PbootCms忘记后台管理员密码这样找回

如果你忘记了PbootCMS后台管理员的密码,可以通过以下步骤来重置密码: 方法 1: 使用官方提供的密码重置工具下载密码重置工具:下载官方提供的密码重置工具 resetpw.php。 将 resetpw.php 文件上传到网站根目录。访问重置工具:在浏览器中访问 http://[您的域名]/resetpw.php。…

织梦CMS 忘记后台管理员密码的一种解决方法

如果你忘记了织梦CMS(Dedecms)的后台管理员密码,并且拥有对MySQL数据库的操作权限,可以按照以下步骤重置密码: 步骤 1: 登录 MySQL 数据库打开 MySQL 客户端,如 phpMyAdmin 或命令行工具。 登录 MySQL 数据库:sqlmysql -u 用户名 -p输入密码后登录。步骤 2: 选择对应的数…