浅浅谈谈ssm的那些事儿外加AOP和DI+DAO思想的理解和处理json数据的第三方工具

news2025/1/18 9:46:40

MyBatis

一级缓存

默认是打开的

SqlSession级别的缓存,同一个SqlSession的发起多次同构查询,会将数据保存在一级缓存中。

在sqlsession 中有一个数据结构 是map 结构, 这个区域就是一级缓存区域,一级缓存区域中的 key 是由 sql 语句 方法参数 statement 等 组成的一个唯一值 对应的 value 就是 缓存内容 , 一级缓存 map 的生命周期 和当前 sqlSession 一致

二级缓存

SqlSessionFactory级别的缓存,同一个SqlSessionFactory构建的SqlSession发起的多次同构查询,会将数据保存在二级缓存中。

二级缓存指的是 同一个 namespace 下的 mapper二级缓存的数据结构 也是一个 map 二级缓存 需要 手动开启

<setting name="cacheEnabled" value="true"/> <!-- mybaits-config.xml中开启全局缓存(默认开启) -->

Druid

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>druid</artifactId>
 <version>1.1.16</version>
</dependency>

PageHelper

PageHelper是适用于MyBatis框架的一个分页插件,使用方式极为便捷,支持任何复杂的单表、多表分页查询操作。

** 引入依赖**

<dependency>
		<groupId>com.github.pagehelper</groupId>
		<artifactId>pagehelper</artifactId>
		<version>5.1.10</version>
</dependency>

配置MyBatis-config.xml

<configuration>
	<typeAliases></typeAliases>

 <plugins>
     <!-- com.github.pagehelper为PageHelper类所在包名 -->
     <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
 </plugins>

	<environments>...</environments>
</configuration>

** PageHelper应用方式**

@Test
public void testPagehelper(){
		UserDao userDao = MyBatisUtils.getMapper(UserDao.class);
		PageHelper.startPage(1,2);//使用PageHelper设置分页条件
		List<User> users = userDao.selectAllUsers();
		for(User user : users){
				System.out.println(user);
		}
}
image-20220430125416300
@Test
public void testPageInfo(){
		UserDao userDao = MyBatisUtils.getMapper(UserDao.class);
		PageHelper.startPage(6, 2);
		List<User> users = userDao.selectAllUsers();
		PageInfo<User> pageInfo = new PageInfo<User>(users);//将分页查询的结果集保存在PageInfo对象中
		System.out.println(pageInfo);
}

传统的web开发中的缺点

缺点一:层与层之间的耦合度(接口与具体实现耦合在一起) 解决方法:不手动new对象,用第三方提供的Bean对象。

缺点二:通用的事务功能耦合在业务代码(第三方根据 要求为程序提供需要的Bean对象的代理对象,代理对象 内部动态结合业务和通用功能)

IOC 思想(控制反转)

“控制反转”或“反转控制”,强调的是原来在程序中创建Bean的权利反转给第三方。

谁是第三方者,工厂设计模式,BeanFactory,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ThtRyrnL-1684765013985)(https://zhangliuhui.oss-cn-beijing.aliyuncs.com/img/image-20230501113223682.png)]

DI 思想

上面使用BeanFactory的方式已经实现的"控制反转",将Bean的创建权交给了BeanFactory,如果我们想将 UserDao的创建权也反转给BeanFactory,与此同时UserService内部还需要用到UserDao实例对象,

IoC 和 DI 的关系?

首先,先回答IoC和DI的是什么:

IoC:控制反转,将Bean的创建权由原来程序反转给第三方

DI:依赖注入,某个Bean的完整创建依赖于其他Bean(或普通参数)的注入 其次,

再回答IoC和DI的关系:

第一种观点:IoC强调的是Bean创建权的反转,而DI强调的是Bean的依赖关系,认为不是一回事

第二种观点:IoC强调的是Bean创建权的反转,而DI强调的是通过注入的方式反转Bean的创建权,认为DI 是IoC的其中一种实现方式

AOP 面向切面思想

AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的升华。OOP是纵向对一个 事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,属 性与属性、方法与方法、对象与对象都可以组成一个切面,而用这种思维去设计编程的方式叫做面向切面编程

三种思想总结

1)IoC控制反转,是将程序创建Bean的权利反转给第三方;

2)DI依赖注入,某个完整Bean需要依赖于其他Bean(或属性)的注入;

3)AOP面向切面编程,用横向抽取方法(属性、对象等)思想,组装成一个功能性切面。

IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂

2.Spring 提供 IOC 容器实现两种方式:(两个接口)
  • BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用

    • 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
  • ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人 员进行使用

    • 加载配置文件时候就会把在配置文件对象进行创建

Bean细节

  • 注意:需要根据场景决定对象的单例、多例模式。
  • 可以共用:Service、DAO、SqlSessionFactory(或者是所有的工厂)。
  • 不可共用:Connection、SqlSession、ShoppingCart。

普通Bean 和 工厂 Bean

普通的bean : 在配置文件中定义的bean的类型 就是返回类型

工厂bean: 在配置文件中定义的bean类型可以和返回的bean类型不一样

饿汉式创建优势–>为什么spring bean 默认是单例

工厂创建之后,会将Spring配置文件中的所有对象都创建完成(饿汉式)。

提高程序运行效率。避免多次IO,减少对象创建时间。(概念接近连接池,一次性创建好,使用时直接获取)

如果默认是多例bean 首先创建多例bean 会消耗资源 还会占用堆空间

Spring的生命周期

  1. bean 的实例化 通过构造方法创建bean 的实例 默认是无参构造
  2. 给bean 的属性赋值 调用 set 方法
  3. 执行初始化的方法 需要配置初始化方法
  4. 得到完整的bean 对象 ,这时的bean 对象才能够使用
  5. 销毁bean 需要配置 销毁的方法

面试答案

  1. bean 的实例化 通过构造方法创建bean 的实例 默认是无参构造
  2. 给bean 的属性赋值
  3. 把 bean 的 实例 传递给 bean的后置处理器的方法 postProcessBeforeInitialization
  4. 执行初始化的方法
  5. 把 bean 的 实例 传递给 bean的后置处理器的方法 postProcessAfterInitialization
  6. 得到完整的bean 对象 ,这时的bean 对象才能够使用
  7. 销毁bean 当容器关闭的时候 调用销毁的方法

动态代理设计模式

动态创建代理类的对象,为原始类的对象添加辅助功能。

代理对象和真实对象的关系 像是兄弟 代理对象 对真实对象进行增强

CGlib动态代理实现(基于继承) 代理对象和真实对象的关系 就像是 父子

面向切面编程

AOP(Aspect Oriented Programming),即面向切面编程,利用一种称为"横切"的技术,剖开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

1.面向切面编程 利用AOP 可以对业务逻辑的各个部分进行隔离 从而使业务逻辑的各部分之间 耦合度降低,提高程序的可重用性,提好了开发效率,通俗的讲 可以实现不修改源代码的方式,在核心业务里面 添加新的功能

AOP 底层的原理 就是 动态代理 ,真正干活的 bean 是 代理bean , 代理bean 对真实bean 功能增强

  • 连接点(Joinpoint):连接点是程序类中客观存在的方法,可被Spring拦截并切入内容。
  • 说白了 类中的哪些方法 可以被增强 这些方法 就称为是 连接点
  • 切入点(Pointcut):被Spring切入连接点。
  • 真正被增强的方法 称为 切入点
  • 通知、增强(Advice):可以为切入点添加额外功能,分为:前置通知、后置通知、异常通知、环绕通知,最终通知等。
  • 实际增强的逻辑部分 称为通知(增强)
  • 目标对象(Target):代理的目标对象 真实对象
  • 引介(Introduction):一种特殊的增强,可在运行期为类动态添加Field和Method。
  • 织入(Weaving):把通知应用到具体的类,进而创建新的代理类的过程。
  • 代理(Proxy):被AOP织入通知后,产生的结果类。
  • 切面(Aspect):由切点和通知组成,将横切逻辑织入切面所指定的连接点中。是一个动作 把通知 应用到 切入点的过程

切点: 真正要被增强的方法

通知:增强的业务代码

切面:切点 + 通知

1.如果是单例 bean , 随着容器的创建而创建 即 实例化,多例bean 是 获取的时候 实例化

2.属性注入

3.后处理器前置过程 即在初始化方法之前执行的 方法 postProcessBeforeInitialization

4.初始化方法

5.后处理器后置过程 即在初始化方法之后执行的 方法 postProcessAfterInitialization aop动态代理就在这一步

6.得到最终的 bean

7.销毁

注解开发

使用注解目的:简化 xml 配置

spring针对Bean管理创建对象提供的注解

(1)@Component

(2)@Service

(3)@Controller

(4)@Repository

开启组件扫描

<context:component-scan base-package="com.glls.java2301"></context:component-scan>
 <context:component-scan base-package="com.glls" >
    </context:component-scan>

@Autowired

先根据类型注入 再根据名字注入

@Qualifier:根据名称进行注入

和@Autowired 一起使用

@Resource

先根据名字注入 再根据类型注入

bean中属性值的注入

  • @Autowired 基于类型自动注入 先根据类型注入 如果找到多个 再根据名称注入
  • @Resource 基于名称自动注入 先根据名称注入 如果根据名称没找到 则根据类型找 根据类型 找到多个 则报错 找到一个则注入
  • @Qualifier(“userDAO”) 限定要自动注入的bean的id,一般和@Autowired联用
  • @Value 注入简单类型数据 (jdk8种+String)

Json处理

@RequestBody

可以获取请求体 需要在控制器的方法形参上使用 使用请求体中的参数 给当前形参赋值 将请求体中的json数据转为java对象

@ResponseBody

可以将返回的数据转为json类型

也可放在返回值上。

如果返回值是字符串就不用转为json了

@RestController

类上加了@RestController注解,等价于在类中的每个方法上都加了@ResponseBody

@RequestBody

@RequestBody, 接收Json参数

记住:

js 对象 转为 json 串 方法: JSON.stringify(user);

json串转为 js 对象的方法 : JSON.parse(jsonstr);

Jackson常用注解

@JsonFormat(pattern=“yyyy-MM-dd HH:mm:ss”,timezone = “GMT+8”)

属性名修改:@JsonProperty(“new_name”)

属性忽略:@JsonIgnore

FastJson

导入依赖

<!-- FastJson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.54</version>
</dependency>

** 安装FastJson**

<mvc:annotation-driven>
    <!-- 安装FastJson,转换器 -->
    <mvc:message-converters>
        <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
            <!-- 声明转换类型:json -->
            <property name="supportedMediaTypes">
                <list>
                    <value>application/json</value>
                </list>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

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

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

相关文章

11.Mysql内核语句优化规则详解

MySQL性能调优 1. 条件化简1.1 移动不必要的括号1.2 常量传递1.3 移动没用的条件1.4 表达式计算1.5 常量表检测 2. 外连接消除3. 子查询MySQL内部优化规则3.1 子查询语法3.1.1 按返回的结果集区分子查询标量子查询行子查询列子查询表子查询 3.1.2 按与外层查询关系来区分子查询…

20230522打开cv1826的buildroot的内核的早期打印的功能

20230522打开cv1826的buildroot的内核的早期打印的功能 在CV1826的buildroot启动的时候&#xff0c;有些内核打印/printk显示不了。 大概在内核时间3-4s秒钟的前后&#xff0c;有一段内核打印丢失了&#xff01; 在CV1826的buildroot启动到uboot的时候&#xff0c;按ctrlC组合…

性能优化之思路和分析

、优化思路 尽可能减少首屏必须资源的体积尽可能提前首屏必须资源/接口的请求发起时机延后闲时预缓存非必要资源/请求 代码分离 https://webpack.docschina.org/guides/code-splitting/ 动态导入 https://webpack.docschina.org/guides/code-splitting/#dynamic-imports sp…

vector模拟

先来看看vector的源码&#xff0c;string没有看是因为string严格意义上来讲不属于STL。 源代码之间也是存在区别的&#xff0c;大同小异&#xff0c;可以去网上查如何下载STL的源码库。 先看看<vector>文件中的内容&#xff08;当做参考即可&#xff09;&#xff1a; 内容…

springboot服务端接口公网远程调试 - 实现HTTP服务监听【端口映射】

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

【分布式系统】分布式锁实现之Redis

锁有资源竞争问题就有一定有锁的存在&#xff0c;存储系统MySQL中&#xff0c;有锁机制保证数据并发访问。而编程语言层面Java中有JUC并发工具包来实现&#xff0c;那么锁解决的问题是什么&#xff1f;主要是在多线程环境下&#xff0c;对共享资源的互斥。从而保证数据一致性。…

SVG在前端中的常见应用

SVG在前端中的常见应用 一、svg标签1. svg2. g 二、描边属性三、模糊和阴影效果1. 模糊2. 阴影效果 四、线性渐变和径向渐变1. 线性渐变2. 径向渐变 五、绘制1. 内置形状元素2. 绘制矩形3. 绘制圆形4. 绘制椭圆5. 绘制线条6. 绘制多边形7. 绘制多线条8. 绘制文本9. 绘制路径 只…

【C/C++】动态内存管理/泛型编程

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

SQLlite教程(第一篇)

SQLlite教程(第一篇 SQLlite是什么?SQLlite工作原理是什么?SQLlite有什么功能和特性?使用SQLlite有哪些注意事项?附加资料 SQLlite是什么? SQLite&#xff0c;是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是…

Mysql审核查询平台Archery部署

目录 1 Archery产品介绍2 基于docker搭建Archery2.1 系统环境2.2 安装 Docker2.2.1 安装 Docker Compose2.2.2 下载Archery2.2.3 安装并启动2.2.4 表结构初始化2.2.5 数据初始化2.2.6 创建管理用户2.2.7 退出重启2.2.8 日志查看和问题排查2.2.9 启动成功查看2.2.10 端口占用情况…

基于Maven的profiles多环境配置

一个项目通常都会有多个不同的运行环境&#xff0c;例如开发环境&#xff0c;测试环境、生产环境等。而不同环境的构建过程很可能是不同的&#xff0c;例如数据源配置、插件、以及依赖的版本等。每次将项目部署到不同的环境时&#xff0c;都需要修改相应的配置&#xff0c;这样…

day07_数组初识

数组的概述 数组就是用于存储数据的长度固定的容器&#xff0c;保证多个数据的数据类型要一致。 数组适合做一批同种类型数据的存储 数组中的元素可以是基本数据类型&#xff0c;也可以是引用数据类型。当元素是引用数据类型是&#xff0c;我们称为对象数组。 容器&#xff…

从0开始学C语言的个人心得笔记(10w字)

大学的计算机相关专业第一门教学的计算机语言就是c语言&#xff0c;很多大学生面对从未接触过的计算机语言&#xff0c;可能会觉得很难以上门&#xff0c;从而放弃学习c语言。这篇博客写的主要是个人学习C语言时候的知识总结点&#xff0c;不能保证全部是正确的&#xff0c;如有…

Kafka灵魂28问

第 1 题 Kafka 数据可靠性如何保证&#xff1f; 对于 kafka 来说&#xff0c;以下几个方面来保障消息分发的可靠性&#xff1a; 消息发送的可靠性保障(producer) 消息消费的可靠性保障(consumer) Kafka 集群的可靠性保障&#xff08;Broker&#xff09; 生产者 目前生产者…

Leetcode每日一题——“用队列实现栈”

各位CSDN的uu们你们好呀&#xff0c;好久没有更新本专栏啦&#xff0c;甚是想念&#xff01;&#xff01;&#xff01;今天&#xff0c;小雅兰的学习内容是用队列实现栈&#xff0c;下面&#xff0c;让我们进入Leetcode的世界吧&#xff01;&#xff01;&#xff01; 这是小雅兰…

本地 docker 发布 java 项目,连接本地 redis 配置

1、本地项目 install 相应的 jar 包到 target 目录下&#xff0c;jar 包的路径步骤 2 要填写 2、项目根目录下创建 Dockerfile 文件 # 使用官方的 Java 11 镜像作为基础镜像 FROM openjdk:11-jdk# 设置工作目录 WORKDIR /app# 复制应用程序 JAR 文件到镜像中的 /app 目录下 C…

用LangChain实现一个ChatBlog

文章目录 前言环境一、构建知识库二、将知识库向量化三、召回四、利用LLM做阅读理解五、效果总结 前言 通过本文, 你将学会如何使用langchain来构建一个自己的知识库问答 其实大多数类chatpdf产品的原理都差不多, 我将其简单粗暴地分为以下四步: 构建知识库将知识库向量化召回…

vue diff算法与虚拟dom知识整理(11) 书写patch父级新旧为同一节点 子节点与文字交换逻辑实现

上文我们简单描述了patch处理同一节点的大体逻辑 这次 我们就来看一下text替换的情况 我们更改案例入口文件 src下的 index.js 代码如下 import h from "./snabbdom/h"; import patch from "./snabbdom/patch";const container document.getElementById(…

Maven概念及搭建

1.为什么我们要学习 maven? maven 还未出世的时候&#xff0c;我们有很多痛苦的经历 。 痛点 1&#xff1a; jar 包难以寻找 痛点 2&#xff1a; jar 包依赖的问题 痛点 3&#xff1a; jar 不方便管理 痛点 4&#xff1a;项目编译 2.Maven 简介 Maven 是 Apache 软件基金…

Golang中的管道(channel) 、goroutine与channel实现并发、单向管道、select多路复用以及goroutine panic处理

目录 管道&#xff08;channel&#xff09; 无缓冲管道 有缓冲管道 需要注意 goroutine与channel实现并发 单向管道 定义单向管道 将双向管道转换为单向管道 单向管道作为函数参数 单向管道的代码示例 select多路复用 案例演示 goroutine panic处理 案例演示 管道…