学透Spring Boot — 004. Spring Boot Starter机制和自动配置机制

如果你项目中一直用的是 Spring Boot,那么恭喜你没有经历过用 Spring 手动集成其它框架的痛苦。

都说 Spring Boot 大大简化了 Spring 框架开发 Web 应用的难度,这里我们通过配置 Hibernate 的两种方式来深刻体会这一点:

  • 使用 Spring 框架集成 Hibernate 手动配置
  • 使用 Spring Boot 集成 Hibernate 自动配置

Hibernate 手动配置

我们先来看看,手动配置 Hibernate 有多么麻烦。
在这里插入图片描述

第一步、引入JAP依赖
<!-- JPA 的相关依赖 -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>6.1.4</version>
</dependency>
<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-jpa</artifactId><version>3.2.4</version>
</dependency>
第二步、引入Hibernate依赖
<!-- Hibernate作为JPA 实现 -->
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.4.30.Final</version>
</dependency>
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>5.4.30.Final</version>
</dependency>
第三步、引入数据库相关的依赖
<!-- JDBC 驱动程序 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version>
</dependency><!-- 数据库连接池 -->
<dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.10.0</version>
</dependency>

这么多个包,用哪些包?用什么版本?一般人谁记得住!
更糟糕的是,如果运气不好,你还得花很多时间解决各个依赖之间的兼容问题

这还只是持久层的相关依赖,如果还要集成其它框架,工作量非常大!

第四步、配置数据源

在applicationContext.xml 中配置各种bean。
首先要配置的是数据源!

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"><property name="driverClass" value="com.mysql.cj.jdbc.Driver"/><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/><property name="user" value="root"/><property name="password" value="123456"/>
</bean>
第五步、配置实体管理器

定义实体管理器的 bean,并设置 JPA 实现类(如 Hibernate)、数据源等属性。

注意在早期的JPA版本中配置的是sessionFactory

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><property name="dataSource" ref="dataSource" /><property name="packagesToScan" value="com.example.domain" /><property name="jpaVendorAdapter"><bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /></property>
</bean>
第六步、配置事务管理器

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
第七步、开启注解式事务
<tx:annotation-driven transaction-manager="transactionManager"/>
第八步、编写持久层代码

到这里,你终于把 JPA (Hibernate) 用Spring集成好了,并且配置好了。
终于你可以开始动手写代码了。

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

Hibernate 自动配置

在前面,我们经历千辛万苦终于用Spring 集成 Hibernate框架,并且配置好了。好了接下来,你还要集成 Web、集成 Spring Security等等,你会不会暗暗叫苦呢?

前面的手动配置存在很明显的缺陷:

  • 集成某个框架,我们需要记住所有必要的依赖;不然很容易抛出 NoSuchClassException 的异常。
  • 我们还需要谨慎使用相关依赖的版本;不然很容易出现版本不兼容的情况。
  • 上面的依赖和xml配置是模块化的配置;100个项目有99个基本一致。

还在,Spring Boot 带来了自动配置的机制,它帮我们悄悄的完成了绝大部分的工作。

下面,我们看看通过Starter 和 自动配置,集成和配置 Hibernate有多么的简易!
在这里插入图片描述

第一步、引入starter-data-jpa
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
第二步、引入数据库驱动
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version>
</dependency>
第三步、配置数据库连接信息

application.properties中配置数据库信息

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

到这里,我们就完成了 Spring Boot 对 Hibernate的集成!

看看我们做了什么:

  • 依赖中引入 starter-data-jpa 和 mysql驱动两个依赖!
  • 只在主配置中配置了数据库账号密码等最基本信息!

其它的事情,全部有 starter 和 自动配置机制完成!

对比

starter

我们引入了一个 starter 依赖,基本完成所有的依赖的配置。
可以看到传递依赖,会把必要的依赖都自动包含进来!
在这里插入图片描述

自动配置

对于配置,其实就更容易理解了!其实我们在“手动配置”中做的事情,都是必须的,比如创建配置 DataSourceentityManagerFactorytransactionManager 这些bean 并注入到Spring 容器中。

只不过,自动配置机制偷偷的帮我们做完了一切。

总结

通过手动配置和自动配置两种方式集成 一个框架,我们可以强烈的感受到 Spring Boot的starter自动配置机制的强大。

这对于我们专栏后面,从原理和源码级别理解 starter 和 自动配置 机制是非常非常有帮助的!欢迎大家点赞收藏!后续的文章,我们会更深层次的角度去学习这两个重点。

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

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

相关文章

【算法刷题day16】Leetcode:104. 二叉树的最大深度、111. 二叉树的最小深度、222.完全二叉树的节点个数

文章目录 Leetcode 104. 二叉树的最大深度解题思路代码总结 Leetcode 111. 二叉树的最小深度解题思路代码总结 Leetcode 222.完全二叉树的节点个数解题思路代码总结 草稿图网站 java的Deque Leetcode 104. 二叉树的最大深度 题目&#xff1a;104. 二叉树的最大深度 解析&#…

MT3017 上色

思路&#xff1a;使用分治&#xff0c;在每个连续区域递归调用heng()和shu() #include <bits/stdc.h> using namespace std; int n, m; int h[5005];int shu(int l, int r) {return r - l 1; } int heng(int l, int r) {int hmin 0x3f3f3f3f;for (int i l; i < r;…

IoT数采平台2:文档

IoT数采平台1&#xff1a;开篇IoT数采平台2&#xff1a;文档IoT数采平台3&#xff1a;功能IoT数采平台4&#xff1a;测试 【平台功能】 基础配置、 实时监控、 规则引擎、 告警列表、 系统配置 消息通知&#xff1a;Websocket 设备上线、设备下线、 数据变化、 告警信息、 实时…

蓝桥杯:全球变暖(python,BFS,DFS)(栈溢出的处理办法)

图论的经典题型&#xff0c;深度优先搜索和广度优先搜索都可以&#xff0c;但是本题推荐使用广度优先搜索&#xff08;类似的题最好都用广度优先搜索&#xff09;&#xff0c;因为使用深度优先搜索会爆栈&#xff08;栈溢出&#xff09;。本篇博客两种方法都进行讲解&#xff0…

【协议】RPC

文章目录 概述与web service/web api/wcf区别简介区别和联系 grpc.Net Core示例 参考 概述 与web service/web api/wcf区别 简介 RPC&#xff08;Remote Procedure Call Protocol&#xff09;即远程过程调用协议&#xff0c;是分布式系统间通信的一种协议。通过网络从远程计…

【Apache Doris】周FAQ集锦:第 2 期

【Apache Doris】周FAQ集锦&#xff1a;第 2 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

【WEEK6】学习目标及总结【MySQL】【中文版】

学习目标&#xff1a; 两周完成MySQL的学习——第二周 学习内容&#xff1a; 参考视频教程【狂神说Java】MySQL最新教程通俗易懂DQL查询数据 学习时间及产出&#xff1a; 第六周MON~WED, SUN 2024.4.1【WEEK6】 【DAY1】DQL查询数据-第一部分【中文版】【WEEK6】 【DAY1】DQ…

关键字:static

回顾类中的实例变量&#xff08;即非static的成员变量&#xff09; class Circle{ private double radius; public Circle(double radius){ this.radiusradius; } public double findArea(){ return Math.PI*radius*radius; } } 创建两个C…

计算机网络—TCP协议详解:特性、应用(2)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;マリンブルーの庭園—ずっと真夜中でいいのに。 0:34━━━━━━️&#x1f49f;──────── 3:34 &#x1f504; ◀️…

FPGA的就业前景

FPGA&#xff08;Field-Programmable Gate Array&#xff09;技术在数字电路设计和嵌入式系统开发方面具有广泛的应用&#xff0c;因此在FPGA领域有着较好的就业前景。 目前&#xff0c;FPGA在通信、计算机、消费电子、汽车、航空航天等行业中得到了广泛应用。随着新一代通信网…

抽象类与抽象方法(或abstract关键字)

由来 举例1&#xff1a; 随着继承层次中一个个新子类的定义&#xff0c;类变得越来越具体&#xff0c;而父类则更一般&#xff0c;更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象&#xff0c;以至于它没有具体的实例&#xff0c;这样的类叫做…

STM32G系 编程连接不上目标板,也有可能是软件不兼容。

由于一直用的老版本STM32 ST-LINK Utility 4.20 &#xff0c;找遍了所有问题&#xff0c;SWD就是连不上目标板。 电源脚 VDDA 地线&#xff0c;SWD的四条线&#xff0c;还是不行&#xff0c;浪费了一天&#xff0c;第二天才想起&#xff0c;是不是G系升级了 SWD协议。结果下载…

[InternLM训练营第二期笔记]2. 轻松分钟玩转书生·浦语大模型趣味 Demo

该系列是上海AI Lab举行的书生 浦语大模型训练营的相关笔记部分。 该笔记是第二节课&#xff0c;完成对话、多模态等demo&#xff0c;形成对InternLM的初步了解 1. 部署InternLM2-Chat-1.8B InternLM2-Chat-1.8B是一个对话小模型&#xff0c;只有1.8B参数&#xff0c;因此运行…

【算法刷题day15】Leetcode:各种层序遍历、226.翻转二叉树、101. 对称二叉树

文章目录 Leetcode 层序遍历解题思路代码总结 Leetcode 226.翻转二叉树解题思路代码总结 Leetcode 101. 对称二叉树解题思路代码总结 草稿图网站 java的Deque Leetcode 层序遍历 题目&#xff1a;102.二叉树的层序遍历 题目&#xff1a;107. 二叉树的层序遍历 II 题目&#xf…

深度学习:神经网络模型的剪枝和压缩简述

深度学习的神经网路的剪枝和压缩&#xff0c;大致的简述&#xff0c; 主要采用&#xff1a; network slimming&#xff0c;瘦身网络... 深度学习网络&#xff0c;压缩的主要方式&#xff1a; 1.剪枝&#xff0c;nerwork pruing&#xff0c; 2.稀疏表示&#xff0c;sparse rep…

【Git】分支协同开发

1、前言 由于之前一直是在master上开发 没有分支开发过 接触过好几个项目组 远程仓库不是用码云就是 gitlab 然后几个人在master开发 也没有UAT分支这些 没有分支协同开发很容易把冲突 读完本文 你将对Git分支开发又有一个新的认识 2、概念 master和UAT在远程都是保护分支…

每日面经分享(python进阶 part2)

Python中的装饰器和上下文管理器区别是什么&#xff1f;它们分别适用于哪些场景&#xff1f; a. 装饰器用于在函数或类的外部添加额外功能&#xff0c;而上下文管理器用于管理资源的获取和释放。 b. 装饰器是一种用于修改函数或类行为的技术。适用于需要在函数或类的外部添加额…

鸿蒙实战开发-通过输入法框架实现自绘编辑框

介绍 本示例通过输入法框架实现自会编辑框&#xff0c;可以绑定输入法应用&#xff0c;从输入法应用输入内容&#xff0c;显示和隐藏输入法。 效果预览 使用说明 1.点击编辑框可以绑定并拉起输入法&#xff0c;可以从输入法键盘输入内容到编辑框。 2.可以点击attach/dettac…

【学习分享】小白写算法之冒泡排序篇

【学习分享】小白写算法之冒泡排序篇 前言一、什么是冒泡排序算法二、冒泡排序算法如何实现三、C语言实现算法四、复杂度计算五、算法稳定性六、小结 前言 最近我要学习下数据结构和算法&#xff0c;有兴趣的小伙伴可以点个关注&#xff0c;一起学习。争取写的浅显易懂。如果你…

解决Toad for Oracle显示乱中文码问题

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…