java-Spring框架02

news2024/11/15 1:53:38

1.AOP

1.概述

AOP (Aspect Oriented Programming):面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。(是对面向对象编程的补充延续,)
面向切面编程思想:是将程序中非业务代码(提交事务,打印日志,权限验证,统一异常处理)提取分离出来,然后再调用业务代码时,通过代理对象,帮助调用这些提取出来的非业务代码,这样在业务代码不用显示的调用非业务代码,做到业务代码和非业务代码的分离,降低了耦合度。
面向切面编程的好处: 模块之间耦合度降低
面向切面编程原理:动态代理模式,给业务代码生成代理对象
AOP思想是java中的,不是spring中专有的,是spring使用AOP这一编程思想

2.AOP基本概念

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

切入点(pointcut): 类中有很多方法可以被增强,但实际中只有 add 和 update 被增了,那么 add 和 update 方法就被称为切入点(实际实现的连接点)
    public void insert() {
        System.out.println("新增");
       /* this.commit();//虽然把一些非业务代码进行抽取,但是依然还要调用
        this.printLog();*/
//        System.out.println(10/0);

    }
通知(Advice): 通知是指一个切面在特定的连接点要做的事情(增强的功能)。通 知分为方法执行前通知,方法执行后通知,环绕通知等.
目标(Target): 代理的目标对象(连接点,切入点所在类)
代理(Proxy): 向目标对象应用通知时创建的代理对象

2.SpringAOP实现

1.在pom.xml引入AOP相关依赖jar包

  <!--AOP 相关 jar-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>5.2.2.RELEASE</version>
    </dependency>

2.配置注解支持,启动自动代理

  <!--开启自动代理 启动AspectJ支持-->
    <aop:aspectj-autoproxy />

3.AspectJ 常用通知

1.@Before

前置通知 在方法执行前调用执行

2.@After

后置通知 在业务方法执行完后调用执行 即使代码出现异常也会执行

3.@AfterReturnning

返回通知 方法成功执行之后调用执行,方法出现异常不执行

4.@AfterThrowing

异常通知 当业务代码出现异常后通知

5.@Around

环绕通知 可以在业务方法执行之前,之后,处异常时添加功能

下面是自定义的环绕通知及测试代码

  @Around(value ="execution(* com.ffyc.springpro.dao.AdminDao.*(..))")
    public void around(ProceedingJoinPoint joinPoint){
        System.out.println("前置通知");
        try {
            Object[] objects = joinPoint.getArgs();
            System.out.println(Arrays.toString(objects));//获取到目标方法参数
            Object object= joinPoint.proceed();//调用目标业务方法
            System.out.println("返回通知");
        } catch (Throwable throwable) {

            throwable.printStackTrace();
            System.out.println("异常通知");
        }
        System.out.println("后置通知");

    }
public class Test3 {
    public static void main(String[] args) {
     

        ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring.xml");
     AdminService adminService=applicationContext.getBean("adminService",AdminService.class);
   adminService.insertAdmin();
   adminService.updateAdmin();
   adminService.deleteAdmin();
    }
}

运行结果:

4.Spring事物管理

1.相关概念

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

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

spring事务管理:是spring框架对事务提交这一功能进行封装,程序员在业务开发中不需要显示的提交事务。( sqlSession.commit() )

Spring中的事务管理分为两种形式:

1.编程式事务管理

需要程序员在代码中控制事务提交和回滚。

2.声明式事务管理

声明事务底层使用了AOP思想,可以为方法添加事务功能,它的控制是方法级别的。

基于注解实现的 spring 事务管理
Spring 框架,提供事物管理实现类是 DataSourceTransactionManager.
配置事物管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="druidDataSource"></property>
    </bean>
注解方式
<!-- 开启注解事务管理 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
在类或方法上使用@Transactional 标签即可.
@Transactional 可以添加到方法上,也可添加到类上面,如果添加到类上面,此类中的所有方法都在spring事务管理中进行
@Transactiona放到service层进行事务管理,这样的话就可以对提交的事务进行事务管理。
声明式事务不生效的场景
数据库起始数据
1.@Transactional 应用在非 public 修饰的方法上
AdminDao: 
public void insert1() {
        jdbcTemplate.update("insert into admin(account,password,gender)values(?,?,?)", "zhangsan","1111","男");
    }
    @Transactional
    public void insert2() {
        jdbcTemplate.update("insert into admin(account,password,gender)values(?,?,?) ","lisi","1234","男");
    }

AdminService:

  @Transactional
    void insertAdmin() throws UnsupportedEncodingException {
  
       adminDao.insert1();
adminDao.insert2();
   }

Test3:
public class Test3 {
    public static void main(String[] args) throws UnsupportedEncodingException {
       /* AdminService adminService=new AdminService();
  


        ApplicationContext applicationContext= new 
 ClassPathXmlApplicationContext("spring.xml");
     AdminService adminService=applicationContext.getBean("adminService",AdminService.class);
   adminService.insertAdmin();
   adminService.updateAdmin();
   adminService.deleteAdmin();
    }
}

2.异常被 catch 捕获导致失效
  @Transactional
   public void insertAdmin(){
       adminDao.insert1();
       try {
           System.out.println(10/0);
           adminDao.insert2();
       } catch (Exception e){
           e.printStackTrace();
       }

//       adminDao.insert1();
//       adminDao.insert("zhangsan");
   }

3.出现编译期异常
AdminDao:
 @Transactional
    public void insert1() {
        jdbcTemplate.update("insert into admin(account,password,gender)values(?,?,?)", "zhangsan","1111","男");
    }
    @Transactional
    public void insert2() {
        jdbcTemplate.update("insert into admin(account,password,gender)values(?,?,?) ","lisi","1234","男");
    }



AdminService:
  
 @Transactional
 public    void insertAdmin() throws UnsupportedEncodingException {
       adminDao.insert1();

       "aa".getBytes("utf-999");
       adminDao.insert2();

      /* try {
           System.out.println(10/0);
           adminDao.insert2();
       } catch (Exception e){
           e.printStackTrace();
       }*/

 /*      adminDao.insert1();
adminDao.insert2();*/
   }

Test3:


public class Test3 {
    public static void main(String[] args) throws UnsupportedEncodingException {
       /* AdminService adminService=new AdminService();
        adminService.saveAdmin();*/

        ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring.xml");
     AdminService adminService=applicationContext.getBean("adminService",AdminService.class);
   adminService.insertAdmin();
   adminService.updateAdmin();
   adminService.deleteAdmin();
    }
}

解决办法:可以将@Transactional配置到AdminService类上,并添加rollbackFor =Exception.class 这样的话所有的异常都会回滚

@Service(value = "adminService")
@Transactional(rollbackFor =Exception.class)
//在方法中出现了编译期异常,还是会提交事务 可以将rollbackFor =Exception.class 这样的话所有的异常都会回滚
public class AdminService {
 public    void insertAdmin() throws UnsupportedEncodingException {
       adminDao.insert1();

       "aa".getBytes("utf-999");
       adminDao.insert2();

      /* try {
           System.out.println(10/0);
           adminDao.insert2();
       } catch (Exception e){
           e.printStackTrace();
       }*/

 /*      adminDao.insert1();
adminDao.insert2();*/
   }
    public void updateAdmin(){
        adminDao.update();
    }
    public void deleteAdmin(){
       adminDao.delete();
    }
    public AdminService() {
        System.out.println("adminService无参构造");
    }

    public void setAdminDao(AdminDao adminDao) {
        this.adminDao = adminDao;
    }
}

4.数据库引擎不支持事务,mysql中只有innodb引擎支持事务

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

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

相关文章

Linux之ip命令详解

华子目录 1.ip命令是什么1.1ip命令的由来1.2ip命令的安装包1.2ip选项&#xff08;基本不用&#xff09; 2.查看网络信息2.1显示全部网络接口信息2.2显示单个网络接口信息2.3显示单个接口状态2.4查看路由表2.5查看arp缓存 3.设置网卡ip地址3.1启用或停用网卡3.2设置默认网关3.3新…

【数据集】遥感影像建筑物提取论文常用数据集

几个常用于遥感影像建筑物对比试验的数据集 WHU building dataset 下载链接&#xff1a; https://study.rsgis.whu.edu.cn/pages/download/building_dataset.html WHU数据集中包含多个子数据集&#xff1a; Aerial imagery dataset 航空影像建筑物数据集 数量&#xff1a;8…

SD3337C 恒流Boost DC/DC转换器的白色LED驱动器芯片IC

一般描述 SD3337C是一款升压型DC/DC转换器&#xff0c;具有恒定电流&#xff0c;可驱动白色LED或类似器件。该 器件可以从锂离子电池驱动多达八个串联的LED。LED电流由外部电阻器(RsET)设置&#xff0c;并由反馈(FB)电压(典型值:200mV)直接调节&#xff0c;该电压跨接在…

IntelliJ IDEA使用内网穿透工具配置的公网地址远程连接本地MySQL

文章目录 前言1. 本地连接测试2. Windows安装Cpolar3. 配置Mysql公网地址4. IDEA远程连接Mysql5. 固定连接公网地址6. 固定地址连接测试 前言 本教程主要介绍如何使用Cpolar内网穿透工具实现在IDEA中也可以远程访问家里或者公司的数据库&#xff0c;提高开发效率&#xff01;无…

Stable Diffusion 使用详解(9)--- 字体及背景融入

目录 背景 方法一 利用controlNet lineart invert depth 提示词 效果 方法二 准备蒙版 绘制大型场景艺术字 controlnet Lora 模型 效果 PS 融入 背景 如果看过上一期你应该知道如何利用layer diffusion 制作场景动漫海报&#xff0c;其实掌握这个方法后&#xf…

Java 入门指南:初识 Java NIO

NIO 的引入 在传统的 Java I/O 模型&#xff08;BIO&#xff09;中&#xff0c;I/O 操作是以阻塞的方式进行的。当一个线程执行一个 I/O 操作时&#xff0c;它会被阻塞直到操作完成。这种阻塞模型在处理多个并发连接时可能会导致性能瓶颈&#xff0c;因为需要为每个连接创建一…

【Three.js基础学习】20.Environment map

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 课程回顾&#xff1a; 模型的加载 GLTFLoader 环境贴图实现&#xff1b; CubeTextureLoader LDR:低动态范围 backgroundBlurriness&#xff1a;设置背景模糊 (不生效 为…

CSND文章质量分批量查询

简介 CSDN 质量分是一项公开的 CSDN 博文内容质量分析服务&#xff0c;其综合分析了内容的标题、段落结构、正文长度、代码格式及复杂度、链接和超文本内容比例及质量等因素&#xff0c;为 IT 技术文章提供客观公共的质量分析结果 用途 可用与对文章质量做评估可申请创作者 …

更新RK3588开发板的rknn_server和librknnrt.so【这篇文章是RKNPU2从入门到实践 --- 【5】的配套文章】

作者使用的平台有&#xff1a; 一台装有Windows系统的宿主机&#xff0c;在该宿主机上装有Ubuntu 20.04虚拟系统&#xff1b; 瑞芯微RK3588开发板&#xff0c;开发板上的系统为Ubuntu22.04系统&#xff1b; 更新板子的 rknn_server 和 librknnrt.so&#xff0c;rknn_server 和…

Facebook AI的应用前景:如何利用人工智能提升平台功能

人工智能&#xff08;AI&#xff09;正迅速改变我们与社交网络互动的方式。作为全球领先的社交媒体平台之一&#xff0c;Facebook&#xff08;现Meta&#xff09;正通过多种AI技术提升其平台功能。本文将探讨Facebook AI的应用前景&#xff0c;展示如何利用这些技术优化用户体验…

OHIF Viewers 项目介绍

项目结构 项目架构 │ ├── extensions │ ├── default # 默认功能 │ ├── cornerstone # 使用 Cornerstonejs 处理 2D/3D 图像 │ ├── cornerstone-dicom-sr # 结构化报告 (DICOM SR) │ ├── measurement-tracking # 测量追…

备战秋招60天算法挑战,Day28

题目链接&#xff1a; https://leetcode.cn/problems/climbing-stairs/ 视频题解&#xff1a; https://www.bilibili.com/video/BV1h1421t7W3/ LeetCode 70.爬楼梯 题目描述 假设你正在爬楼梯。需要n阶你才能到达楼顶。 每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到…

Nacos2.4.0兼容达梦数据库

这段时间公司在搞国产化&#xff0c;发现当前的nacos版本只支持MySQL和derby数据库&#xff0c;后来翻看官方文档以后&#xff0c;官方文档说2.2以后支持达梦数据库了&#xff0c;但是需要插件。 按照他的思路再结合其他资料&#xff0c;我们开始搞起来&#xff01; 一、下载…

【SpringCloud应用框架】GateWay异步非阻塞模型

Spring Cloud Alibaba 之 GateWay工作流程GateWay搭建 文章目录 一、GateWay工作流程工作流程的核心点总结 二、GateWay搭建 一、GateWay工作流程 流程图如下&#xff1a; 核心概念&#xff1a; 客户端向 Spring Cloud Gateway 发出请求。如果Gateway Handler Mapping确定请…

2024年世界机器人大会精彩回顾-人形机器人的天下

8 月 25 日&#xff0c; 2024 世界机器人大会在北京北人亦创国际会展中心闭幕。本次大会以“共育新质生产力 共享智能新未来”为主题&#xff0c;同期举办论坛、博览会、大赛及配套活动&#xff0c;机器人创新新品、应用新场景纷纷亮相。 2024 世界机器人大会分为论坛、博览会、…

qml formLayout实现方式

一、背景 我们制作界面时&#xff0c;通常有表单界面需要制作&#xff0c;如下图&#xff1a; 但是Qt5 是没有 formLayout 的&#xff0c;直到Qt6才有&#xff0c;所以现在 qml 使用 TableView 来实现这个样式 二、实现 enum ComponentType {TitleText,Text,Button,Image} …

开放式耳机漏音有多大?解密最值得购买的五大品牌!

​现在的很多开放式耳机漏音情况已经得到很好的控制了&#xff0c;特别是大品牌的耳机。现在耳机市场上&#xff0c;开放式耳机因为外观时尚、戴着舒服&#xff0c;成了大家日常爱用的热门货。但是&#xff0c;市面上的开放式耳机品牌多得眼花缭乱&#xff0c;质量也是高低不一…

如何使用ssm实现基于JAVA的中小型企业财务管理

TOC ssm364基于JAVA的中小型企业财务管理jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;…

debian12 - openssh-9.6.P1的编译安装(真机 - 联想G480)

文章目录 debian12 - openssh-9.6.P1的编译安装(真机 - 联想G480)概述笔记G480上安装debian12配置debian12现在用WindTerm_2.6.0按照telnet方式去连接试试配置debian12中的telnet安装telnet服务查看所有服务当前ssh, telnet状态准备更新openssl3.2和openssh在真机上更新openssl…

Andon安灯系统在汽车零部件工厂起到什么作用?

在当今竞争激烈的汽车市场中&#xff0c;汽车零部件工厂的高效运作和高质量生产至关重要。而 Andon 安灯系统作为一种先进的生产管理工具&#xff0c;在汽车零部件工厂中发挥着举足轻重的作用。 一、Andon安灯系统实时监控生产状态 汽车零部件工厂的生产线通常较为复杂&#x…