AOP(小卡拉米!!!)温故!

news2024/11/19 7:47:31

前面我们说了AOP底层是使用代理模式进行实现,spring写的接口是通过代理反射,实现方法,然后定义切入点:

springAOP接口定义的方法有:被加强的方法前执行,被加强的方法后执行,出错了执行,在执行时执行等。。。

 

实现spring的指定接口,spring底层用这个结构反射代理,进行加强。

另外一种使用自定义切面

自定义方法(在被加强方法的什么时间段):

ublic class SqlCheckTime {
    public void front() {
        System.out.println(LocalDateTime.now());
    }

    public void behind() {
        System.out.println(LocalDateTime.now());
    }
}

xml装配:

<?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:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
">

    <bean id="UserDaoImpl" class="com.quxiao.dao.impl.UserDaoImpl"></bean>
    <!--    <bean id="addAppcontion" class="com.quxiao.aop.addAppcontion"></bean>-->
    <!--    <aop:config>-->
    <!--        <aop:pointcut id="pointcut" expression="execution(* com.quxiao.dao.impl.UserDaoImpl.*(..))"/>-->
    <!--        <aop:advisor advice-ref="addAppcontion" pointcut-ref="pointcut"></aop:advisor>-->
    <!--    </aop:config>-->

    <bean id="SqlCheckTime" class="com.quxiao.aop.SqlCheckTime"></bean>
    <aop:config>
        <!--                切面-->
        <aop:aspect ref="SqlCheckTime">
            <!--            切入点-->
            <aop:pointcut id="point" expression="execution(* com.quxiao.dao.impl.UserDaoImpl.*(..))"/>
            <!--            执行方法-->
            <aop:after method="front" pointcut-ref="point"></aop:after>
            <aop:before method="behind" pointcut-ref="point"></aop:before>
        </aop:aspect>
    </aop:config>
</beans>

这个方法就简便多了,不过第一种它的能力更强,只要实力足够,自己可以完全自定义实现如何AOP,本人菜苔一根,一个类都没看懂。。。。

另外有一种是用的注解完成:

还是那句话,懒人推进科技的进步,上面的都繁琐,为了简便,注解又产生了:

package com.quxiao.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @program: fxspring
 * @author: quxiao
 * @create: 2023-05-12 10:44
 **/
@Component
//标记该类可以使用aop
@Aspect
public class checkAge {
    @Before("execution(* com.quxiao.dao.impl.UserDaoImpl.*(..))")
    public void check1() {
        System.out.println("检查一下年龄");
    }

    @Around("execution(* com.quxiao.dao.impl.UserDaoImpl.add(..))")
    public String check2(ProceedingJoinPoint point) {
        String proceed = "";
        try {
            System.out.println("环绕前");
            proceed = (String) point.proceed();
            System.out.println("环绕后");
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
        return "失败!";
    }
}

方法上有好几个注解:执行前,执行后,环绕。

当让,还是要在xml中注册,当然也是可以注解用springconfig配配置,

环绕方法:

这个方法是将被加强的方法完全取出来,等待调用proceed才执行,可以拿出方法返回值,如果不放回,那么这个方法就没有返回值了。给一个默认值,引用类型就是null,基本数据类型就是它们自己的默认值。(8条消息) Java中8种基本数据类型及其默认值_byte的默认值_爱写代码的小菜鸡的博客-CSDN博客

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

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

相关文章

docker数据卷volume详细配置案例讲解

docker数据卷 文章目录 docker数据卷1.docker挂载宿主机数据卷1.2.具体配置1.3.挂载命令1.3.1访问页面 2.多端口的容器nginx配置2.1.创建目录位置2.2.访问结果 3.数据卷volume持久化配置3.1.语法格式3.2.详细参数3.3.操作案例3.4.数据改动3.5.查看卷的详细属性 4.与某个容器使用…

如何利用技术做到脱颖而出?亚马逊云科技泛娱乐高峰论坛为你揭秘

互联网技术的飞速进步与数字内容消费的蓬勃发展&#xff0c;使得泛娱乐市场越来越红火&#xff0c;用户对于高品质内容的个性化需求也在不断提升&#xff0c;这对技术底座也提出了更加严苛的要求&#xff0c;时代潮流已至&#xff0c;如何利用技术在一片红海中做到脱颖而出&…

【溯源反制】CDN域前置云函数-流量分析|溯源

文章目录 CDN隐藏C2地址环境搭建上传至威胁感知平台直接分析使用DNSQuerySniffer和Process Monitor定位进程网络流量分析文件属性(IDAPro Ollydbg) 域前置隐藏环境搭建威胁感知流量分析 云服务API网关/云函数云函数使用HTTPcs的流量可以简单的分为三个阶段 云函数使用HTTPS 总结…

kali Linux root密码修改

kali root 密码修改有时候是经常发生的,要么忘记,要么是必须限时要改的,今天记录下,修改方法,以便后续。 Kali Linux的前身是BackTrack Linux发行版。Kali Linux是一个基于Debian的Linux发行版,它被认为是最好的渗透测试的 Linux 发行版之一,而且名副其实。 作为一名从…

Vivado使用技巧:时钟的约束方法

时钟的基础知识 数字设计中&#xff0c;“时钟”表示在寄存器之间可靠地传输数据所需的参考时间&#xff1b;Vivado的时序引擎利用时钟特征来计算时序路径需求&#xff0c;通过计算时间裕量&#xff08;Slack&#xff09;的方法报告设计的时序空余&#xff1b;时钟必须…

C++11 -- 入门基础知识

文章目录 C11简介列表初始化std::initializer_list 变量类型推导nullptr范围for循环STL中的一些变化 C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于C03(TC1)主要是对C98标准中…

怎么在照片上添加logo

怎么在照片上添加logo&#xff1f;现在是全面自媒体的时代&#xff0c;很多旅行博主或者摄影爱好者喜欢将自己拍摄的照片发布到各大平台上&#xff0c;分享自己的摄影作品&#xff0c;不过互联网属于一个开放平台&#xff0c;所以盗取照片的事情时有发生&#xff0c;很多不法分…

LabVIEWCompactRIO 开发指南16 有效使用网络共享变量的技巧

LabVIEWCompactRIO 开发指南16 有效使用网络共享变量的技巧 在使用网络共享变量进行编程时&#xff0c;可以遵循三个技巧来最大化性能并避免任何不需要的行为。图4.11显示了包含每个技巧的初始化过程。 技巧1:初始化共享变量 在应用程序开始时将共享变量初始化为已知值。如…

全文检索-Elasticsearch-整合SpringBoot

文章目录 前言一、整合检索服务1.1 创建 gulimall-search 模块1.2 配置 Maven 依赖1.3 搜索服务注册到注册中心1.4 新增 es 配置类1.5 测试 RestHighLevelClient 组件 二、存储数据到 ES2.1 测试 ES 简单插入数据2.2 测试 ES 查询复杂语句2.3 读入数据 前言 前面记录了 Elasti…

如何修复d3dcompiler_47.dll缺失?多种解决方法分享

在使用Windows操作系统的过程中&#xff0c;有时候会遇到d3dcompiler_47.dll缺失的情况。这个问题可能会导致某些应用程序无法正常运行&#xff0c;因此需要及时解决。本文将介绍如何修复d3dcompiler_47.dll缺失的问题。 一.什么是d3dcompiler_47.dll D3dcompiler_47.dll是Di…

Kali-linux查看打开的端口

对一个大范围的网络或活跃的主机进行渗透测试&#xff0c;必须要了解这些主机上所打开的端口号。在Kali Linux中默认提供了Nmap和Zenmap两个扫描端口工具。为了访问目标系统中打开的TCP和UDP端口&#xff0c;本节将介绍Nmap和Zenmap工具的使用。 4.4.1 TCP端口扫描工具Nmap 使…

revit的附着顶部/底部工具使用及CAD图纸转柱

一、revit的附着顶部/底部工具的使用 生活上&#xff0c;有很多建筑是斜屋顶的房子&#xff0c;像是一些别墅的装修&#xff0c;斜屋顶往往比平屋顶更有装饰感&#xff0c;也更有利于排水。 那么在Revit中&#xff0c;绘制带有斜屋顶的往往会遇到这样一个问题&#xff0c;屋顶之…

OpenCL编程指南-3.2OpenCL上下文

OpenCL上下文 上下文是所有OpenCL应用的核心。上下文为关联的设备、内存对象&#xff08;例如&#xff0c;缓冲区和图像&#xff09;以及命令队列&#xff08;在上下文和各设备之间提供一个接口&#xff09;提供了一个容器。正是上下文驱动着应用程序与特定设备以及特定设备之…

算法训练Day53:​ 1143.最长公共子序列 1035.不相交的线 53.最大子序和 动态规划

文章目录 最长公共子序列题解 不相交的线题解 最大子数组和题解 最长公共子序列 CategoryDifficultyLikesDislikesContestSlugProblemIndexScorealgorithmsMedium (64.94%)13110--0 Tags Companies 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子…

浏览csdn博客自动隐藏侧边栏并只看目录

背景 CSDN 总算做了点好事&#xff0c;能够隐藏大部分无关信息&#xff0c;只看博客内容本身。具体如图&#xff0c;还在测试版 以我的一篇博客为例&#xff0c;原始界面&#xff0c;花里胡哨一堆 点击隐藏侧栏后的清爽版 点击只看目录后的清爽版 前提提要 安装油猴脚本&…

使用VSCode创建Vue项目

Vue介绍 Vue.js是一个渐进式JavaScript框架&#xff0c;用于构建用户界面。它可以与其他库或现有项目集成&#xff0c;也可以作为单个组件使用。Vue.js的目标是提供一种简单、快速和灵活的方式来开发交互式Web应用程序。 Vue.js的核心特性包括&#xff1a; 响应式数据绑定&am…

http协议格式

HyperText Transfer Tansfer Protocol 超文本传输协议&#xff0c;是一种基于TCP的应用层协议&#xff0c;也是目前为止最为流行的应用层协议之一&#xff0c;可以说HTTP协议是万维网的基石。历经了0.9、HTTP/1.0、HTTP/1.1、HTTP/2几个版本(关于HTTP协议的历史&#xff0c;这里…

unity-物体rotation翻转180度后,OnPointerDown失效的问题

问题&#xff1a;今天碰到一个问题&#xff0c;就是把物体A进行水平翻转后&#xff0c;如下图&#xff0c;OnPointerDown 就失效了 》解决方案1&#xff08;使用Scale X来替代Rotation Y&#xff09;&#xff1a; 使用Scale改为-1来翻转&#xff0c;这样 OnPointerDown 就正常…

双向链表刷题总结

剑指 Offer 36. 二叉搜索树与双向链表 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。 为了让您更好地理解问题&#xff0c;以下面的二叉搜索树为例&#xff1a; 我们希望将这…

分布式系统中的那些一致性(CAP、BASE、2PC、3PC、Paxos、ZAB、Raft)

本文介绍 CAP、BASE理论的正确理解、Paxos 算法如何保证一致性及死循环问题、ZAB 协议中原子广播及崩溃恢复以及 Raft 算法的动态演示。 下面还有投票&#xff0c;一起参与进来吧&#x1f44d; 文章目录 前言CAP理论理解误导正确的理解CAP理论的应用 BASE理论Paxos算法如何保证…