项目架构知识点总结

项目架构知识点总结

  • 【一】重要注解
    • 【1】@SpringBootApplication
      • (1)⭐️@ComponentScan 注解
      • (2)⭐️@EnableAutoConfiguration 注解
      • (3)⭐️@SpringBootConfiguration 注解
      • (4)@Inherited 注解
      • (5)@Documented 注解
      • (6)@Retention() 注解
      • (7)@Target() 注解
      • (8)总结
    • 【2】@SpringBootApplication的参数
    • 【3】@MapperScan
      • (1)@Mapper注解的使用
      • (2)@MapperScan注解的使用
  • 【二】SpringApplication执行流程
  • 【三】pom依赖引入jar包
  • 【四】项目启动脚本命令

【一】重要注解

【1】@SpringBootApplication

在这里插入图片描述

通过这个结构,我们不难发现,SpringBoot将我们项目的启动类放在了classpath:/com/rain/abdemo01/下,而在这个路径及其子路径下,我们在后续的开发中还会接连定义些其他的需要注入到springboot容器中的组件

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}
), @Filter(type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {@AliasFor(annotation = EnableAutoConfiguration.class)Class<?>[] exclude() default {};@AliasFor(annotation = EnableAutoConfiguration.class)String[] excludeName() default {};@AliasFor(annotation = ComponentScan.class,attribute = "basePackages")String[] scanBasePackages() default {};@AliasFor(annotation = ComponentScan.class,attribute = "basePackageClasses")Class<?>[] scanBasePackageClasses() default {};
}

归纳如下:
(1)@SpringBootApplication实质上是对@SpringBootConfiguration(即@Configuration)与@EnableAutoConfiguration以及@ComponentScan的组合注解。
(2)@SpringBootConfiguration(即@Configuration)表示被注解的启动类为SpringBoot应用的一个主配置类。
(3)@EnavleAutoConfiguration表示在这个主配置类上开启SpringBoot的自动配置。
(4)@ComponentScan则定义了SpringBoot容器的组件扫描规则。

springboot这么做的原因再结合对SpringBootApplication注解定义中的ComponentScan注解,我们便可知道,启动类的位置定义了springboot容器的包扫描位置,即启动类所在包及其子包。这更加凸显了springboot的"约定大于配置"的先进理念。
但是如果一定要修改启动类的位置,为了使程序中的其他所有组件被springboot容器扫描到,在技术上也可做如下配置,但是仅供参考,并不推荐。

(1)⭐️@ComponentScan 注解

@ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

(1)@ComponentScan这个注解在Spring中很重要,它对应XML配置中的元素,@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。

我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。

注:所以SpringBoot的启动类最好是放在root package下,因为默认不指定basePackages。

(2)@ComponentScan告诉Spring 哪个packages 的用注解标识的类 会被spring自动扫描并且装入bean容器。
例如,如果你有个类用@Controller注解标识了,那么,如果不加上@ComponentScan,自动扫描该controller,那么该Controller就不会被spring扫描到,更不会装入spring容器中,因此你配置的这个Controller也没有意义。

@ComponetScan注解的作用是为了进行组件的扫描,主要作用扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。

(3)参数的作用

basePackageClasses:对basepackages()指定扫描注释组件包类型安全的替代。excludeFilters:指定不适合组件扫描的类型。includeFilters:指定哪些类型有资格用于组件扫描。lazyInit:指定是否应注册扫描的beans为lazy初始化。nameGenerator:用于在Spring容器中的检测到的组件命名。resourcePattern:控制可用于组件检测的类文件。scopedProxy:指出代理是否应该对检测元件产生,在使用过程中会在代理风格时尚的范围是必要的。scopeResolver:用于解决检测到的组件的范围。useDefaultFilters:指示是否自动检测类的注释 

(2)⭐️@EnableAutoConfiguration 注解

@EnableAutoConfiguration 简单概括一下就是,借助@Import的支持,收集和注册特定场景相关的bean定义。

(1)@EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加载到IoC容器。
(2)@EnableMBeanExport是通过@Import将JMX相关的bean定义加载到IoC容器。

而@EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器,仅此而已!

@EnableAutoConfiguration作为一个复合Annotation,其自身定义关键信息如下:
在这里插入图片描述
其中,最关键的要属@Import(AutoConfigurationImportSelector.class),借助AutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。

(3)自动配置幕后英雄:SpringFactoriesLoader详解
SpringFactoriesLoader属于Spring框架私有的一种扩展方案,其主要功能就是从指定的配置文件META-INF/spring.factories加载配置。

在这里插入图片描述
配合@EnableAutoConfiguration使用的话,它更多是提供一种配置查找的功能支持,即根据@EnableAutoConfiguration的完整类名org.springframework.boot.autoconfigure.EnableAutoConfiguration作为查找的Key,获取对应的一组@Configuration类

在这里插入图片描述
上图就是从SpringBoot的autoconfigure依赖包中的META-INF/spring.factories配置文件中摘录的一段内容,可以很好地说明问题。

所以,@EnableAutoConfiguration自动配置的魔法骑士就变成了:从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。

(3)⭐️@SpringBootConfiguration 注解

@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {@AliasFor(annotation = Configuration.class)boolean proxyBeanMethods() default true;
}

当我们在项目中使用了 @Indexed 之后,编译打包的时候会在项目中自动生成METAINT/spring.components文件。根据该文件进行扫描注入,可以提高效率,相当于为为扫描的类创建了索引文件,只需要一次io就能完成全部类的扫描。
当Spring应用上下文执行ComponentScan扫描时,META-INT/spring.components将会被CandidateComponentsIndexLoader 读取并加载,转换为CandidateComponentsIndex对象,这样的话@ComponentScan不在扫描指定的package,而是读取CandidateComponentsIndex对象,从而达到提升性能的目的。

简单点说,使用了@Indexed注解后,原来@ComponentScan可能需要扫描非常多的类,现在只需要在启动后对spring.components进行一次io,将类路径写入文件,后续将只需要读取文件即可获得所有类路径

proxyBeanMethods属性是是否为被注解的类修饰的属性每次都去ioc容器里获取它的代理类,默认为true开启,设置为false关闭后,每次获取这个类的实例会创建一个新的对象且不由IOC容器进行管理

(4)@Inherited 注解

关于java中元注解Inherited 的使用说明

首先解释下元注解,就是用来中声明注解类型时需要使用到的注解。

Inherited作用是,使用此注解声明出来的自定义注解,在使用此自定义注解时,如果注解在类上面时,子类会自动继承此注解,否则的话,子类不会继承此注解。这里一定要记住,使用Inherited声明出来的注解,只有在类上使用时才会有效,对方法,属性等其他无效。
在这里插入图片描述
声明的此注解使用了Inherited元注解,表示此注解用在类上时,会被子类所继承

(5)@Documented 注解

Documented注解表明这个注释是由 javadoc记录的,在默认情况下也有类似的记录工具。 如果一个类型声明被注释了文档化,它的注释成为公共API的一部分。

(6)@Retention() 注解

RetentionPolicy这个枚举类型的常量描述保留注释的各种策略,它们与元注释(@Retention)一起指定注释要保留多长时间

(7)@Target() 注解

ElementType 这个枚举类型的常量提供了一个简单的分类:注释可能出现在Java程序中的语法位置(这些常量与元注释类型(@Target)一起指定在何处写入注释的合法位置)

(8)总结

因为spring默认情况下只能扫描到我们项目启动类下的组件,但是对于项目引入的jar包文件我们就必须手动扫描,springboot通过读取jar包文件下的META-INF/spring.factories文件,将其中指定的需要装配的类读取到IOC容器中,从而使得非spring官方的组件也能够不修改原有代码的情况下,只需要增加一部分自动装配的文件配置和自动装配类,即可完成与springboot的整合,充分体现了Java中SPI的设计理念

【2】@SpringBootApplication的参数

@SpringBootApplication(scanBasepackages=“包名”)
放在类上,声明这是一个SpringBoot应用,该类会有一个main方法作为Boot程序的开始。

拓展:
(1)scanBasepackages可以重新定义这个SpringBoot覆盖的范围,默认是本包及其子包
(2)该注解=>@SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan

【3】@MapperScan

(1)@Mapper注解的使用

先看看@Mapper
作用:在接口类上添加了@Mapper,在编译之后会生成相应的接口实现类。添加位置:接口类上面,代码如下所示:

@Mapper
public interface StudentMapper {//todo
}

(2)@MapperScan注解的使用

作用:指定要变成实现类的接口所在的包,包下面的所有接口在编译之后都会生成相应的实现类。添加位置:是在Springboot启动类上面添加

@SpringBootApplication
@MapperScan("cn.mybatis.mappers")
public class SpringbootMybatisDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringbootMybatisDemoApplication.class, args);}
}

添加@MapperScan(“cn.mybatis.mappers”)注解以后,cn.mybatis.mappers包下面所有的接口类,在编译之后都会生成相应的实现类

在不使用@MapperScan前,我们需要直接在Mapper类上面添加注解@Mapper,这种方式要求每一个Mapper类都需要添加此注解,非常麻烦,属于重复劳动。通过使用@MapperScan注解,可以让我们不用为每个Mapper类都添加@Mapper注解。

【二】SpringApplication执行流程

(1)如果我们使用的是SpringApplication的静态run方法,那么,这个方法里面首先要创建一个SpringApplication对象实例,然后调用这个创建好的SpringApplication的实例方法。在SpringApplication实例初始化的时候,它会提前做几件事情:

根据classpath里面是否存在某个特征类(org.springframework.web.context.ConfigurableWebApplicationContext)来决定是否应该创建一个为Web应用使用的ApplicationContext类型。

使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer。

使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener。

推断并设置main方法的定义类。

(2)SpringApplication实例初始化完成并且完成设置后,就开始执行run方法的逻辑了,方法执行伊始,首先遍历执行所有通过SpringFactoriesLoader可以查找到并加载的SpringApplicationRunListener。调用它们的started()方法,告诉这些SpringApplicationRunListener,“嘿,SpringBoot应用要开始执行咯!”。

(3)创建并配置当前Spring Boot应用将要使用的Environment(包括配置要使用的PropertySource以及Profile)。

(4)遍历调用所有SpringApplicationRunListener的environmentPrepared()的方法,告诉他们:“当前SpringBoot应用使用的Environment准备好了咯!”。

(5)如果SpringApplication的showBanner属性被设置为true,则打印banner。 【banner:英文广告横幅,在这里面指的是运行时输出的SpringBoot,还可以进行修改】

(6)根据用户是否明确设置了applicationContextClass类型以及初始化阶段的推断结果,决定该为当前SpringBoot应用创建什么类型的ApplicationContext并创建完成,然后根据条件决定是否添加ShutdownHook,决定是否使用自定义的BeanNameGenerator,决定是否使用自定义的ResourceLoader,当然,最重要的,将之前准备好的Environment设置给创建好的ApplicationContext使用。 【ShutdownHook :停止服务】

(7)ApplicationContext创建好之后,SpringApplication会再次借助Spring-FactoriesLoader,查找并加载classpath中所有可用的ApplicationContext-Initializer,然后遍历调用这些ApplicationContextInitializer的initialize(applicationContext)方法来对已经创建好的ApplicationContext进行进一步的处理。

(8)遍历调用所有SpringApplicationRunListener的contextPrepared()方法。

(9)最核心的一步,将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕的ApplicationContext。

(10)遍历调用所有SpringApplicationRunListener的contextLoaded()方法。

(11)调用ApplicationContext的refresh()方法,完成IoC容器可用的最后一道工序。

(12)查找当前ApplicationContext中是否注册有CommandLineRunner,如果有,则遍历执行它们。

(13)正常情况下,遍历执行SpringApplicationRunListener的finished()方法、(如果整个过程出现异常,则依然调用所有SpringApplicationRunListener的finished()方法,只不过这种情况下会将异常信息一并传入处理)

【三】pom依赖引入jar包

【四】项目启动脚本命令

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vite+cesium+天地图

创建vite项目 直接在地址栏输入cmd进入命令行&#xff08;vite项目默认为vue3&#xff09; # yarn yarn create vite 项目名称 --template vue 创建成功后依次执行 yarn install yarn dev 安装cesium和vite-plugin-cesium 没有加版本号默认为最新版本 加版本号如cesium1.1…

vue3——两种利用自定义指令实现防止按钮重复点击的方法

方法一&#xff1a;利用定时器设置时间&#xff0c;下方代码设置时间为1秒 但是有个缺点&#xff1a;请求如果很慢&#xff0c;1秒钟还没有好&#xff0c;那么该方法就没用了 // 利用定时器&#xff1a;1秒之后才能再次点击app.directive(preventReClick, {mounted: (el, bind…

sql注入的专项练习 sqlilabs(含代码审计)

在做题之前先复习了数据库的增删改查&#xff0c;然后自己用本地的环境&#xff0c;在自己建的库里面进行了sql语句的测试&#xff0c;主要是回顾了一下sql注入联合注入查询的语句和sql注入的一般做题步骤。 1.获取当前数据库 2.获取数据库中的表 3.获取表中的字段名 一、sql…

WordPress 后台开发技巧:向文章发布页右侧添加自定义菜单项

案例图片 这个案例向你介绍了如何在文章发布页的右侧边栏增加一个新的自定义菜单项。具体用它实现什么功能&#xff0c;就看你的需要了。 代码 function add_custom_menu_item() { add_meta_box(custom_menu_item, 这里是菜单项名称, display_custom_menu_item, post, side, …

基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网(1)-项目搭建(前期准备工作)

这是项目的初始页面 接下来我先写下我的初始项目搭建 技术支持&#xff1a;JAVA、JSP 服务器&#xff1a;TOMCAT 7.0.86 编程软件&#xff1a;IntelliJ IDEA 2021.1.3 x64 首先我们打开页面&#xff0c;准备搭建项目的初始准备 1.New Project 2.随后点击Next&#xff0c;勾…

C# Aspose PDF.dll 实现PDF添加水印

在C#中使用Aspose.PDF库来给PDF文档添加水印是一个常见的需求。Aspose.PDF是一个功能强大的库&#xff0c;它允许开发者在不需要Adobe Acrobat或其他PDF查看器的情况下创建、修改、渲染、打印和解析PDF文档。以下是一个使用Aspose.PDF库给PDF添加水印的基本示例&#xff1a; 首…

AttributeError: ‘list‘ object has no attribute ‘text‘

AttributeError: ‘list‘ object has no attribute ‘text‘ 目录 AttributeError: ‘list‘ object has no attribute ‘text‘ 【常见模块错误】 【解决方案】 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英…

IDEA缓存和索引

IDEA缓存和索引 —2020年06月10日 IntelliJ IDEA首次加载项目的时候。都会创建索引&#xff0c;而创建索引的时间根项目的文件多少成正比。 IntelliJ IDEA的缓存和索引主要是用来加快文件查询&#xff0c;从而加快各种查找、代码提示等操作的速度。 某些特殊情况下&#xf…

安科瑞邀您走进2024北京电气设计第44届年会

2024年7月11日&#xff0c;2024建筑电气高峰论坛暨北京电气设计第44届年会在京如期而至&#xff0c;各路精英齐聚一堂&#xff0c;围绕智慧建筑、数据中心、工业厂房配电、储能技术等热点问题展开讨论。安科瑞携企业微电网智慧能源的一站式服务解决方案亮相盛会&#xff0c;尽享…

Java面试八股之什么是spring boot starter

什么是spring boot starter Spring Boot Starter是Spring Boot项目中的一个重要概念。它是一种依赖管理机制&#xff0c;用于简化Maven或Gradle配置文件中的依赖项声明。Spring Boot Starter提供了一组预定义的依赖关系&#xff0c;这些依赖关系被封装在一个单一的包中&#x…

十日Python项目——第三日(用户中心——邮箱验证、修改密码)

#前言&#xff1a; 在最近十天我会用Python做一个购物类项目&#xff0c;会用到DjangoMysqlRedisVue等。 今天是第三天&#xff0c;主要负责撰写用户中心部分&#xff0c;以及优化登录部分。若是有不懂大家可以先阅读我的前两篇博客以能够顺承。博客&#xff1a;十日Python项…

C++——验证二叉搜索树leetcode98

C——验证二叉搜索树leetcode98 题目描述思路代码 题目描述 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树…

前端江湖:从菜鸟到大侠的修炼手册

在这个数字编织的梦幻世界里&#xff0c;前端&#xff0c;这个听起来就带着几分仙气与神秘感的词汇&#xff0c;实则是每一位互联网探险家手中的魔法杖。它不仅连接着代码的冰冷逻辑与用户的炽热情感&#xff0c;更在无数次的点击与滑动间&#xff0c;绘制出一幅幅绚丽多彩的交…

yolov8.1超简单环境搭建、标注、训练、转onnx、转输出维度

1.显卡驱动查看 nvidia-smi 2.yolo源码与模型 https://hub.nuaa.cf/ultralytics/ultralytics https://github.com/ultralytics/ultralytics 3.anaconda https://www.anaconda.com/download或 https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe …

Godot入门 05收集物品

创建新场景&#xff0c;添加Area2D节点&#xff0c;AnimatedSprite2D节点 &#xff0c;CollisionShape2D节点 添加硬币 按F键居中&#xff0c;放大视图。设置动画速度设为10FPS&#xff0c;加载后自动播放&#xff0c;动画循环 碰撞形状设为圆形&#xff0c;修改Area2D节点为Co…

[K8S] K8S资源控制器Controller Manager(4)

文章目录 1. 常见的Pod控制器及含义2. Replication Controller控制器2.1 部署ReplicaSet 3. Deployment3.1部署Deployment3.2 运行Deployment3.3 镜像更新方式3.4 Deployment扩容3.5 滚动更新3.6 金丝雀发布(灰度发布)3.7 Deployment版本回退3.8 Deployment 更新策略 4. Daemon…

Go语言常见序列化协议全面对比

先说结论 从易用性、性能、内存占用、编码后大小等几个方面综合考虑 ProtoBuf 胜出。 Gob 从性能和 I/O 带宽占用上都和 ProtoBuf 差不多&#xff0c;唯一劣势是编解码时内存占用较多。考虑到不用再写 IDL 带来的易用性&#xff0c;如果整个系统内不存在使用除 Go 以外其他语言…

高可用高并发常见问题以及答案

什么是高可用系统?如何评估系统的可用性? 高可用系统是指系统能够以高度的稳定性和可靠性运行,即使在面对硬件或软件故障时也能保持正常运行。可用性通常通过系统的 downtime(不可用时间)来评估,例如通过 SLA(Service Level Agreement)来定义系统在特定时间段内可用的…

人工智能与机器学习原理精解【7】

文章目录 凸优化基础理论加权正规方程线性回归模型加权最小二乘法加权正规方程注意使用Diagonal函数使用diagm函数总结 加权最小二乘法加权最小二乘法的定义加权最小二乘法的算法加权最小二乘法的计算加权最小二乘法的原理一、基本思想二、原理详解三、总结 加权最小二乘法的例…

贸易壁垒的作用及影响

目录 什么是贸易壁垒 关税壁垒和非关税壁垒 贸易壁垒的好处 贸易壁垒的负面影响 什么是贸易壁垒 贸易壁垒又称贸易障碍&#xff0c;一般分关税壁垒和非关税壁垒两类。 所谓关税壁垒&#xff0c;是指进出口商品经过一国关境时&#xff0c;由政府所设置的海关向进出口商征收…