一、Spring Boot访问数据库
1.Spring Boot JDBC访问数据库
对于数据访问层,无论是SQL还是NOSQL(非关系型数据库),Spring Boot都默认采用整合Spring Data的方式进行统一处理,通过大量自动配置,来简化我们对数据库访问层的操作,只需要进行简单的设置就可以实现对数据层的访问。
在pom.xml中加入以下配置
引入JDBC启动器
<!--导入JDBC的启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
数据库驱动
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
在resources中创建一个application.properties文件,加入以下代码
配置数据源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver //根据自己的数据库版本进行修改
spring.datasource.url=jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC //根据自己的数据库名称进行修改
spring.datasource.username=root123
spring.datasource.password=Root_123 //username和password根据自己的数据库进行修改
测试
Spring Boot 提供了一个名为JdbcTemplate的轻量级数据访问工具,它是对JDBC的封装。Spring Boot 对JdbcTemplate提供了默认自动配置,我们可以直接使用@Autowired或构造函数将它注入到bean中使用
创建一个Test测试类,进行测试
@SpringBootTest
class ApplicationTests {
// 数据源组件
@Autowired
DataSource dataSource;
// 用于访问数据库的组件
@Autowired
JdbcTemplate jdbcTemplate;
@Test
void contextLoads() throws SQLException {
System.out.println("默认数据源:" + dataSource.getClass());
System.out.println("数据库连接实例:" + dataSource.getConnection());
// 访问数据库
Integer i = jdbcTemplate.queryForObject("SELECT count(*) FROM users", Integer.class);
System.out.println("person 表中共有" + i + "条数据。");
}
}
2.Spring Boot整合MyBatis
MyBatis是一个半自动化的ORM框架,所谓半自动化是指MyBatis只支持将数据库查出的数据映射到POJO实体类上,而实体到数据库的映射则需要我们自己编写SQL语句实现,相较于Hiberante这种完全自动化的框架,Mybatis更加灵活,我们可以根据自身的需求编写sql语句来实现复杂的数据库操作。
随着Spring Boot越来越流行,越来越多的被厂商及开发者所认可,MyBatis 也开发了一套基于 Spring Boot 模式的 starter:mybatis-spring-boot-starter。
在pom.xml文件中加入以下依赖
引入依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
配置MyBatis
在application.propertites文件中加入以下配置:
server.port=8080
spring.profiles.active=dev
#映射文件所在位置
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
#别名
mybatis.type-aliases-package=com.by.bean
#配置日志级别 com.beiyou debug 输出sql信息
logging.level.com.beiyou=debug
二、Spring Boot 自动装载原理
自动配置原理
Spring Boot 项目创建完成后,即使不进行任何的配置,也能够顺利地运行,这都要归功于 Spring Boot 的自动化配置。
Spring Boot 默认使用application.properties 或 application.yml作为其全局配置文件,我们可以在该配置文件中对各种自动配置属性(server.pont、logging.level.*等等)进行修改,并使之失效。
Spring Boot 官方文档:常见应用属性 中对所有的配置进行了列举和解释,我们可以根据官方文档对Sprin Boot进行配置,但Spring Boot 中的配置属性数量庞大,只需要了解Spring Boot自动配置原理,才能轻松的配置Spring Boot。
Spring Boot自动化配置也是基于Spring Fatories机制实现的,在spring-boot-autoconfigure-xxx.jar类路径下的META-INF/spring.factories中设置Spring Boot 自动配置的内容
步骤
- Spring Boot启动时加载主配置类,@EnableAutoConfiguration注解开启了自动配置功能
- @EnableAutoConfiguration的作用
扫描所有jar包类路径下META-INF/spring.factories把扫描到的这些文件的内容包装成properties对象从properties中获取到EnableAutoConfiguration。class类对应的值,然后把他们添加在容器中。每一个这样的 xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中,用他们来做自动配置。 - 对每一个自动类进行自动配置功能
- 根据当前不同的条件判断,决定这个配置类是否生效。一但这个配置类生效,这个配置类就会给容器中添加各种组件,这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的。
- 所有在配置文件中能配置的属性都是在xxxxProperties类中封装者,配置文件能配置什么就可以参照某个功能对应的这个属性类
总结
- Spring Boot启动会加载大量的自动配置类
- 先看需要的功能中有没有SprinBoot写好的自动配置类
- 然后看这个自动配置类中配置了哪些组件
- 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这些属性的值
- xxxxAutoConfigurartion:自动配置类;给容器中添加组件;
- xxxxProperties:封装配置文件中相关属性;
Conditional条件注解
作用
必须是@Conditional指定的条件成立,才给容器中添加组件,配置里面的所有内容才生效。其最终实现的效果或者语义类似于如下伪代码:
if(符合 @Conditional 规定的条件){
加载当前配置(enable current Configuration)或者注册当前bean定义;
}
要实现基于条件的配置,我们只要通过 @Conditional 指定自己的 Condition 实现类就可以了(可以应用于类型 Type 的标注或者方法 Method 的标注)
@Conditional 可以作为一个 Meta Annotation 用来标注其他 Annotation 实现类,从而构建各色的复合 Annotation,比如 SpringBoot 的 autoconfigure 模块就基于这一优良的革命传统,实现了一批 Annotation(位于 org.springframework.boot.autoconfigure.condition 包下),条件注解如下:
注解 | 作用 |
---|---|
@ConditionalOnBean | 当容器里有指定的 Bean 的条件下。 |
@ConditionalOnClass | 当类路径下有指定的类的条件下。 |
@ConditionalOnExpression | 基于 SpEL 表达式作为判断条件。 |
@ConditionalOnJava | 基于 JVM 版本作为判断条件 |
@ConditionalOnJndi | 在 JNDI 存在的条件下查找指定的位置。 |
@ConditionalOnMissingBean | 当容器里没有指定 Bean 的情况下。 |
@ConditionalOnMissingClass | 当类路径下没有指定的类的条件下。 |
@ConditionalOnNotWebApplication | 当前项目不是 Web 项目的条件下。 |
@ConditionalOnProperty | 指定的属性是否有指定的值。 |
@ConditionalOnResource | 路径下是否存在指定资源文件 |
@ConditionalOnSingleCandidate | 当指定 Bean 在容器中只有一个,或者虽然有多个但是指定首选的 Bean。 |
@ConditionalOnWebApplication | 当前项目是 Web 项目的条件下。 |
有了这些复合 Annotation 的配合,我们就可以结合 @EnableAutoConfigurationn 实现基于条件的自动配置了。SpringBoot 能够风靡,很大一部分功劳需要归功于它预先提供的一系列自动配置的依赖模块,而这些依赖模块都是基于以上 @Conditional 复合 Annotation 实现的,这也意味着所有的这些依赖模块都是按需加载的,只有符合某些特定条件,这些依赖模块才会生效,这也就是我们所谓的“智能”自动配置
自动配置的顺序
三大注解
注解 | 作用 |
---|---|
@AutoConfigureBefore | 让当前配置或者组件在某个其他组件之前 |
@AutoConfigureAfter | 让当前配置或者组件在某个其他组件之后 |
@AutoConfigureOrder | 指定外部依赖的 AutoConfig 的加载顺序(即定义在/META-INF/spring.factories文件中的配置 bean 优先级),值越小优先级越高 |
三、手写starter
spring-boot-stater模块
1.介绍
SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。SpringBoot会自动通过classpath路径下的类发现需要的Bean,并注册进IOC容器。SpringBoot提供了针对日常企业应用研发各种场景的spring-boot-starter依赖模块。所有这些依赖模块都遵循着约定成俗的默认配置,并允许我们调整这些配置,即遵循“约定大于配置”的理念。
优点
一般认为,SpringBoot 微框架从两个主要层面影响 Spring 社区的开发者们:
- 基于 Spring 框架的“约定优先于配置(COC)”理念以及最佳实践之路。
- 提供了针对日常企业应用研发各种场景的 spring-boot-starter 自动配置依赖模块,如此多“开箱即用”的依赖模块,使得开发各种场景的 Spring 应用更加快速和高效。