Java框架spring(二)

news2024/9/28 19:22:58

一、AOP面向切面编程

1、AOP的概念

AOP(AspectOrientedProgramming),意为:面向切面编程,通过 预编译方式运行期间动态代理实现程序功能的统一维护的一种技术。 AOP是OOP的延续,是软件开发中的一个热点,是java开发中的一个重要内容。利用AOP可以对业务逻辑和非业务逻辑进行隔离,从而使得各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。  

        用白话来讲,面向切面编程是面向对象编程的补充延续,其思想是将程序中的非业务代码(提交事务、打印日志、权限验证、统一异常处理这四个使用场景)提取分离出来,在调用业务代码时通过代理对象帮助调用这些提取出来的非业务代码,这样在业务代码中就不用显示调用的非业务代码,做到了业务代码和非业务代码的分离,降低了耦合度

面向切面编程的好处就是: 降低业务耦合度减少重复,专注业务

核心原理: 使用动态代理的方式在执行方法前后或者出现异常的时候做加入相关的逻辑

AOP编程思想是Java中的而不是spring专有的,是spring使用aop这一编程思想

AOP的基本概念

连接点(Joinpoint):类中可以被增强的方法,这个方法就被称为连接点

切入点(pointcut):类中有很多方法可以被增强,但实际中只有add和update 被增了,那么add和update方法就被称为切入点(实际实现的连接点)

通知(Advice): 通知是指一个切面在特定的连接点要做的事情(增强的功能)。通知分为方法执行前通知,方法执行后通知,环绕通知等.

目标(Target): 代理的目标对象(连接点,切入点所在类)

代理(Proxy): 向目标对象应用通知时创建的代理对象

 2、AOP的实现

        对于 AOP 这种编程思想,很多框架都进行了实现。Spring 就是其中之一, 可以完成面向切面编程。

(1)导入jar包

          AspectJ 是一个基于Java语言的AOP框架,它提供了强大的AOP功能,且其实 现方式更为简捷,使用更为方便, 而且还支持注解式开发。所以,Spring 又 将 AspectJ 的对于 AOP 的实现也引入到了自己的框架中。

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>

(2)配置 

1、基于注解方式的实现 启动AspectJ支持开启自动代理注解(在spring全局配置文件中):
<aop:aspectj-autoproxy/>

AspectJ中常用的通知有五种类型: 前置通知,后置通知,环绕通知,异常通知,返回通知.

@Before前置通知:方法执行之前

@After后置通知:方法执行之后,无论是否出现异常

@AfterReturnning返回通知:方法成功执行之后通知,出现异常不执行

@AfterThrowing异常通知:抛出异常之后通知

@Around环绕通知:方法执行前后都有通知

@Before 前置通知  在业务方法执行之前执行
@After  后置通知  在业务执行完之后执行通知 即使业务代码中出现了异常也会执行
@AfterReturning 返回通知 在业务执行完之后执行通知 当业务代码出现异常便不再执行
@AfterThrowing 异常通知 当业务代码中出现异常时执行通知
// @Before("execution(* com.wbc.SpringPro.dao.AdminDao.*(..))")
// @After("execution(* com.wbc.SpringPro.dao.AdminDao.*(..))")
// @AfterReturning("execution(* com.wbc.SpringPro.dao.AdminDao.*(..))")
// @AfterThrowing("execution(* com.wbc.SpringPro.dao.AdminDao.*(..))")
// @AfterThrowing(value = "execution(* com.wbc.SpringPro.dao.AdminDao.*(..))",throwing = "throwable")//告知异常是什么

环绕通知---一节更比四节强(一个通知可以完成四个通知的功能)

@Around(value = "execution(* com.wbc.SpringPro.dao.AdminDao.*(..))")
public void around(ProceedingJoinPoint proceedingJoinPoint){
//proceedingJoinPoint表示增强的方法 spring封装过的反射机制中的method
//通过反射机制中 getMethod()方法拿到
    System.out.println("前置通知");
    try {
//拿到所有参数 相当于反射机制中getFields()方法
        Object[] objects = proceedingJoinPoint.getArgs();
//调用目标业务方法 相当于反射机制中的invoke()方法
        Object object  = proceedingJoinPoint.proceed();
        System.out.println("返回通知");
    } catch (Throwable e) {
        e.printStackTrace();
        System.out.println("异常通知");

    }
    System.out.println("后置通知");
}

2、在通知所在的类上方添加标签,在通知上方添加标签

在通知所在的类上方添加@Aspect标签,用于定义切面

通知上方添加标签定义通知的类型

第一个*表示任意类型返回值
第二个*表示任意的方法
..表示任意参数

3.1、通过代理对象调用方法
package com.wbc.SpringPro.test;

import com.wbc.SpringPro.service.AdminService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test3 {

    public static void main(String[] args) {
        ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring.xml");
        AdminService adminService = (AdminService) applicationContext.getBean("adminService", AdminService.class);
        adminService.insertAmin();
        adminService.updateAmin();
        adminService.deleteAmin();
    }
}

 这里可以看到,生成的是代理对象而不是AdminDao类的对象

 3.2通过代理对象调用方法测试around环绕通知

在AdminDao中模拟一个异常

package com.wbc.SpringPro.dao;

import com.wbc.SpringPro.model.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

@Repository(value = "adminDao")
public class AdminDao {

    @Autowired
    JdbcTemplate jdbcTemplate;
   
    public void insert(){
        System.out.println("新增");
        System.out.println(10/0);
    }
    public void update(){
        System.out.println("修改");

    }
    public void delete(){
        System.out.println("删除");

    }




}

测试

package com.wbc.SpringPro.test;

import com.wbc.SpringPro.service.AdminService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test3 {

    public static void main(String[] args) {
        ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring.xml");
        AdminService adminService = (AdminService) applicationContext.getBean("adminService", AdminService.class);
        adminService.insertAmin();
        adminService.updateAmin();
        adminService.deleteAmin();
    }
}

 结果

二、spring事物管理 

1、spring事物管理的定义

        事物管理本质上是数据库提供的一种管理机制

        数据库事物管理是对一次数据操作中的多条sql语句进行统一管理,确保在一次操作过程中,要么都执行要么都不执行,从而保证数据一致性

        例如转账这一操作中,sql1从A账户中减少5百,sql2从B账户中增加500,事物管理可以保证两条sql都执行或都不执行,保障数据的一致性

        spring事务管理spring框架对事物提交这一功能进行的封装。程序员在业务开发中不需要显示的提交事务

2、spring事物管理有两种方式

(1)编程式事务管理

        需要程序员在代码中自己控制事务提交和回滚,现在在项目中很少使用,

(2)声明式事务管理

        声明式事物在底层使用了AOP思想,可以为方法添加事物功能,他的控制是方法级别的

在spring框架中,提交事物管理实现类是DataSourceTransactionManager,基于注解实现的spring事务管理

1、配置

将事务管理器添加到spring全局配置文件xml

<!-- 配置spring 事务管理器-->
<bean id="transactionManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="druidDataSource"></property>
</bean>

 开启注解事务管理器

<!-- 开启注解事务管理-->
<tx:annotation-driven transaction-manager="transactionManager"/>

2、使用注解进行事务管理

在类或方法上使用@Transactional标签即可

package com.wbc.SpringPro.dao;

import com.wbc.SpringPro.model.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

@Repository(value = "adminDao")
public class AdminDao {

    @Autowired
    JdbcTemplate jdbcTemplate;

    /*
        连接点:类中可以被增强(加功能:提交事物,打印日志,统一异常处理,权限验证)的方法就被称为连接点
        切入点:类中实际被增强的方法
        目标:代理的目标类(连接点和切入点所在的类)、
        代理: 向目标对象应用通知时创建的代理对象
    */
    @Transactional
    public void insert(){
        System.out.println("新增");
        jdbcTemplate.update("insert into admin(account,password,gender) values(?,?,?)","张四","111","女");
        //模拟出异常
        System.out.println(10/0);
        jdbcTemplate.update("insert into admin(account,password,gender) values(?,?,?)","张五","111","女");
    }
    public void update(){
        System.out.println("修改");

    }
    public void delete(){
        System.out.println("删除");

    }
}

执行后,第一个sql执行后由于有异常第二个sql无法执行,事物不提交

补充: 

       1) @Transactional事务管理标签一般添加到service业务逻辑层上,在service层一般会调用多个dao层方法,@Transactional添加到service后,当在service层调用时中途遇到异常时,也可以通过事物管理进行回滚事物,防止事物的不一致性

        2)在学习期间推荐将@Transactional添加到类名上,这样可以为整个类添加事务管理

 3、声明式事务不生效的场景

我们在adminDao中写下两个方法

1)@Transactional 应用在非 public 修饰的方法上

        由于Spring事物管理也运用了反射机制,底层使用的是获取公共成员方法的方法,导致事务管理无法添加到封装的方法中,进而导致声明式事物不生效

没有进行回滚仍然将张6添加到了sql数据库

2)异常被catch捕获导致失效

        当方法中的异常被捕获,spring事物管理会认为方法没有出现异常,从而错误提交事物

仍然会将数据添加到数据库,但由于异常的数据可能会在下面的sql中用到,存入的sql就有可能是错误的数据

3)出现编译期异常

        当方法中出现了编译期异常,仍然回提交事物。

        我们可以通过在标签@Transactional添加(rollbackFor = Exception.class)属性进行控制,当出现编译期异常时,进行回滚@Transactional(rollbackFor = Exception.class)

4)数据库引擎不支持事务

        mySql中只有innodb支持事物,当使用其他引擎时,事务不生效

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

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

相关文章

URP custompasscustom render objects 下

上文 https://blog.csdn.net/qq_35158695/article/details/141708043?spm1001.2014.3001.5501 上次说了绘制流程&#xff0c;还需要指定FBO 在renderpass的这个configure函数里&#xff0c;设置render target 这里的纹理是从shader里map出来的ID&#xff0c;不过我看他文章没…

STM32F1+HAL库+FreeTOTS学习7——列表和列表项

STM32F1HAL库FreeTOTS学习7——列表和列表项 列表和列表项简介列表列表项迷你列表项 列表项API函数介绍1. 初始化列表2. 初始化列表项3. 列表末尾插入列表项4. 列表插入列表项5. 移除列表项6. 补充&#xff1a;FreeRTOS中操作列表和列表项的宏 列表项的插入和删除实验总结 上一…

人工智能时代,AI数据服务行业面临的机遇与挑战

随着大数据、云、物联网、人工智能等信息科技技术的发展以及互联网设备的普及&#xff0c;各行业产生了前所未有海量的AI数据服务需求&#xff0c;彻底宣告了数据时代的来临。 首先&#xff0c;物联网的发展更使线下业务产生的大量数据被采集起来&#xff0c;世界各地的AI数据…

需求管理软件对比:2024年10款推荐工具

本文将介绍10款需求管理软件&#xff1a;1.PingCode&#xff1b;2. Worktile&#xff1b;3. 开源中国社区 Gitee&#xff1b;4. 金动力&#xff1b;5. 氚云&#xff1b;6. 协作云&#xff1b;7. 麦塔在线&#xff1b;8. Height&#xff1b;9. Plaky&#xff1b;10. ActiveColla…

万龙觉醒辅助:屠龙攻略大全!VMOS云手机带你组团抓龙!

在《万龙觉醒》中&#xff0c;使用VMOS云手机能够为玩家提供专属定制版的云手机&#xff0c;不仅内置游戏安装包&#xff0c;还无需重新下载安装游戏。这一切都让玩家的游戏体验更加便捷和高效。VMOS云手机能够辅助游戏的自动化运行&#xff0c;支持24小时云端运行&#xff0c;…

论文《Adversarial Examples on Graph Data: Deep Insights into Attack and Defense》笔记

【IG-Attack 2019 IJCAI】本文提出了一种基于integrated gradients的对抗攻击和防御算法。对于攻击&#xff0c;本文证明了通过引入integrated gradients可以很容易解决离散问题&#xff0c;integrated gradients可以准确反映扰动某些特征或边的影响&#xff0c;同时仍然受益于…

【并发编程】从AQS机制到同步工具类

AQS机制 Java 中常用的锁主要有两类&#xff0c;一种是 Synchronized 修饰的锁&#xff0c;被称为 Java 内置锁或监视器锁。另一种就是在 JUC 包中的各类同步器&#xff0c;包括 ReentrantLock&#xff08;可重入锁&#xff09;、Semaphore&#xff08;信号量&#xff09;、Co…

走出新手村,软件测试银行项目怎么测试 + 面试题(答案)

前言 业务&#xff1a; 银行类app具体模块业务讲解&#xff1a; 掌上生活&#xff08;消费/理财&#xff09; 消费&#xff1a; 与电商平台业务类似 饭票&#xff1a;GPS定位城市服务、饭票购买消费、餐厅查询、代金券、周三五折、banner图、我的饭票、我的抵扣券 影票 …

RKNPU2从入门到实践 ---- 【9】使用RKNPU2的C API接口将RKNN模型部署在RK3588开发板上

注&#xff1a;作者使用的平台为Ubuntu20.04虚拟系统&#xff0c;开发板为RK3588&#xff0c;开发板上面的系统为Ubuntu22.04。 前言 本博文我们要学习使用 RKNPU2 提供的 C API 接口将RKNN模型部署在RK3588开发板上&#xff0c;完成测试图片在开发板上的推理工作。C API接口…

【书生3.2】Lagent 自定义你的 Agent 智能体

Lagent 自定义你的 Agent 智能体 1 环境准备2 启动模型3 部署lagent4 可视化页面及配置5 自定义工具的智能体 1 环境准备 直接复用之前的xtuner或者llamaindex环境 # 安装其他依赖包 conda activate llamainde pip install termcolor2.4.0 pip install lmdeploy0.5.2pip inst…

Gazebo Harmonic gz-harmonic 和 ROS2 Jazzy 思考题 建图和导航 SLAM Navigation

仿真 效果还挺好的。 SLAM建图 SLAM 仿真测试录屏 配置环境 Gazebo Harmonic ROS Jazzy 导航 …… 提示 这篇文档详细介绍了如何在ROS 2环境中使用SLAM&#xff08;Simultaneous Localization and Mapping&#xff0c;即同时定位与地图构建&#xff09;和Nav2&#xff08;N…

XXE-labs靶场通关攻略

环境地址自行查找 1.寻找靶机地址 使用工具goby进行扫描 因为我的靶场是搭在ubuntu上 直接查找系统是Ubuntu的就可以找到 靶机IP 172.16.1.183 2.访问靶场 3.使用目录扫描工具进行扫描 使用kali自带的dirsearch进行扫描 可以看到一个robots.txt文件 4.访问robots.txt文件 …

白夜剧场再出爆款《边水往事》,这次能“带飞”优酷吗?

这个暑期档&#xff0c;优酷靠着白夜剧场悬疑新作《边水往事》再下一城。 谁能想到刚开播时无人问津的《边水往事》竟然“爆”了&#xff0c;8月16日首播当天市占率仅仅1.73%&#xff0c;播放量不到700万&#xff0c;而在上线第十天&#xff0c;《边水往事》终于逆袭夺冠&…

#QT 笔记一

重点&#xff1a;面试考试大概率涉及&#xff0c;需要不借助任何资料掌握。掌握&#xff1a;面试考试可能涉及&#xff0c;需要不借助任何资料掌握。熟悉&#xff1a;面试考试可能涉及&#xff0c;可以稍微参考资料掌握。了解&#xff1a;面试考试小概率涉及&#xff0c;面试拔…

Navicat连接SqlServer

一、前提条件 本地已经安装好了SqlServer和navicat 二、操作 打开sqlserver配置管理器 tcp默认关闭&#xff0c;我们右击打开 需要重启服务才能生效 三、效果

【ACM出版,EIScopus快检索-高录用】2024年数字经济与计算机科学国际学术会议(DECS2024,9月20-22)

欢迎参加2024年数字经济与计算机科学国际学术会议&#xff08;DECS2024&#xff09;&#xff0c;本次大会得到了马来西亚理工大学、北京科技大学经济管理学院、南京信息工程大学、马来西亚敦胡先翁大学的大力支持&#xff01; 旨在汇聚全球在数字经济与计算机科学领域内的研究者…

《黑神话:悟空》爆火,对程序员的 5 点启示(1)

# 前言 2024年8月&#xff0c;被誉为 “首部国产 3A 大作” 的《黑神话&#xff1a;悟空》一段13分钟的实机演示视频&#xff0c;简直像是给全球玩家投下了一颗冲击弹&#xff0c;瞬间炸开了一片热闹场面&#xff0c;点燃了海内外游戏和西游文化爱好者的热情&#xff0c;迅速地…

How to work with OpenAI maximum context length is 2049 tokens?

题意&#xff1a;"如何处理OpenAI的最大上下文长度为2049个tokens的问题&#xff1f;" 问题背景&#xff1a; Id like to send the text from various PDFs to OpenAIs API. Specifically the Summarize for a 2nd grader or the TL;DR summarization APIs. "…

重谈地址空间

虚拟地址是如何转化的物理地址的&#xff1f; 我们以32位计算机为例子 32 为计算机的虚拟地址就是32位。 32 位的虚拟地址 分为三个部分 为 10 10 12&#xff1b; 这是由页表内部的结构决定的。 页表分为两级 虚拟地址的前十位为一级页表对应的位置&#xff0c; 次10位表示…

鸿蒙(API 12 Beta3版)【识别本地图片】

基本概念 图片识码能力支持对图库中的码图进行扫描识别&#xff0c;并获取信息。 场景介绍 图片识码能力支持对图库中的条形码、二维码、MULTIFUNCTIONAL CODE进行识别&#xff0c;并获得码类型、码值、码位置信息。该能力可用于一图单码和一图多码的识别&#xff0c;比如条…