回忆
在几年前的工作中,接触springboot这个技术有过五六个月。收到springMVK开发习惯的影响,几乎没有兴趣深入了解这门技术的便利性,只是快速的用自己熟悉的方式方法将安排的工作做完。唯一且最大的好处就是:一个POM引入依赖,一个@SpringBootApplication,再run main方法,剩下基本就是业务处理。
思进
至今,有两三年没有去关注技术的发展了。偏于对技术的热爱,又一次拾起曾经丢下的东西,第一感觉就是:新奇+熟悉。
令我新奇的是:微服务的发展如此迅猛,技术的更新与支持氛围如此之浓厚,以至于 spring社区 将springboot升级为顶级项目。再者就是对于维护和支持
今年11月24日再度发布新版本 【3.0.x】,而且老版本【2.3.x】今年8月20日维护到期。
而令我熟悉感爆棚的是:这种快捷方式仍然是以前的画面
还有就是博客园平台一如既往对技术博客的排给,无论是入门还是进阶,都能够准确找到相关博客文章。
开始
进入主题,springboot技术知识点温习与汇总。
首先,得有个得力的IDE工具
目前开发者应用最多的有 Idea 和 Eclipse 。业界公认好用的是Idea,但收费,也有社区版免费使用,功能相对就没那么全面了(笔者使用的是社区版 2022.2-Windows ZIP Archive(zip))。
IDEA下载,如下图
Eclipse下载。
而Eclipse是开源免费的版本,虽然没有Idea那么强大好用,但插件支持非常多。可以下载解压版
对于工具,够用且能够满足日常需要即可。
第二,需要配置好开发环境
JDK下载
选择自己合适的 JDK 版本,但由于国外网站访问比较慢,笔者推荐使用镜像站下载,如 injdk 。
在诸多JDK版本中,jdk8,jdk11,jdk17是长期维护的稳定版本,推荐使用 。
maven下载配置
如果需要maven,那么可以配置一下。首先需要下载 maven
接下来,就需要在开发环境配置。首先解压你的 ZIP文件到指定目录 。
打开 idea 工具,依次 【文件】-【设置】-【Maven】。
再找到 【Maven主路径(H)】,点击 【...】打开【选择Maven主目录】,选择刚才解压的maven文件夹。
编写maven配置文件setting.xml,需要添加如下两项 :
setting.xml配置
#指定本地仓库目录
<localRepository>F:/study/project/repo</localRepository>
#可定制maven仓库
<mirror>
<id>central-repos1</id>
<mirrorOf>*</mirrorOf>
<name>Central Repository 2</name>
<url>https://repo1.maven.org/maven2/</url>
</mirror>
#指定JDK版本
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
现在就可以在idea中指定自定义的maven配置了。
最后,需要再确认一下【本地仓库(R)】是否正确。完成以后新建一个maven项目,测试是否配置成功。
如果配置的本地仓库目录不断开始下载pom依赖,说明配置成功。
Git下载及使用教程推荐
同样,如果需要代码版本控制,可以下载 Git
安装就不累述了,可以查找 相关教程。安装好后,可以在项目目录下执行 git相关命令 。
git使用笔者就先不写了,接下来基本可以开始springboot开发了。
springboot项目构建
再度理解一下springboot概念
特性
1.使用 “约定优先于配置”(COC,Convension Over Configuration)的设计理念。
2.spring-boot-starter 自动配置依赖模块供我们开箱即用。
3.对主流框架进行无配置集成,自动整合第三方框架。
4.可独立运行 Spring 项目,Spring Boot 可以 jar 包形式独立运行。
使用 java -jar 命令或者在项目的主函数中执行 main 函数就可以成功运行项目。
5.纯 Java 配置,没有代码生成,也不需要 XML 配置。
6.提供了很多插件让我们开箱即用,能够快速的搭建一个 Spring 项目,很少配置就
能运行一个 JavaEE 项目。
缺点
1.自动化配置,导致出现问题时比较难定位。
2.版本迭代速度过快,一些模块改动太大。
3.集成度过高,想了解底层成本较大。
Spring Boot 是通过 Spring Framework 的 @Enable 注解模块驱动实现的全新自动化配置解决方案。为快速启动且最小化配置的 Spring 应用而设计,并且它具有用于构建生产级别应用的一套固化的视图。
进阶
maven构建
- 相关依赖请移步 mvnrepository 。
- spring-boot-starter-parent,pom(project object model)指定后,即为springboot项目,且相关兼容版本的依赖全部导入。
- spring-boot-starter,普通的springboot项目,开箱即用,适合一次性响应结果场景。
- spring-boot-starter-web,开发web项目使用,可以使用URL(Uniform Resource Locator)进行访问,并且使用restful风格,返回JSON数据结构。
- spring-boot-starter-test,单元测试使用,配合idea插件使用非常方便。
- spring-boot-autoconfigure,springboot配置文件,可以时properties和yml两种类型。
- spring-boot-configuration-processor,配置文件的提示插件。
- spring-boot-starter-actuator,系统健康监控器,用于检测系统的健康情况、当前的Beans、系统的缓存等。
- spring-boot-starter-data-jpa,数据层访问提供的注解支持插件,orm框架的连接件。
- spring-boot-starter-security,应用框架的权限插件,用于控制业务逻辑,保障数据访问安全。
- spring-boot-starter-validation,Java bean参数合法校验。
- spring-boot-starter-data-redis,整合redis缓存驱动框架,使用其RedisTemplate操作数据信息。
- spring-boot-starter-logging,日志框架,记录系统运行信息并输出log文件。
- spring-boot-starter-thymeleaf,一款强大的页面渲染插件,与vue非常相似。
- spring-boot-starter-activemq,消息中间件,提供广播和消息队列方式两种方式。
springboot web常用注解
- @SpringBootApplication,项目启动注解,包含@EnableAutoConfiguration,@ComponentScan注解。
- @RestController,控制器注解,包含@Controller,@ResponseBody。
- @Autowired,bean注解,自动注入,相当于bean的实例化。在spring的bean工厂会自动生产多个该bean对象,提高访问效率。
- @PathVariable,访问路径变量,相当于该变量也是URL的一部分。
- @GetMapping,请求路径,指定请求方式为GET类型。且包含@RequestMapping 。
- @PostMapping,请求路径,指定请求方式为POST,传参更加安全。且包含@RequestMapping 。
- @RequestParam,请求参数,可以是任意类型的object 。
- @ResponseStatus,响应状态码,在org.springframework.http.HttpStatus具体定义。
- @Service,一般用于修饰service层。
- @Repository,数据层注解,修饰的DAO或者repositories类会被ComponetScan发现并配置,同时也不需要为它们提供XML配置项。
- @Bean:该注解标注等价于XML中配置的bean。
- @Value:为bean配置属性的值。
- @ExceptionHandler,全局异常处理。用于方法。
MySQL与mybatis支持
- MySQL依赖 mysql-connector-java
- MySQL配置(注意缩进和空格,即yaml语法)
spring : datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://hosturl:port/db_name?useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&useSSL=false username: *** password: ***
- mybatis依赖
mybatis-spring-boot-starter
,mybatis-plus-boot-starter
- mybatis配置
mybatis: type-aliases-package: com.*.*.*mapper configuration: map-underscore-to-camel-case: true
- mysql数据库的应用(mybatis完全支撑)
@MapperScan
对指定package进行扫描,最好注解在启动类@SpringBootApplication
一起,例如@MapperScan(value = {"com.*.*.*mapper","org.*.*.*"})
@Results
与@Result(property = "beanPropertyName", column = "tableColumnName")
- @Insert("原生SQL") 注入SQL,占位符参数使用
#{beanPropertyName}
进行传递 @Update("SQL")
,@Delete("SQL")
,@Select("SQL")
Redis缓存的支撑
-
依赖
spring-boot-starter-data-redis
-
配置
redis: database: 0 host: localhost port: 6379 password: timeout: 10s
-
RedisConfig全部代码
package com.m.m.m; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.cache.RedisCacheWriter; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.*; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.time.Duration; @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { @Bean public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofHours(240)); // 设置缓存有效期 return RedisCacheManager .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory)) .cacheDefaults(redisCacheConfiguration).build(); } /** * retemplate相关配置 * @param factory * @return */ @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); // 配置连接工厂 template.setConnectionFactory(factory); //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式) Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jacksonSeial.setObjectMapper(om); // 值采用json序列化 template.setValueSerializer(jacksonSeial); //使用StringRedisSerializer来序列化和反序列化redis的key值 template.setKeySerializer(new StringRedisSerializer()); // 设置hash key 和value序列化模式 template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(jacksonSeial); template.afterPropertiesSet(); return template; } /** * 对hash类型的数据操作 * * @param redisTemplate * @return */ @Bean public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForHash(); } /** * 对redis字符串类型数据操作 * * @param redisTemplate * @return */ @Bean public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForValue(); } /** * 对链表类型的数据操作 * * @param redisTemplate * @return */ @Bean public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForList(); } /** * 对无序集合类型的数据操作 * * @param redisTemplate * @return */ @Bean public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForSet(); } /** * 对有序集合类型的数据操作 * * @param redisTemplate * @return */ @Bean public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForZSet(); } }
-
操作redis缓存数据库(相对于关系型数据库系统简单多了)
@Autowired RedisTemplate redisTemplate; @Test public void redisTest(){ ValueOperations<String, SysUser> operations = redisTemplate.opsForValue(); operations.set("5225552d4f4s4f488e5f222a2",new SysUser("dkkfdke332kld","号","55f2d5e5e5-df4d4f4d4==",false,new Date())); System.out.println(operations.get("5225552d4f4s4f488e5f222a2")); }
Junit单元测试
- 相关注解用法
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = com.m.m.M.class) @SpringBootConfiguration `public class DBTest { @Test 访问修饰符 方法返回值类型 方法名(){ //方法体内容 ...... } }`
- 执行
- 鼠标右键
- 查看运行结果
- 鼠标右键
持续更新中。。。