Spring 与 Servlet-2

news2024/11/23 12:32:50

学习笔记(加油呀):

Spring的通知类型

Spring 通知类型按切面功能调用的不同时刻,可以分为提供了 5 种 Advice 类型

1、前置通知 Before advice:在某连接点之前执行的通知,但这个通知不能阻止连接点之前的执行流程(除非它抛出一个异常)

2、后置通知 After returning advice:在某连接点正常完成后执行的通知

3、异常通知 After throwing advice:在方法抛出异常退出时执行的通知

4、最终通知 After (finally) advice:当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)

5、环绕通知 Around Advice:包围一个连接点的通知,如方法调用。这是最强大的一种通知类型。环绕通知

可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它自己的返回值或抛出异常来结束执行

通知类型的选择

1、环绕通知是最常用的通知类型

2、推荐使用尽可能简单的通知类型来实现需要的功能

3、如果你只是需要一个方法的返回值来更新缓存,最好使用后置通知而不是环绕通知

4、用最合适的通知类型可以使得编程模型变得简单,并且能够避免很多潜在的错误

依赖:spring-aop 和 spring-aspects

应用开发 1:在访问 UserServImpl 具体实现类中方法时需要记录日志【应该使用日志记录器,例如 log4j,这里简化为控制台输出】

public class LogAdvice{
    public void before(){
        System.out.println("before...");
    }
}

配置这个通知类对象,同时引入 aop 名空间用于配置拦截规则

<bean id = "LodAdvice" class = "com.ma.aop.LogAdvice"/>
<aop:config>
    <!--定义切面-->
    <aop:aspect ref="logAdvice">
        <aop:pointcut id = "bbc" expression = "execution(* com.ma.biz.*.*(..))"/>
        <aop:before method = "before" pointcut-ref="bbc"/>
    </aop:aspect>
</aop:config>

可以使用连接点对象 JoinPoint 获取当前拦截的连接点相关信息,但是除非是原地修改否则修改传入数据无效;不能决定程序是否继续执行,除非人为抛出异常阻止继续执行

public class LogAdvice(){
    public void before(JoinPoint joinPoint){
        System.out.println("before...");
        Object target = joinPoint.getTarget();
        System.out.println("调用的目标对象为"+target);
        Signature signature = joinPoint.getSignature();
        System.out.println("方法签名为:"+ signature.getName());
        Object[] args = joinPoint.gteArgs();
        System.out.println("调用的方法参数为:" + args);
    }
}

应用 2:修改业务方法的返回值,将口令修改为等长星号

AfterReturning 可以原地修改返回值,但是如果不是原地修改,则修改无效

public class PasswordAspect{
    public void changePassword(List<User> userList){
        for(User tmp:userList){
            tmp.setPassword(changePwd(tmp.getPassword()));
        }
    }
    private String changePwd(String Pwd){
        StringBuilder sb = new StringBuilder();
        for(int i = 0;i < pwd.length();i++)
            sb.append("*");
        return sb.toString();
    }
}

applicationContext.xml 配置

<bean id = "PwdAspect" class = "com.ma.aop.PasswordAspect"/>
<aop:config>
    <aop:aspect ref="PwdAspect">
        <aop:pointcut id = "bbc" expression = "execution(java.util.List com.ma.biz.*.getAllUsers())"/>
        <aop:before method = "changePassword" pointcut-ref="bbc" returning = "userList"/>
    </aop:aspect>
</aop:config>

应用 3:无所不能的环绕通知

环绕通知可以在方法执行前执行,可以修改传入参数,可以决定是否执行目标程序,可以在方法执行后执行,可以修改返回值,可以捕获异常并消费掉,可以使用 try/finally 结构定义最终需要执行的程序

@Override
public String hello(String name){
    System.out.println("业务方法参数:" + name);
    String res = "Hello"+name+"!";
    System.out.println("业务方法返回值:" + res);
    return res;
}

定义对应的切面类

public class AroundAspect{
    //如果需要获取请求相关信息,则需要在方法中添加一个参数ProceedingJoinPoint
    public Object aaa(ProceedingJoinPoint pjp){
        Object res = null;
        try{
            System.out.println("前置处理程序....");
            Signature signature = pjp.getSignature();//方法签名
            Object target = pjp.getTarget();//目标对象
            Object[] args = pjp.getArgs();//获取调用方法的请求参数
            if(args!=null && args.length>0){
                args[0] = "修改传入参数";
            }
            //pjp.proceed() 用于不修改参数的继续向后执行,下一个是目标对象,还是下一个切面
            res = pjp.proceed(args);//用于修改请求参数
            System.out.println("返回后置处理程序...");
            res = "修改返回值:"+res;
        }catch(Throwable exception){
            System.out.println("异常处理程序...");
        }finally{
            System.out.println("最终处理程序...");
        }
        return res;
    }
}

对应配置

<bean id = "aroundAspect" class = "com.ma.aop.AroundAspect"/>
<aop:config>
    <aop:aspect ref="aroundAspect">
        <aop:pointcut id = "bbc" expression = "execution(java.lang.String *.he*.*(java.lang.String))"/>
        <aop:before method = "aaa" pointcut-ref="bbc"/>
    </aop:aspect>
</aop:config>

注意:事实上在环绕通知中甚至可以执行其它程序,而不执行真正调用的方法

斑鸠蛋模式:阳奉阴违

具体应用:

一般针对控制层建议使用 Filter 之类的 AOP 实现;针对业务层建议使用 Spring AOP,针对持久层的 Mybatis还是优先考虑 MyBatis 的拦截器 Interceptor

使用 AOP 三种方式

1、通过 Spring 的 API 实现 AOP。实现前置通知接口 MethodBeforeAdvice / 后置通知 AfterReturningAdvice / 环绕通知 MethodInterceptor / 最终通知 AfterAdvice / 异常通知 AfterThrowingAdvice 等特定的接口

<bean id="log" class="com.ma.Log"/>
<bean id="afterLog" class="com.ma.AfterLog"></bean>
<aop:config>

切入点,需要告诉方法在什么去执行。expression="execution(* com.ma..(…))"其中第一个* 表示所有的返回值,然后就是包名。第二个表示所有的类对象。第三个表示类对象所有的方法。第四个*表示所有方法下面的带参数的方法或者是不带参数的方法

    <aop:pointcut expression="execution(* com.ma.*.*(..))" id="pointcut"/>
    <aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
</aop:config>

Spring AOP 的工作原理【面试】

Spring 框架中的 AOP 拦截技术是 POJO 的方法层面的拦截【拦截的颗粒度较粗】。其底层实现原理是动态代理技术。对于面向接口的方法拦截,依赖于 jdk 的动态代理技术,即 java.lang.reflect.Proxy#newProxyInstance,

将对被代理的目标对象的调用,委托到代理对象,触发拦截通知;而当被拦截的方法, 不是在接口中定义时,使用的是 cglib,对字节码进行动态增强,生成被代理类的子对象,以实现代理spring 实现 aop,动态代理技术的两种实现是 jdk 动态代理、cglib 代理,根据被通知的方法是否为接口方法,来选择使用哪种代理生成策略

1、jdk 动态代理,原理是实现接口的实例,拦截定义于接口中的目标方法,性能更优,是 spring 生成代理的优先选择

2、cglib 代理,原理是使用 cglib 库中的字节码动态生成技术,生成被代理类的子类实例,可以拦截代理类中的任一 public 方法的调用,无论目标方法是否定义于接口中,更通用,但性能相对 jdk 代理差一些;

在这里插入图片描述

2、自定义类来实现 AOP,不实现 spring 的自带的通知

<bean id="userService" class="com.ma.UserServiceImpl"/>
<bean id="log" class="com.yan.Log"/>切面也要配置成 bean
<aop:config>
    <aop:aspect ref="log">
        <aop:pointcut expression="execution(* com.ma.*.*(..))切入点表达式" id="pointcut"/>
        <aop:before method="before 切面类中的方法名" pointcut-ref="pointcut"/>
        <aop:after method="after 切面类中的方法名" pointcut-ref="pointcut"/>
    </aop:aspect>
</aop:config>

3、通过注解实现 AOP

首先切面类需要定义为受管 bean,也就是 xml 配置或者使用@Component 注解+自动扫描

@Aspect
public class Log {        
    @Before("execution(* com.ma.*.*(..))") //前置处理程序
    public void before(JoinPoint jp){
        System.out.println("方法执行前"); }
    @After("execution(* com.ma.*.*(..))") //最终处理程序
    public void after(){
        System.out.println("方法执行后"); }
    @Around("execution(* com.ma.*.*(..))") //环绕处理程序
    public Object around(ProceedingJoinPoint jp) throws Throwable{
        System.out.println("环绕前");
        System.out.println("方法"+jp.getSignature());
        Object result=jp.proceed();
        System.out.println("环绕后");
        return result; }
}

对应配置

<bean id="log" class="com.ma.Log"/>
<aop:aspectj-autoproxy/> 打开自动代理

5 种常见注解

1、@Before 前置通知, 在方法执行之前执行

2、@After 最终通知, 在方法执行之后执行

3、@AfterRunning 后置通知, 在方法返回结果之后执行

4、@AfterThrowing 异常通知, 在方法抛出异常之后

5、@Around 环绕通知, 围绕着方法执行

复习了一下MyBatis 整合 Spring

1、添加依赖 mybatis、mybatis-spring,另外不使用 mybatis 提供的连接池,而是使用产品级连接池 druid,所以添加依赖 druid 以及数据库驱动

2、定义表结构,从输入页面上进行总结

create table if not exist tbl_users(
    id bigint primary key auto_increment,
    username varchar(32) not null unique,
    password varchar(32) not null,
    hiredate timestamp default current_timestamp comment '入职时间',
    sex boolean default 1
)engine=innodb default charset utf8;

3、使用反向映射插件 mybatis-generator-maven-plugin 进行反向映射,生成实体类、mapper 接口和 mapper.xml映射元文件

添加反向映射的配置文件,可以从网络中获取,也可以从旧有项目中进行拷贝修改

在这里插入图片描述

生成的映射元文件 UserMapper.xml、实体类 User 和映射接口 UserMapper

在这里插入图片描述

4、修改映射生成的类、接口和 xml 文件

实体类

@Data
public class User implements Serializable{
    private Long id;
    private String username;
    private String password;
    private Data hiredata;
    private Boolean sex;
}

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

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

相关文章

SAP ABAP ALV FIELDCAT 字段设置详细说明

一、SAP ABAP ALV FIELDCAT 字段设置的位置&#xff1a; 二、SAP ABAP ALV FIELDCAT 字段设置的详细说明&#xff1a; 字段属性描述使用目的CFIELDNAME参照Currency单位的字段名根据单位显示相应值CHECKBOX设置成复选框字段输出选项COL POS字段的输出顺序字段输出选项COLDDICT…

Android Studio实现内容丰富的安卓视频管理平台

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号081 1.开发环境 android stuido 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.本地视频 3.视频播放 4.收藏功能 5.网路视频…

R语言绘图丨论文中最常用箱线图绘制教程,自动进行显著性检验和误差线标注

多组比较式箱线图 在科研论文绘图中&#xff0c;对于多组数据进行比较一般采用箱线图的方法&#xff0c;今天分享一下这个经典数据可视化方法&#xff0c;从零开始绘制一张带误差棒并自动计算显著性比较结果的箱线图。 前言&#xff1a;箱线图有什么优势&#xff1f; 数据分布…

【AcWing算法基础课】第三章 搜索与图论

文章目录 前言课前温习一、深度优先搜索&#xff08;DFS&#xff09;1、排列数字1.1题目描述1.2思路分析1.3代码实现 2、 n-皇后问题1.4题目描述1.5思路分析1.6代码实现 二、宽度优先搜索&#xff08;BFS&#xff09;1、走迷宫2.1题目描述2.2思路分析2.3代码实现 三、树与图的存…

2023.07.05 ARM day6

实验1 1.在键盘输入一个字符&#xff0c;串口工具进行显示 2.例如&#xff1a;在在键盘输入一个字符a,串口工具进行显示b 实验2 1.在键盘输入一个字符串&#xff0c;串口工具进行显示 2.例如&#xff1a;在在键盘输入一个字符串“huyue”,串口工具进行显示“huyue” inclu…

MySQL数据库管理与开发

什么是MySQL 数据库&#xff1f; M典MQLB公司开发的一个关系型数据库管理系统。通过它司以有效地组织和管理存储在数据库中的数据。MySQL 数据库可以称得上日前运行速度最快的SQL语言数据库。 MySQL 的优势 MySQL数据库是一款自由软件&#xff0c;任何人都可以从MySQL的官方…

保姆级 雅特力AT32 MCU 从SRAM启动KEIL工程配置步骤(STM/GD/APM通用)

好记性不如烂笔头&#xff0c;既然不够聪明&#xff0c;就乖乖的做笔记&#xff0c;温故而知新。 本文档用于本人对知识点的梳理和记录。 一、前言 开发工具&#xff1a;KEIL 开发板&#xff1a;AT32F415 AT-START-F415 软件工程&#xff1a;雅特力BSP flash_wirte_read 点击…

阿里开业项目chat2DB-人工智能SQL分析介绍

1. chat2DB简介 1-1. 简介 ​ chat2DB是一款有开源免费的多数据库客户端工具&#xff0c;支持windows、mac本地安装&#xff0c;也支持服务器端部署&#xff0c;web网页访问。和传统的数据库客户端软件Navicat、DBeaver 相比Chat2DB集成了AIGC的能力&#xff0c;能够将自然语…

RabbitMQ系列(9)--RabbitMQ预取值及利用预取值实现不公平分发

概念&#xff1a;RabbitMQ的默认分发消息机制是轮询分发&#xff0c;但在消费者之间处理任务速度不同时&#xff0c;这种分发消息机制会导致任务的处理效率低下&#xff0c;处理任务速度快的消费者很大一部分的时间处于空闲状态&#xff0c;速度慢的消费者则一直在干活&#xf…

SpringBoot教学资料6-SpringBoot登录注册功能实现(带简单前端)

项目样式&#xff1a; SQL: CREATE TABLE t_user (id int(11) NOT NULL AUTO_INCREMENT,username varchar(32) NOT NULL,password varchar(32) NOT NULL,PRIMARY KEY (id),UNIQUE KEY username (username) ) ENGINEInnoDB AUTO_INCREMENT5 DEFAULT CHARSETutf8项目结构&#xf…

数据结构(排序)

文章目录 一、排序的概念二、插入排序1. 基本思想2. 直接插入排序3. 希尔排序(缩小增量排序) 三、选择排序1. 基本思想2. 直接选择排序3. 堆排序 四、交换排序1. 基本思想2. 冒泡排序3. 快速排序 五、归并排序六、其他排序6.1 计数排序6.2 基数排序6.3 桶排序 一、排序的概念 …

记一次 .NET 某医院预约平台 非托管泄露分析

一&#xff1a;背景 1. 讲故事 前几天有位朋友找到我&#xff0c;说他的程序有内存泄露&#xff0c;让我帮忙排查一下&#xff0c;截图如下&#xff1a; 说实话看到 32bit&#xff0c; 1.5G 这些关键词之后&#xff0c;职业敏感告诉我&#xff0c;他这个可能是虚拟地址紧张所…

Docker快速部署Hadoop环境

Docker安装部署Hadoop环境&#xff0c;通过三个容器来模拟三个节点&#xff0c;最后只保留Master节点实现搭建。 安装环境 Ubuntu 22.04.1 LTS 和Docker 23.0.1 安装过程 拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/hadoop_test/hadoop_base在Docker中创建网…

供应链管理系统有哪些模块?

先弄搞清楚&#xff1a;供应链管理的概念与定义 供应链管理(Supply Chain Management ,简称SCM)&#xff1a;就是指在满足一定的客户服务水平的条件下&#xff0c;为了使整个供应链系统成本达到最小而把供应商、制造商、仓库、配送中心和渠道商等有效地组织在一起来进行的产品…

Kubernetes(k8s)容器编排Pod调度策略

目录 1 节点调度1.1 创建资源清单1.2 应用部署1.3 删除pod 2 定向调度(标签调度)2.1 创建标签2.1.1 添加标签2.1.2 显示标签 2.3 创建资源清单2.4 应用部署2.5 删除pod 1 节点调度 ​ 一般而言pod的调度都是通过RC、Deployment等控制器自动完成&#xff0c;但是仍可以通过手动配…

自然语言处理的分词与词嵌入

1 分词 1.1 什么是分词 分词是把自然语言语句进行数字化的过程。 1.2 为什么要分词 自然语言是字符串序列&#xff0c;机器没办法直接处理&#xff0c; 需要处理成数字的形式。 1.3 如何进行分词 以英文为例&#xff1a; 1 按空格划分 这应该是最简单也最直观的做法了。这…

Vue3setup的参数说明

setup的两个参数 setup包含两个参数&#xff0c;一个为props、一个为context &#xff08;均为形参&#xff09; props&#xff1a;值为对象&#xff0c;包含&#xff1a;组件外部传递过来&#xff0c;且组件内部声明接收了的属性。context&#xff1a;上下文对象 <scrip…

26-DOM常见的操作(了解)

一、DOM &#x1f37f;&#x1f37f;&#x1f37f;文档对象模型 (DOM) 是 HTML 和 XML 文档的编程接口 它提供了对文档的结构化的表述&#xff0c;并定义了一种方式可以使从程序中对该结构进行访问&#xff0c;从而改变文档的结构&#xff0c;样式和内容 例如&#xff1a;随着…

2023再更新下百度蜘蛛最新UA(User Agent)

其实百度蜘蛛的UA一直没什么变化&#xff0c;有不少朋友以为百度蜘蛛修改特征了&#xff0c;我查了下日志&#xff0c;把最新的UA整理出来给大家。 百度UA信息&#xff1a; Mozilla/5.0 (compatible; Baiduspider/2.0; http://www.baidu.com/search/spider.html) 神码ai在了…

LVS负载均衡群集——DR直接路由模式

一.LVS数据包流向分析 1.数据包流向 &#xff08;1&#xff09;客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。 &#xff08;2&#xff09;Director Ser…