Fivk博客 - 基础框架
type: channel
link: https://blog.fivk.cn/category/framework/
items: Spring Boot 中同时开启并配置 MongoDB、MySQL 和 Redis 的事务支持
items: 【基础框架】SpringSecurity从入门到精通
items: 【基础框架】MyBatisPlus
items: 【基础框架】Maven高级
items: 【基础框架】SpringBoot
items: 【知识总结】ssm中的各个组成理解
items: 【基础框架】SpringMVC入门（下）
items: 【基础框架】SpringMVC入门（上）
items: 【基础框架】Spring入门学习（下）
items: 【基础框架】Spring入门学习（中）

Spring Boot 中同时开启并配置 MongoDB、MySQL 和 Redis 的事务支持
type: item
date: 2025-01-09T23:51:00+08:00
description: 在现代应用开发中，事务管理是保证数据一致性的重要手段。当我们同时使用多种数据库（如 MySQL、MongoDB 和 Redis）时，如何配置和管理它们的事务显得尤为关键。本文将详细介绍如何在 Spring Boot 项目中同时开启并配置 MongoDB、MySQL 和 Redis 的事务支持，并避免常见的 Bean 重复定义和冲突问题。1. 前置依赖与环境准备确保项目已经添加了以下依赖：Maven 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3.4</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>环境要求MySQL ：使用支持事务的存储引擎（如 InnoDB）。MongoDB ：确保 MongoDB 集群运行在副本集模式（Replica Set）。Redis ：确认 Redis 启用了事务功能。2. 配置 MySQL 的事务支持通过 DataSourceTransactionManager 管理 MySQL 的事务，并命名为唯一名称：@Configuration @EnableTransactionManagement public class MySQLConfig { @Bean(name = "myBatisTransactionManager") public PlatformTransactionManager myBatisTransactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } }3. 配置 MongoDB 的事务支持MongoDB 从 4.0 版本开始支持多文档事务，前提是运行在副本集模式下。通过 MongoTransactionManager 管理 MongoDB 的事务，并命名为唯一名称：@Configuration public class MongoConfig { @Bean(name = "mongoTransactionManager") public MongoTransactionManager mongoTransactionManager(MongoDatabaseFactory dbFactory) { return new MongoTransactionManager(dbFactory); } }4. 配置 Redis 的事务支持Redis 的事务支持基于流水线（Pipeline）和 MULTI/EXEC 指令。在 application.yml 或 application.properties 中启用 Redis 的事务支持：spring: redis: lettuce: pool: enabled: true transaction: true5. 配置 ChainedTransactionManager为了实现 MySQL、MongoDB 和 Redis 的全局事务，需要使用 ChainedTransactionManager。以下是 ChainedTransactionManager 的完整配置：@Configuration public class ChainedTransactionConfig { @Bean(name = "chainedTransactionManager") @Primary public ChainedTransactionManager chainedTransactionManager( @Qualifier("myBatisTransactionManager") PlatformTransactionManager myBatisTransactionManager, @Qualifier("mongoTransactionManager") MongoTransactionManager mongoTransaction…

【基础框架】SpringSecurity从入门到精通
type: item
date: 2023-03-06T09:54:00+08:00
description: 前言本课程和笔记来源于b站：三更草堂链接地址：https://b23.tv/rrFbpDd配套资料：https://pan.baidu.com/s/1UaRJXasdVeF6hCXsQl1nrw提取码：SpringSecurity从入门到精通课程介绍0. 简介Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro，它提供了更丰富的功能，社区资源也比Shiro丰富。一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多，因为相比与SpringSecurity，Shiro的上手更加的简单。一般Web应用的需要进行认证和授权。认证：验证当前访问系统的是不是本系统的用户，并且要确认具体是哪个用户授权：经过认证后判断当前用户是否有权限进行某个操作而认证和授权也是SpringSecurity作为安全框架的核心功能。1. 快速入门1.1 准备工作我们先要搭建一个简单的SpringBoot工程① 设置父工程 添加依赖<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.0</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>② 创建启动类@SpringBootApplication public class SecurityApplication { public static void main(String[] args) { SpringApplication.run(SecurityApplication.class,args); } }③ 创建Controllerimport org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @RequestMapping("/hello") public String hello(){ return "hello"; } }1.2 引入SpringSecurity在SpringBoot项目中使用SpringSecurity我们只需要引入依赖即可实现入门案例。<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>引入依赖后我们在尝试去访问之前的接口就会自动跳转到一个SpringSecurity的默认登陆页面，默认用户名是user,密码会输出在控制台。必须登陆之后才能对接口进行访问。2. 认证2.1 登陆校验流程2.2 原理初探想要知道如何实现自己的登陆流程就必须要先知道入门案例中SpringSecurity的流程。2.2.1 SpringSecurity完整流程SpringSecurity的原理其实就是一个过滤器链，内部包含了提供各种功能的过滤器。这里我们可以看看入门案例中的过滤器。图中只展示了核心过滤器，其它的非核心过滤器并没有在图中展示。UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请求。入门案例的认证工作主要有它负责。ExceptionTranslationFilter：处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException 。FilterSecurityInterceptor：负责权限校验的过滤器。我们可以通过Debug查看当前系统中SpringSecurity过滤器链中有哪些过滤器及它们的顺序。…

【基础框架】MyBatisPlus
type: item
date: 2022-06-06T00:08:00+08:00
description: 学习目标能够基于MyBatisPlus完成标准Dao开发能够掌握MyBatisPlus的条件查询能够掌握MyBatisPlus的字段映射与表名映射能够掌握id生成策略控制能够理解代码生成器的相关配置一、MyBatisPlus简介1. 入门案例问题导入MyBatisPlus环境搭建的步骤？1.1 SpringBoot整合MyBatisPlus入门程序①：创建新模块，选择Spring初始化，并配置模块相关基础信息②：选择当前模块需要使用的技术集（仅保留JDBC）③：手动添加MyBatisPlus起步依赖<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency>注意事项1：由于mp并未被收录到idea的系统内置配置，无法直接选择加入注意事项2：如果使用Druid数据源，需要导入对应坐标④：制作实体类与表结构（类名与表名对应，属性名与字段名对应）create database if not exists mybatisplus_db character set utf8; use mybatisplus_db; CREATE TABLE user ( id bigint(20) primary key auto_increment, name varchar(32) not null, password varchar(32) not null, age int(3) not null , tel varchar(32) not null ); insert into user values(null,'tom','123456',12,'12345678910'); insert into user values(null,'jack','123456',8,'12345678910'); insert into user values(null,'jerry','123456',15,'12345678910'); insert into user values(null,'tom','123456',9,'12345678910'); insert into user values(null,'snake','123456',28,'12345678910'); insert into user values(null,'张益达','123456',22,'12345678910'); insert into user values(null,'张大炮','123456',16,'12345678910');public class User { private Long id; private String name; private String password; private Integer age; private String tel; //自行添加getter、setter、toString()等方法 }⑤：设置Jdbc参数（application.yml）spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC username: root password: root⑥：定义数据接口，继承BaseMapperpackage com.itheima.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.itheima.domain.User; import org.apache.ibatis.annotations.Mapper; @Mapper public interface UserDao extends BaseMapper<User> { }⑦：测试类中注入dao接口，测试功能package com.itheima; import com.itheima.dao.UserDao; import…

【基础框架】Maven高级
type: item
date: 2022-06-04T16:31:00+08:00
description: 学习目标理解分模块开发的意义能够使用聚合工程快速构建项目能够使用继承简化项目配置能够根据需求配置生产、开发、测试环境，并在各环境间切换运行一、分模块开发与设计1. 分模块开发的意义问题导入分模块开发对工程有什么好处？模块拆分原则目的：项目的扩展性变强了，方便其他项目引用相同的功能。将原始模块按照功能拆分成若干个子模块，方便模块间的相互调用，接口共享2. 分模块开发（模块拆分）问题导入一个完整的工程依据什么来进行模块的拆分？2.1 创建Maven模块2.2 书写模块代码注意事项：分模块开发需要先针对模块功能进行设计，再进行编码。不会先将工程开发完毕，然后进行拆分2.3 通过maven指令安装模块到本地仓库（install指令）mvn install注意事项：团队内部开发需要发布模块功能到团队内部可共享的仓库中（私服）二、依赖管理依赖管理指当前项目运行所需的jar，一个项目可以设置多个依赖格式： <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.10.RELEASE</version> </dependency> </dependencies>1. 依赖传递问题导入A依赖B，B依赖C，A是否依赖于C呢？依赖具有传递性直接依赖：在当前项目中通过依赖配置建立的依赖关系间接依赖：被资源的资源如果依赖其他资源，当前项目间接依赖其他资源特殊优先：当同级配置了相同资源的不同版本，后配置的覆盖先配置的2. 可选依赖问题导入A依赖B，B依赖C，如果A不想将C依赖进来，是否可以做到？可选依赖指对外隐藏当前所依赖的资源————不透明<dependency> <groupId>com.itheima</groupId> <artifactId>maven_03_pojo</artifactId> <version>1.0-SNAPSHOT</version> <optional>false</optional> </dependency>3. 排除依赖问题导入A依赖B，B依赖C，如果A不想将C依赖进来，是否可以做到？排除依赖指主动断开依赖的资源，被排除的资源无需指定版本————不需要排除依赖资源仅指定GA即可，无需指定V<dependency> <groupId>com.itheima</groupId> <artifactId>maven_04_dao</artifactId> <version>1.0-SNAPSHOT</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </exclusion> </exclusions> </dependency>4 可选依赖和排除依赖的区别三、聚合与继承1. 聚合工程问题导入什么叫聚合？聚合：将多个模块组织成一个整体，同时进行项目构建的过程称为聚合聚合工程：通常是一个不具有业务功能的”空“工程（有且仅有一个pom文件）作用：使用聚合工程可以将多个工程编组，通过对聚合工程进行构建，实现对所包含的模块进行同步构建当工程中某个模块发生更新（变更）时，必须保障工程中与已更新模块关联的模块同步更新，此时可以使用聚合工程来解决批量模块同步构建的问题2. 聚合工程开发问题导入工程的打包方式有哪几种？2.1 创建Maven模块，设置打包类型为pom<packaging>pom</packaging>注意事项：每个maven工程都有对应的打包方式，默认为jar，web工程打包方式为war2.2 设置当前聚合工程所包含的子模块名称<modules> <module>../maven_ssm</module> <module>../maven_pojo</module> <module>../maven_dao</module> </modules>注意事项：聚合工程中所包含的模块在进行构建时会根据模块间的依赖关系设置构建顺序，与聚合工程中模块的配置书写位置无关。参与聚合的工程无法向上感知是否参与聚合，只能向下配置哪些模块参与本工程的聚合。3. 继承关系问题导入什么叫继承？概念：继承描述的是两个工程间的关系，与java中的继承相似，子工程可以继承父工程中的配置信息，常见于依赖关系的继承作用：简化配置减少版本冲突4. 继承关系开发4.1 创建Mav…

【基础框架】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中常见项目名称，定义…

【知识总结】ssm中的各个组成理解
type: item
date: 2022-05-30T17:46:00+08:00
description: [scode type="yellow" size=""]问题：我们常用到的dao、pojo、service、controller、mapper、Impl、bo、vo、po、domain都是什么？[/scode]1. 前言学习ssm框架时看视频遇到这些概念，一开始都被搞混了，现在来区分一下。首先了解两个概念：MVC是model+ view + controllerSSM 是spring + springMVC + mybatis2.关系示意图记住两句话:业务层调数据层。控制层调业务层在java中可以表示成下面这种情况：3.区别和联系DAO(mapper)，DAO= Data Acess Object, 数据持久层，对数据库进行持久化操作，负责跟数据库打交道。通常我们在DAO层里写接口，里面有与数据打交道的方法。SQL语句通常写在mapper文件里。Service,业务层或服务层，主要负责业务模块的逻辑应用设计。 Service层的实现，具体调用到已经定义的DAO接口，封装service层的业务逻辑有利于通用的业业务逻辑的独立性和重复利用性。如果把Dao层当作积木，那么Service层则是对积木的搭建。Controller, 负责具体的业务模块流程的控制。此层要调用Service层的接口去控制业务流程。Pojo 全称Plain Ordinary Java Object ，数据库实体类，有的地方也直接写成entity。也可以理解为domain，一般是跟数据库对应好的一个实体类。Bo ，bussiness object，表示业务对象的意思。bo就是把业务逻辑封装成一个对象，这个对象可以包括一个或多个对象。通过调用dao方法，结合Po或Vo进行业务操作。Vo ,value object表示值对象的也i是，通常用于业务层之间的数据传递。Po, persistant object, 代表持久层对象的意思，对应数据库中表的字段，可以理解为一个po就是数据库中的一条记录。Impl 全称是 implement, 实现的意思，主要用于实现接口。

【基础框架】SpringMVC入门（下）
type: item
date: 2022-05-29T18:36:00+08:00
description: 今日内容能够掌握SSM整合的流程能够编写SSM整合功能模块类能够使用Result统一表现层响应结果能够编写异常处理器进行项目异常能够完成SSM整合前端页面发送请求实现增删改查操作能够编写拦截器并配置拦截器一、SSM整合【重点】1 SSM整合配置问题导入请描述“SSM整合流程”中各个配置类的作用？1.1 SSM整合流程创建工程SSM整合SpringSpringConfigMyBatisMybatisConfigJdbcConfigjdbc.propertiesSpringMVCServletConfigSpringMvcConfig功能模块表与实体类dao（接口+自动代理）service（接口+实现类）业务层接口测试（整合JUnit）controller表现层接口测试（PostMan）1.2 SSM整合配置1.2.1 创建工程，添加依赖和插件<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.10.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.10.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.2.10.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <port>80</port> <path>/</path> </configuration> </plugin> </plugins> </build>1.2.2 Spring整合Mybatis创建数据库和表-- 创建ssm_db数据库 CREATE DA…

【基础框架】SpringMVC入门（上）
type: item
date: 2022-05-21T16:20:00+08:00
description: 今日目标能够知道SpringMVC的优点能够编写SpringMVC入门案例能够使用PostMan发送请求能够掌握普通类型参数传递能够掌握POJO类型参数传递能够掌握json数据参数传递能够掌握响应json数据能够掌握rest风格快速开发能够完成基于restful页面数据交互案例一、SpringMVC简介1 SpringMVC概述问题导入SpringMVC框架有什么优点？1.1 SpringMVC概述SpringMVC是一种基于Java实现MVC模型的轻量级Web框架优点使用简单，开发便捷（相比于Servlet）灵活性强2 入门案例【重点】问题导入在Controller中如何定义访问路径，如何响应数据？2.1 实现步骤1 创建web工程（Maven结构） 2 设置tomcat服务器，加载web工程(tomcat插件） 3 导入坐标（SpringMVC+Servlet） 4 定义处理请求的功能类（UserController） 5 编写SpringMVC配置类，加载处理请求的Bean。 6 加载SpringMVC配置，并设置SpringMVC请求拦截的路径2.2 代码实现【第一步】创建web工程（Maven结构）【第二步】设置tomcat服务器，加载web工程(tomcat插件）<build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <port>80</port> <path>/</path> </configuration> </plugin> </plugins> </build>【第三步】导入坐标（SpringMVC+Servlet）<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.10.RELEASE</version> </dependency> </dependencies>注意事项：课程版本基于Spring主版本5.2.10.RELEASE制作导入spring-webmvc坐标自动依赖spring相关坐标【第四步】定义处理请求的功能类（UserController）//定义表现层控制器bean @Controller public class UserController { //设置映射路径为/save，即外部访问路径 @RequestMapping("/save") //设置当前操作返回结果为指定json数据（本质上是一个字符串信息） @ResponseBody public String save(){ System.out.println("user save ..."); return "{'info':'springmvc'}"; } }注意事项：[scode type="yellow" size=""]对于SpringMVC而言，Controller方法返回值默认表示要跳转的页面，没有对应的页面就会报错。如果不想跳转页面而是响应数据，那么就需要在方法上使用@ResponseBody注解。[/scode]【第五步】编写SpringMVC配置类，加载处理请求的Bean。//springmvc配置类，本质上还是一个spring配置类 @Configuration @ComponentScan("com.itheima.controller") public class SpringMvcConfig { }【第六步】加载SpringMVC配置，并设置SpringMVC请求拦截的路径//web容器配置类 public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer { //加载springmvc配置类，产生springmvc容器（本质还是spring容器） protected WebApplicationContext createServletApplicationCo…

【基础框架】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容器中获取…