Fivk博客 - Spring
type: channel
link: https://blog.fivk.cn/tag/Spring/
items: 【SpringCache】通用缓存使用与注解介绍（快速入门）
items: 【基础框架】SpringBoot
items: 【基础框架】Spring入门学习（下）
items: 【基础框架】Spring入门学习（中）
items: 【基础框架】Spring入门学习（上）

【SpringCache】通用缓存使用与注解介绍（快速入门）
type: item
date: 2023-04-01T21:35:00+08:00
description: 1、简介Spring Cache 是一个抽象层，它提供了一种在应用程序中使用缓存的统一方式，而具体使用哪种数据库进行缓存是可以根据需要进行配置的。Spring Cache 支持使用多种缓存技术，包括但不限于：ConcurrentMapCache: 使用ConcurrentHashMap作为缓存实现，适合于单个应用节点的缓存需求；EhCache: 一个流行的开源缓存框架，可以单独使用，也可以与Spring集成；Redis: 一个流行的内存数据库，也可以用作缓存；Caffeine: 一个基于 Java 8 的高性能缓存库，支持内存缓存和硬盘缓存等；Hazelcast: 分布式内存数据网格，支持缓存、分布式Map、消息等。以上只是其中的几个例子，具体使用哪种缓存技术取决于应用的具体需求和限制条件。2、案例使用Redis作为Spring Cache缓存数据库需要进行以下配置：首先，在pom.xml文件中添加Spring Boot对Redis和Spring Cache的依赖，例如： <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>然后，在application.properties或application.yml中添加Redis相关配置，例如：# Redis配置 spring.redis.host=localhost spring.redis.port=6379 spring.redis.password= # Spring Cache配置 spring.cache.type=redis spring.cache.redis.time-to-live=3600在以上配置中，我们指定了Redis的主机名、端口号和密码（如果有的话），并将Spring Cache的类型指定为Redis。此外，我们还设置了缓存的存活时间为3600秒，即1小时。最后，在需要使用缓存的方法上添加@Cacheable注解即可，例如：@Service public class MyService { @Cacheable(value = "myCache", key = "#id") public MyObject getById(Long id) { // 从数据库中查询MyObject，并返回 } }在以上代码中，我们使用@Cacheable注解对getById方法进行缓存配置，指定了缓存的名称为myCache，缓存的键值为方法的参数id。这样，当getById方法被调用时，Spring会先检查缓存中是否有相应的缓存值，如果有的话则直接返回，否则才会从数据库中查询并返回对象，并将其缓存起来。问：其中value = "myCache", key = "#id"的含义是什么？[scode type="green" size=""]答：在使用@Cacheable注解时，value和key是必须指定的两个参数，它们的含义如下：value: 指定缓存的名称，可以理解为缓存的命名空间，不同的缓存名称对应不同的缓存区域。key: 指定缓存的键值，用于在缓存中唯一标识该缓存项。在Spring Cache中，当一个方法被标记为@Cacheable时，Spring会根据value和key的值将其结果缓存起来。具体来说，Spring会将key作为缓存的键，在缓存中存储该方法的返回值。当下一次调用该方法时，Spring会先检查缓存中是否有对应的键值，如果有则直接返回缓存值，否则才会执行该方法，并将返回值存入缓存。在上面的示例代码中，value指定了缓存的名称为myCache，key指定了缓存的键值为方法的参数id。这意味着，当调用getById方法时，Spring会将id参数作为缓存的键，在myCache缓存中查找是否有对应的缓存值。如果有，则直接返回缓存值；如果没有，则执行方法，将方法的返回值缓存起来，并以id作为键值存储在myCache缓存中。[/scode]问：如果我没有配置任何数据库，它还能进行缓存吗？[scode type="green" size=""]如果没有配置任何缓存数据库，Spring Cache会使用默认的缓存配置，将缓存数据存储在内存中，这样可以进行基本的缓存操作，但是缓存的生命周期只在应用程序运行期间有效，一旦应用程序停止…

【基础框架】SpringBoot
type: item
date: 2022-06-02T14:14:00+08:00
description: 学习目标基于SpringBoot框架的程序开发步骤熟练使用SpringBoot配置信息修改服务器配置基于SpringBoot的完成SSM整合项目开发一、SpringBoot简介1. 入门案例问题导入SpringMVC的HelloWord程序大家还记得吗？SpringBoot是由Pivotal团队提供的全新框架，其设计目的是用来简化Spring应用的初始搭建以及开发过程原生开发SpringMVC程序过程1.1 入门案例开发步骤①：创建新模块，选择Spring初始化，并配置模块相关基础信息②：选择当前模块需要使用的技术集③：开发控制器类@RestController @RequestMapping("/books") public class BookController { @GetMapping("/{id}") public String getById(@PathVariable Integer id) { System.out.println("id ==> " + id); return "hello , spring boot! "; } }④：运行自动生成的Application类最简SpringBoot程序所包含的基础文件<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.0</version> </parent> <groupId>com.itheima</groupId> <artifactId>springboot-01-quickstart</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }Spring程序与SpringBoot程序对比注意事项：基于idea开发SpringBoot程序需要确保联网且能够加载到程序框架结构1.2 基于SpringBoot官网创建项目1.3 SpringBoot项目快速启动① 对SpringBoot项目打包（执行Maven构建指令package）② 执行启动指令java -jar springboot_01_quickstart.jar # 项目的名称根据实际情况修改注意事项：jar支持命令行启动需要依赖maven插件支持，请确认打包时是否具有SpringBoot对应的maven插件。<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>2. SpringBoot概述问题导入学习了SpringBoot入门案例之后，感觉对比SpringMVC哪一个更加方便简洁？SpringBoot是由Pivotal团队提供的全新框架，其设计目的是用来简化Spring应用的初始搭建以及开发过程Spring程序缺点配置繁琐依赖设置繁琐SpringBoot程序优点自动配置起步依赖（简化依赖配置）辅助功能（内置服务器，……）2.1 起步依赖starterSpringBoot中常见项目名称，定义…

【基础框架】Spring入门学习（下）
type: item
date: 2022-05-17T18:04:00+08:00
description: 今日目标能够理解AOP的作用能够完成AOP的入门案例能够理解AOP的工作流程能够说出AOP的五种通知类型能够完成"测量业务层接口万次执行效率"案例能够掌握Spring事务配置一、AOP1 AOP简介问题导入[scode type="yellow" size=""]问题1：AOP的作用是什么？问题2：连接点和切入点有什么区别，二者谁的范围大？问题3：请描述什么是切面？[/scode]1.1 AOP简介和作用【理解】AOP(Aspect Oriented Programming)面向切面编程，一种编程范式，指导开发者如何组织程序结构OOP(Object Oriented Programming)面向对象编程作用：在不惊动原始设计的基础上为其进行功能增强。简单的说就是在不改变方法源代码的基础上对方法进行功能增强。Spring理念：无入侵式/无侵入式1.2 AOP中的核心概念【理解】连接点（JoinPoint）：正在执行的方法，例如：update()、delete()、select()等都是连接点。切入点（Pointcut）：进行功能增强了的方法，例如:update()、delete()方法，select()方法没有被增强所以不是切入点，但是是连接点。在SpringAOP中，一个切入点可以只描述一个具体方法，也可以匹配多个方法一个具体方法：com.itheima.dao包下的BookDao接口中的无形参无返回值的save方法匹配多个方法：所有的save方法，所有的get开头的方法，所有以Dao结尾的接口中的任意方法，所有带有一个参数的方法通知（Advice）：在切入点前后执行的操作，也就是增强的共性功能在SpringAOP中，功能最终以方法的形式呈现通知类：通知方法所在的类叫做通知类切面（Aspect）：描述通知与切入点的对应关系，也就是哪些通知方法对应哪些切入点方法。2 AOP入门案例【重点】问题导入[scode type="yellow" size=""]问题1：在通知方法中如何定义切入点表达式？问题2：如何配置切面？问题3：在配置类上如何开启AOP注解功能？[/scode]2.1 AOP入门案例思路分析案例设定：测定接口执行效率简化设定：在接口执行前输出当前系统时间开发模式：XML or [font color="#FF0000"]注解[/font]思路分析：导入坐标（pom.xml）制作连接点方法（原始操作，dao接口与实现类）制作共性功能（通知类与通知）定义切入点绑定切入点与通知关系（切面）2.2 AOP入门案例实现【第一步】导入aop相关坐标<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.10.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency> </dependencies>【第二步】定义dao接口与实现类public interface BookDao { public void save(); public void update(); } @Repository public class BookDaoImpl implements BookDao { public void save() { System.out.println(System.currentTimeMillis()); System.out.println("book dao save ..."); } public void update(){ System.out.println("book dao update ..."); } }【第三步】定义通知类，制作通知方法//通知类必须配置成Spring管理的bean @Component public class MyAdvice { public void method(){ System.out.println(System.currentTimeMillis()); } }【第四步】定义切入点表达式、配置切面(绑定切入点与通知关系)//通知类必须配置成Spring管理的bean @Component //设置当前类为切面类类 @Aspect public class MyAdvice { //设置切入点，@Pointcut注解要求配置在方法上方 @Po…

【基础框架】Spring入门学习（中）
type: item
date: 2022-05-15T21:27:00+08:00
description: 今日目标能够掌握注解开发定义Bean对象能够掌握纯注解开发模式能够配置注解开发依赖注入能够配置注解开发管理第三方Bean能够配置注解开发为第三方Bean注入资源能够使用Spring整合Mybatis能够使用Spring整合Junit一、第三方资源配置管理说明：以管理DataSource连接池对象为例讲解第三方资源配置管理，DataSource是获取物理数据源连接的工厂类。1 管理DataSource连接池对象问题导入配置数据库连接参数时，注入驱动类名是用driverClassName还是driver？1.1 管理Druid连接池【重点】数据库准备create database if not exists spring_db character set utf8; use spring_db; create table if not exists tbl_account( id int primary key auto_increment, name varchar(20), money double ); insert into tbl_account values(null,'Tom',1000); insert into tbl_account values(null,'Jerry',1000);【第一步】添加Druid连接池依赖<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency>注意：除了添加以上两个依赖之外，别忘了添加spring-context依赖。【第二步】配置DruidDataSource连接池Bean对象<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/spring_db"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean>【第三步】在测试类中从IOC容器中获取连接池对象并打印public class App { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); DataSource dataSource = (DataSource) ctx.getBean("dataSource"); System.out.println(dataSource); } }1.2 管理c3p0连接池【第一步】添加c3p0连接池依赖<dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency>【第二步】配置c3p0连接池Bean对象<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring_db"/> <property name="user" value="root"/> <property name="password" value="root"/> <property name="maxPoolSize" value="1000"/> </bean>注意：同一个Spring容器中不能有两个id="dataSource"的连接池。【第三步】在测试类中从IOC容器中获取…

【基础框架】Spring入门学习（上）
type: item
date: 2022-05-14T14:17:00+08:00
description: 学习目标能够说出Spring的体系结构能够编写IOC入门案例能够编写DI入门案例能够配置setter方式注入属性值能够配置构造方式注入属性值能够理解什么是自动装配一、Spring简介1 Spring介绍问题导入我们为什么要学习Spring框架？1.1 为什么要学Spring技术是JavaEE开发必备技能，企业开发技术选型命中率>90%专业角度**简化开发**，降低企业级开发的复杂性框架整合，高效整合其他技术，提高企业级应用开发与运行效率1.2 学什么简化开发IOC(反转控制)AOP(面向切面编程)事务处理框架整合MyBatisMyBatis-plusStrutsStruts2Hibernate……1.3 怎么学学习Spring框架设计思想学习基础操作，思考操作与思想间的联系学习案例，熟练应用操作的同时，体会思想2 初识Spring问题导入目前我们使用的是Spring几版本？2.1 Spring家族官网：https://spring.ioSpring发展到今天已经形成了一种开发的生态圈，Spring提供了若干个项目，每个项目用于完成特定的功能。2.2 Spring发展史3 Spring体系结构问题导入通过系统架构图，Spring能不能进行数据层开发？Spring能不能进行web层开发？3.1 Spring Framework系统架构图Spring Framework是Spring生态圈中最基础的项目，是其他项目的根基3.2 Spring Framework课程学习路线4 Spring核心概念问题导入问题1：目前我们的代码存在什么问题以及怎么解决这些问题？问题2：请描述什么是IOC，什么是DI？4.1 目前我们代码存在的问题代码书写现状耦合度偏高解决方案使用对象时，在程序中不要主动使用new产生对象，转换为由外部提供对象4.2 核心概念IOC（Inversion of Control）控制反转使用对象时，由主动new产生对象转换为由外部提供对象，此过程中对象创建控制权由程序转移到外部，此思想称为控制反转。通俗的讲就是“将new对象的权利交给Spring，我们从Spring中获取对象使用即可”Spring技术对IoC思想进行了实现Spring提供了一个容器，称为IOC容器，用来充当IoC思想中的“外部”IOC容器负责对象的创建、初始化等一系列工作，被创建或被管理的对象在IoC容器中统称为BeanDI（Dependency Injection）依赖注入在容器中建立bean与bean之间的依赖关系的整个过程，称为依赖注入。目标：充分解耦使用IoC容器管理bean（IOC)在IoC容器内将有依赖关系的bean进行关系绑定（DI）最终效果使用对象时不仅可以直接从IoC容器中获取，并且获取到的bean已经绑定了所有的依赖关系二、IOC和DI入门案例【重点】1 IOC入门案例【重点】问题导入\<bean>标签中id属性和class属性的作用是什么？1.1 门案例思路分析管理什么？(Service与Dao)如何将被管理的对象告知IOC容器？(配置文件)被管理的对象交给IOC容器，如何获取到IoC容器？(接口)IOC容器得到后，如何从容器中获取bean？(接口方法)使用Spring导入哪些坐标？(pom.xml)1.2 实现步骤【第一步】导入Spring坐标 【第二步】定义Spring管理的类（接口） 【第三步】创建Spring配置文件，配置对应类作为Spring管理的bean对象 【第四步】初始化IOC容器（Spring核心容器/Spring容器），通过容器获取bean对象1.3 实现代码【第一步】导入Spring坐标<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.10.RELEASE</version> </dependency> </dependencies>【第二步】定义Spring管理的类（接口）BookDao接口和BookDaoImpl实现类public interface BookDao { public void save(); } public class BookDaoImpl implements BookDao { public void save() { System.out.println("book dao save ..."); } }BookService接口和BookServiceImpl实现类public interface BookService { public void save(); } public class …