Spring复习(三)

news2024/11/18 2:39:35

AOP

AOP(Aspect Oriented Programming)面向切面编程,aop是一种设计思想,是oop面向对象编程的一种补充和完善,它通过预编译方式和运行期间动态代理的方式达成在不修改源代码的情况下,实现对业务逻辑的增强。

相关术语

横切关注点:从目标类每个方法中抽取出来的非核心业务代码
通知:将横切关注点封装到一个类中,这个类就叫做切面,封装的横切关注点就是一个通知,也叫通知方法。
非核心业务代码在目标类中就叫做横切关注点,在切面类中就是通知
连接点:目标类中抽取非核心业务代码的方法
切入点:要实现业务增强的方法

基于注解的AOP

在IOC的基础上导入aop的依赖

 <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
    </dependencies>

spring配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

        <!--开启注解扫描,使注解生效将切面和目标类都交给springioc来管理-->
       <context:component-scan base-package="com.mao"/>
        <!--开启基于注解的aop功能-->
        <aop:aspectj-autoproxy/>
</beans>

切面类要加@Aspect将该类声明为切面

/**
 * 切面类
 */
@Component
@Aspect//将当前组件标识为切面
public class LoggerAspect {
 @Pointcut("execution(* com.mao.CalculatorImpl.*(..))")
    public void pointCut()
    {  
    }
    //前置通知
    @Before("pointCut()")
    public void before(JoinPoint joinPoint)
    {
        //获取连接点对应方法的方法名
        Signature signature = joinPoint.getSignature();
        //获取连接点对应方法的参数
        Object[] args = joinPoint.getArgs();
        System.out.println("前置通知。。。。。");
    }
    
    //后置通知
    @After("pointCut()")
    public void after(JoinPoint joinPoint)
    {
        //获取连接点对应方法的方法名
        Signature signature = joinPoint.getSignature();
        //获取连接点对应方法的参数
        Object[] args = joinPoint.getArgs();
        System.out.println("后置通知");
    }
   
    //返回通知,在目标方法返回值之后执行
    //在返回通知中如果想要获取目标方法的返回值,可以通过returning属性
    //返回通知和后置通知的区别:
    //后置通知无论是否出现异常都会执行,而返回通知是出现异常就不再执行
    @AfterReturning(value = "pointCut()",returning = "result")
    public void afterReturning(JoinPoint joinPoint,Object result)
    {
        System.out.println("返回通知");
    }
    
    //异常通知
    //获取目标对象的方法的异常,通过throwing属性
    @AfterThrowing(value = "pointCut()",throwing = "ex")
    public void afterThrowing(JoinPoint joinPoint,Throwable ex)
    {
        System.out.println("异常通知");
    }
    
   //环绕通知
   //环绕通知方法的返回值和目标方法的返回值保持一致
   //ProceedingJoinPoint 对象用来表示目标方法的执行
    @Around("pointCut()")
    public Object around(ProceedingJoinPoint joinPoint){
        Object result=null;
        try {
            System.out.println("环绕通知---前置");
            //表示目标方法的执行
            result=joinPoint.proceed();
            System.out.println("环绕通知---返回");
        }
        catch (Throwable e)
        {
            e.printStackTrace();
            System.out.println("环绕通知---异常");
        }
        finally {
            System.out.println("环绕通知---后置");
        }
        return result;
    }
}

切面的优先级

可以通过@order注解的value属性设置优先级,默认值为Integer的最大值。
@order注解的value值越小,优先级越高

基于注解的声明式事务

声明式事务的配置步骤:
1.在spring核心配置文件中配置事务管理器
2.开启事务注解驱动
3.在要进行事务管理的类或方法上添加@Transactional注解

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

    <!--开启事务的注解驱动
    将使用@Transactional注解所标识的方法或类中的所有方法使用事务进行管理
    -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

事务的属性

1.只读
对于查询操作,可以将事务设置为只读,这样数据库就可以针对查询操作来进行优化。

@Transactional(
	readOnly=true
)

2.超时
事务在执行的过程中,由于某些问题导致程序卡住,从而长时间的占用数据库的资源,此时应该对该事务执行回滚操作。
可以对事务设置超时,减少不必要的资源的浪费

@Transactional(
	timeout=3//设置超时时间为3秒,默认为-1,表示一直等待
)

3.设置回滚策略
在这里插入图片描述
4.事务的四种隔离级别
事务的隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。
可能导致的问题有

1.脏读: 一个事务读到另一个事务未提交的更新数据。

2.不可重复读: 一个事务两次读同一行数据,可是这两次读到的数据不一样。

3.幻读: 一个事务执行两次查询,但第二次查询比第一次查询多出了一些数据行。

@Transactional(
	isolation=Isolation.DEFAULT//使用默认的隔离级别
)

在这里插入图片描述在这里插入图片描述
5.事务的传播行为
事务A,B都开启了@Transactional注解,事务A去调用事务B

@Transactional(
	propagation=Propagation.REQUIRED//使用的是调用者的事务,如A
	propagation=Propagation.REQUIRED.NEWS//使用的是被调用者的事务,如B
)

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

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

相关文章

论文投稿指南——中文核心期刊推荐(农业基础科学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

【计组】存储器层次结构全景和局部性原理--《深入浅出计算机组成原理》(八)

课程链接&#xff1a;深入浅出计算机组成原理_组成原理_计算机基础-极客时间 目录 一、存储器层次结构全景 &#xff08;一&#xff09;SRAM &#xff08;二&#xff09;DRAM &#xff08;三&#xff09;存储器的层级结构 二、局部性原理 一、存储器层次结构全景 &…

Eureka读时加写锁,写时加读锁,到底是故意为之还是一个bug?

在对于读写锁的认识当中&#xff0c;我们都认为读时加读锁&#xff0c;写时加写锁来保证读写和写写互斥&#xff0c;从而达到读写安全的目的。但是就在我翻Eureka源码的时候&#xff0c;发现Eureka在使用读写锁时竟然是在读时加写锁&#xff0c;写时加读锁&#xff0c;这波操作…

uni-app | 从零创建一个新项目以及关于网络请求配置和分包

一、uni-app简介uni-app 是一个使用 Vue.js 开发所有前端应用的框架。开发者编写一套代码&#xff0c;可发布到 iOS、Android、H5、以及各种小程序&#xff08;微信/支付宝/百度/头条/QQ/钉钉/淘宝&#xff09;、快应用等多个平台。二、开发工具uni-app官方推荐使用HBuilderX来…

【JS 逆向百例】X-Bogus 逆向分析,JSVMP 纯算法还原

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未…

72小时灵感冲刺,创意就该这么玩 | LigaAI Hackathon特别策划

2023 年 1 月 9 日至 12 日&#xff0c;LigaAI 团队全员出逃&#xff1a;放下迭代&#xff0c;暂缓需求&#xff0c;处处充斥着「可以摸鱼➕卷死他们」的矛盾又欢乐的气息。职场和远程的伙伴们无一不在热烈讨论、积极组队、抢占会议室、搜刮零食饮料…… 是什么让矜持内敛的技…

微信小程序的启动和渲染过程(加组件分类和组件的基本使用以及API分类)

小程序的启动过程 把小程序的代码包下载到本地解析app.json全局配置文件执行app.js小程序入口文件,调用App()创建小程序实例渲染小程序首页小程序启动完成 小程序页面渲染的过程 加载解析页面的.json配置文件加载页面的.wxml模板和.wxss样式执行页面的.js文件,调用page(创建…

网站建设的具体流程

有网站制作需求的朋友想了解一下网站建设的具体流程&#xff0c;防止不良的网站制作公司的业务人员用虚假的工作量欺骗自己报出高价&#xff0c;米贸搜详细给你整理一下一个网站的建设有哪些流程:1.在线或当面沟通网站制作需求&#xff0c;详细沟通网站的功能需求、设计风格以及…

功率放大模块的作用是什么(功率放大器模块的应用范围)

功率放大模块是一种能够把开关电源、数字功放集成到一起的放大模块。很多人对于功率放大模块的作用是什么以及功率放大模的应用范围都不清楚&#xff0c;下面就来详细的为大家介绍下什么是功率放大模块以及功率放大模块的基础知识。 一、什么是功率放大模块 功率放大模块是一种…

谷歌AR应用挑战赛上那些富有创意的AR项目集锦

前不久&#xff0c;谷歌面向全球100多个国家和地区的开发者们推出ARCore Geospatial API挑战赛&#xff0c;获奖的AR应用可得到1000美元到1.2万美元的奖金&#xff0c;支持多种不同的内容类别&#xff0c;比如AR导航、AR游戏、AR娱乐等等。据悉&#xff0c;Geospatial API是谷歌…

贵阳某小区一次HC小区管理系统自研道闸故障解决记录

一次HC小区管理系统自研道闸故障解决记录&#xff0c;方便其他小伙伴出现问题的时候提供解决思路 早上九点钟 客户说道闸用不了&#xff0c;这个客户不是物业&#xff0c;而是科技公司&#xff0c;他们给物业安装的道闸。 问题描述是&#xff0c;mqtt 也重启了&#xff0c;物…

Allegro如何打开锁定走线线宽的功能操作指导

Allegro如何打开锁定走线线宽的功能操作指导 在做PCB设计的时候,有时需要用到锁定线宽的功能,让走线一直保持固定的线宽不变化,例如下图 任何网络的走线在任何地方都是固定20mil的线宽 具体操作如下 选择菜单的Setup选择User Preferences

解决IE页面打不开及白屏问题

IE浏览器控制台报错如下&#xff1a; 解决办法&#xff1a; ① public文件下新建TextEncoder.js /* eslint-disable */ ; var textEncoder (function(window) {if (undefined ! window.TextEncoder) { return }function _TextEncoder() {// --DO NOTHING}_TextEncoder.prot…

steam搬砖项目详细介绍

一、项目介绍 其实&#xff0c;Steam就是一个全球的游戏平台&#xff0c;搬砖主要是搬的一款火遍全球的游戏CSGO的装备和饰品。CS听说过吧&#xff0c;这款游戏就是CS的一个系列。&#xff08;通俗易懂的理解就是&#xff0c;从国外steam游戏平台购买装备&#xff0c;再挂到国内…

分销商城小程序开发

武汉微驱动科技有限公司 目前电商行业正在蓬勃发展&#xff0c;越来越多的商家想要利用各种社交关系&#xff0c;用社交软件扩大经营规模&#xff0c;小程序分销是最近很火爆的流行趋势&#xff0c;不过有不少商家还不清楚“什么是小程序分销模式&#xff1f;小程序分销商城是什…

gerapy部署项目报错:ModuleNotFoundError: No module named ...

使用gerapy部署我的项目&#xff0c;rebuild的时候是成功的&#xff0c;但是deploy的时候失败了&#xff0c;报错&#xff1a; Client 1 Failed to Deploy 没有显示具体的错误&#xff0c;只能到gerapy的部署目录找日志。 根据 ll 命令&#xff0c;找到了最新的日志文件&…

AutoSAR Crypto_UtilizationOfCryptoServices-AUTOSAR加密服务使用

1 Stack Architecture The Crypto Service Manager (CSM) CSM控制一个或者多个Client对一个或者多个同步或异步加密服务。它提供了优先级队列来管理专用CRYPTO不能直接处理的作业 CSM的功能如下&#xff1a; ● HASH计算&#xff1b; ● 消息认证码的生成和校验&#xff1b; ●…

Centos6源码安装Haproxy进行四层代理

一.背景 公司使用专线与第三方公司进行系统交互&#xff0c;给定了我们业务IP的使用范围&#xff0c;防火墙策略只开放业务IP范围之内的IP地址才能访问&#xff0c;如果源IP不在业务IP范围之内&#xff0c;那么通过互联IP过去是访问不了的。我们的做法是为了不影响现有业务&…

完整复现YOLOv8:包括训练、测试、评估、预测阶段【本文源码已开源,地址在文章末尾】

训练过程展示: 目录 1、复现过程1.1、配置开发环境1.2、demo预测实现过程2 、项目实现方法与代码(包括训练、测试、评估、预测阶段)2.1、训练、测试、评估、预测代码适配2.2、同时开始训练、测试、评估、预测2.3、训练完之后进行预测2.4、训练、评估、混淆矩阵、召回曲线等…

Linux 基础常用命令 整理

Shell Shell 这个单词的原意是“外壳”&#xff0c;跟 kernel&#xff08;内核&#xff09;相对应&#xff0c;比喻内核外面的一层&#xff0c;即用户跟内核交互的对话界面。 Shell 是一个程序&#xff0c;提供一个与用户对话的环境。这个环境只有一个命令提示符&#xff0c;让…