Spring Boot源码学习:自动配置与自定义注解详解

分分钟玩转SpringBoot自定义注解 在工作中,我们有时候需要将一些公共的功能封装,比如操作日志的存储,防重复提交等等。这些功能有些接口会用到,为了便于其他接口和方法的使用,做成自定义注解,侵入性更低一点。别人用的话直接注解就好。下面就来讲讲自定义注解这些事情。 一.@Target、@Retention、@Documented简介 java自定义注解注解位于包:java.lang.annotation下。包含三个元注解@Target、@Retention、@Documented,即注解注解。 @Target @Target:注解的作 阅读详情

入门

  • @RestContrller :此注解标记的类下的 所有 方法均会返回一个 domain 对象以代替视图@Controller、@ResponseBody 的缩写使用 Jackson2 以及 MappingJackson2HttpMessageConverter 类自动转换对象为 JSON

  • @SpringBootApplication:快捷注释,包含以下内容@Configuration:将该类标记为上下文 bean 对象的源@EnableAutoConfiguration:@ComponentScan

Spring Boot ?

  • Spring Boot 基于 spring framework之上,可以整合所有spring 生态的技术

  • 快速构建生产级别的 spring 应用

  • spring boot 是整合 spring 技术栈的一站式框架、脚手架

系统要求

Name

Version

Java

JDK 8+

Maven

3.3+

Gradle

6 (6.3 or later). 5.6.x is also supported but in a deprecated form

Name

Servlet Version

Tomcat 9.0

4.0

Jetty 9.4

3.1

Undertow 2.0

4.0

IDEA 的支持

  • 编写 application.properties 是智能提示

  • 应用启动后的实时监控:可以实时监控到当前容器中的所有 bean

​第一个 Spring boot 应用

创建 pom

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.3</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
  • 因为我们需要开发 web 应用测试,所有选择 starter-web

  • spring-boot-starter-parent 工程设置了很多参数、插件、资源打包设置等

  • 修改 java 版本:<properties> <java.version>1.8</java.version> </properties>因为 父工程已经使用 ${java.version} 设置了 java 的编译版本目前测试无法使用 maven-compiler-3.8 编译 jdk 11 版本的项目,原因未知,切换为 jdk 8 即正常

编写测试代码

  • 编写入口@SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }

  • 编写 Controller 类@RestController public class HelloController { @RequestMapping("/") String home() { return "Hello World!"; } }

测试运行

.   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.4.3)

2021-02-24 23:08:21.251  INFO 3240 --- [           main] per.fkrobin.study.App                    : Starting App using Java 1.8.0_281 on DESKTOP-SKF5ODM with PID 3240 (D:\Projects\javaProjects\SpringBootStudy\HelloSpringBoot\target\classes started by 22136 in D:\Projects\javaProjects\SpringBootStudy)
2021-02-24 23:08:21.254  INFO 3240 --- [           main] per.fkrobin.study.App                    : No active profile set, falling back to default profiles: default
2021-02-24 23:08:21.824  INFO 3240 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)

浏览器打开 http://localhost:8080

可执行的 Jar

  • 添加 插件<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
  • 执行 mvn clean package
  • java -jar xxxxx.jar 文件,若一切正常,结果将是相同的

自动配置

Maven 依赖管理

每一个 Spring boot 应用都会有一个 parent 父工程

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.3</version>
</parent>


spring-boot-starter-parent的父工程

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.4.3</version>
</parent>

spring-boot-dependencies这个工程中定义几乎所有的 常用工具包版本及其依赖,如 spring-boot-starter-web :

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

所以我们使用 spring-boot-starter-web 不再需要书写版本号,如果需要更换版本号,可以查看 spring-boot-dependencies 中对应依赖的版本书写定义,然后在自己项目中 进行重新赋值

  • IDEA pom 文件中 右键选中 Diagrams->Show Diagrams 可以查看依赖树

常用组件自动配置

  • 自动配好SpringMVC
    • 引入SpringMVC全套组件
    • 自动配好SpringMVC常用组件(功能)
  • 自动配好Web常见功能,如:字符编码问题、DispacherServlet、multipart文件上传等
    • SpringBoot帮我们配置好了所有web开发的常见场景
  • 默认的包结构
    • 主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来
    • 无需以前的包扫描配置
    • 想要改变扫描路径,@SpringBootApplication(scanBasePackages= "com.atguigu" ),或者使用@ComponentScan 指定扫描路径

自动配置原理

SpringApplication

在此类初始化时,就会去 spring-boot、
spring-boot-auto-configure 加载 spring-factories 文件,文件中定义了 所有的 Spring 场景下的工厂,如 各种 xxxAutoConfiguration 类、Listener、Filter 等等,并缓存下来。在接下来调用 run 运行时,会根据条件注入、Filter 等过滤掉其中不需要用到的 工厂 、bean。下面是主要代码

try {
    ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
    ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);
    configureIgnoreBeanInfo(environment);
    Banner printedBanner = printBanner(environmen
SpringBoot的坑】Restful请求报错Request method 'POST' not supported,HiddenHttpMethodFilter无法将POST转换为PUT原因分析 直接上结论: 因为 SpringBoot 版本原因,在我目前使用的 2.2.4 版本中,需要在springapplication.xml文件中 添加配置: spring.mvc.hiddenmethod.filter.enabled = true 什么是 REST Restful 目的只是让 url 看起来更简洁实用,是资源状态的一种表达。 Restful 的使用 由于 H5 的 form... 阅读详情

相关推荐

解决macOS下基于JDK1.8的SpringBoot应用启动特别慢的问题

SpringBoot开发环境 软件名称 软件版本 OS macOS10.13 JDK JDK1.8u181 Maven Maven3.5.4 Git Git2.19.0 IntelliJ IDEA IntelliJ IDEA 2018.2.4 SpringBoot SpringBoot2.0.5.RELEASE 现象 如下图所示:在macOS上基于JDK1....

ITTechnologyHome 1451

SpringBoot核心笔记

一,配置文件 1.properties 同以前的properties用法 2.yaml ①简介: YAML是一个可读性高,用来表达数据序列的格式。非常适合用来做以数据为中心的配置文件 ②基本语法: key: value;kv之间有空格 大小写敏感 使用缩进表示层级关系 缩进不允许使用tab,只允许空格 缩进的空格数不重要,只要相同层级的元素左对齐即可 '#'表示注释 字符串无需加引号,如果要加,''""表示字符串内容 会被 转义/不转义 ③数据类型: 字面量:单个的、不可再分的值.

weixin_62226325的博客 1351

Spring Boot自动配置原理初探:从源码自动配置机制(附源码解析)

摘要: Spring Boot通过自动配置机制简化开发,核心原理基于@SpringBootApplication组合注解(包含@EnableAutoConfiguration)。该注解触发AutoConfigurationImportSelector加载META-INF/spring.factories中定义的配置类。自动配置类(如WebMvcAutoConfiguration)通过条件注解(如@ConditionalOnClass)动态生效,仅当满足依赖和上下文条件时才注入相关Bean。启动流程中,Spr

fykam的博客 1756

# 启用hiddenMethod过滤器 spring.mvc.hiddenmethod.filter.enabled=true的作用

https://blog.csdn.net/Arctan_/article/details/102957615

黄坤的博客 6376

Spring Boot 机制一: 自动配置原理源码级深度讲解

本文适合中高级 Java / Spring Boot 工程师;希望理解自动配置底层、掌握 Starter 编写方法、阅读 Spring Boot 源码的读者。

Java、Python、AI、前沿技术等领域的技术总结和经验分享。 5669

Spring原理解析:Spring Boot 自动配置

在传统Spring开发中,手动配置@ComponentScan和@Import等注解来指定Bean扫描路径和导入配置类,虽然看似常规,但容易导致配置复杂、维护困难等问题。Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。这种自动配置机制通过元数据注解、条件表达式和上下文感知等方式精准识别并加载依赖中的Bean,显著提升了开发效率和代码可维护性。

2301_81073317的博客 7077

Spring Boot自动配置魔法@EnableAutoConfiguration原理揭秘

本文深入剖析SpringBoot自动配置机制,从原理到实践全面解析。主要内容包括: 自动配置核心原理:基于@EnableAutoConfiguration和spring.factories文件实现约定优于配置 关键技术点: 条件注解(@Conditional)实现智能判断 自动配置类加载顺序控制 配置覆盖优先级规则 性能优化技巧: 排除不必要的自动配置 懒加载机制 启动时间内存优化 企业级实践: 自定义Starter开发指南 常见问题解决方案 生产环境最佳实践 SpringBoot 3.0新特性:更细粒度

七夜zippoe的博客 1623

Spring项目中自定义注解的使用

本篇博客将从一个普通的spring项目入手,教你如何在项目中应用自定义注解

Ekmr的博客 5万+

深入Spring Boot源码(三):自动配置Spring Boot的“魔法“核心

摘要:SpringBoot自动配置机制通过@SpringBootApplication注解启动,核心是@EnableAutoConfiguration和AutoConfigurationImportSelector。该机制扫描META-INF/spring.factories文件获取配置类,利用条件注解(如@ConditionalOnClass)实现按需加载。自动配置Starter配合,提供一站式依赖管理方案。开发者可自定义Starter或排除特定配置,最佳实践包括合理覆盖默认配置和外部化配置。

qq_45110186的博客 1197

Spring Boot 常用注解面试题深度解析

Spring Boot 常用注解面试题深度解析

欢迎您的莅临,感谢您的阅读。 5792

Spring Boot自动配置-源码跟踪

A:在实际项目中自定义自动配置类时,可以参考以下几点:首先,借鉴的方式,将自定义配置类声明为配置类,例如使用注解。其次,对于组件扫描,如果自定义类所在包不在默认扫描范围内,可以使用来指定扫描路径。最重要的是关于自动配置的核心部分,我们可以参考和的机制。自定义配置类可以通过类似@Import的方式引入相关类,并在类中使用@Bean来声明需要注册的Bean。同时,结合系列注解来控制Bean的注册条件,比如根据项目是否引入特定依赖(使用)或者容器中是否缺少特定Bean(使用)等条件来精准配置。

2401_86968005的博客 739

新人一看就懂:Spring Boot+Spring mvc+Mybatis的基础框架demo

Spring Boot的设计目的是来简化新Spring应用的初始搭建以及开发过程,大大减少了代码量,通过这篇文章你可以清楚的看到。这是一个基于Spring Boot的简单demo,希望读者可以通过这篇文章大概能看懂这一个简单的框架搭建。后续我会陆续更新,微服务架构(Spring BootSpring Cloud)、分布式架构(Dobbo+Zookeeper)、大数据架构以及源码解析等相关的文章,感兴趣的话可以关注一下。

程序员云帆哥的博客 2万+

Spring Boot 源码学习】@Conditional 条件注解

本篇介绍 @Conditional 条件注解及其衍生注解

Huazie 2128
上一篇: 涨姿势了,原来这才是多线程正确实现方式
下一篇: JVM又曾放过谁,垃圾终将被回收
Java佳佳
博客等级 码龄4年 216粉丝 286原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值