Spring之AOP实现

文章目录

  • 前言
  • 环境搭建
  • 前置业务类编写
  • 一、注解实现AOP
    • 1.编写注解实现的增强类
    • 2.在Spring配置文件中,注册bean,并增加支持注解的配置
    • 3.测试
  • 二、配置文件实现AOP
    • 1.编写自定义增强类
    • 2.Spring配置文件中,注册bean,配置增强
    • 2.测试
  • 总结


前言

AOP(Aspect Oriented Programming)称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待。


环境搭建

1、pom.xml 配置AOP依赖

        <!-- AOP 依赖--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version></dependency>

2、Spring配置文件的命名空间中加入aop头文件

<beans xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/aop                                                                      https://www.springframework.org/schema/aop/spring-aop.xsd">

前置业务类编写

1、Admin的service

package com.ex.service;public interface IAdminService {public void saveAdmin(String name);
}
package com.ex.service.impl;@Service
public class adminServiceImpl implements IAdminService {@Overridepublic void saveAdmin(String name) {System.out.println("save admin method");}
}

2、user的service

package com.ex.service;public interface IUserService {public void selectUser(int id);
}
package com.ex.service.impl;@Service
public class userServiceImpl implements IUserService {@Overridepublic void selectUser(int id) {System.out.println("user select method");}
}

一、注解实现AOP

1.编写注解实现的增强类

@Component
@Aspect
public class LogAdvice {// springaop自动的5种aop这里全部列出// *返回类型,包名,*类名,*方法名,(..)任何参数@Before("execution(* com.ex.service.impl.*.*(..))")public void before(){System.out.println("---------方法执行前before()---------");}@After("execution(* com.ex.service.impl.*.*(..))")public void after(){System.out.println("---------方法执行后after()---------");}@AfterReturning("execution(* com.ex.service.impl.*.*(..))")public void afterReturning(){System.out.println("---------方法返回后afterReturning()---------");}@Around("execution(* com.ex.service.impl.*.*(..))")public void around(ProceedingJoinPoint jp) throws Throwable {System.out.println("-------环绕前-------");System.out.println("签名(拿到方法名):"+jp.getSignature());//执行目标方法proceedObject proceed = jp.proceed();System.out.println("-------环绕后------");System.out.println(proceed);}@AfterThrowing("execution(* com.xinzhi.service.impl.*.*(..))")public void afterThrow() {System.out.println("--------------有异常发生-----------------" + new Date());}
}

2.在Spring配置文件中,注册bean,并增加支持注解的配置

    <!-- 扫包:如果使用了注解,需要在开始之前去扫包--><context:component-scan base-package="com.ex"/><!-- aop 注解实现 配置 --><aop:aspectj-autoproxy/>

3.测试

    @Testpublic void testAop(){userService.selectUser(1);System.out.println("--------------------------------");adminService.saveAdmin("aa");}

结果

-------环绕前-------
签名(拿到方法名):void com.ex.service.IUserService.selectUser(int)
---------方法执行前before()---------
user select method
-------环绕后------
null
---------方法执行后after()---------
---------方法返回后afterReturning()---------
--------------------------------
-------环绕前-------
签名(拿到方法名):void com.ex.service.IAdminService.saveAdmin(String)
---------方法执行前before()---------
save admin method
-------环绕后------
null
---------方法执行后after()---------
---------方法返回后afterReturning()---------

二、配置文件实现AOP

1.编写自定义增强类

public class MyAOP {public void before(){System.out.println("---------执行方法前打印日志--------------自定义");}public void after(){System.out.println("---------执行方法后打印日志--------------自定义");}
}

2.Spring配置文件中,注册bean,配置增强

    <!--注册bean--> <bean id="myAop" class="com.xinzhi.aop.MyAop"/><!--aop的配置--><aop:config><!-- ref 自定义切面类 --><aop:aspect ref="myAOP"><!-- 切入点配置 --><aop:pointcut id="pointcut1" expression="execution(* com.ex.service.impl.adminServiceImpl.*(..))"/><aop:pointcut id="pointcut2" expression="execution(* com.ex.service.impl.userServiceImpl.*(..))"/><!-- 织入 --><aop:before pointcut-ref="pointcut1" method="before"/><aop:after pointcut-ref="pointcut2" method="after"/></aop:aspect></aop:config>

2.测试

    @Testpublic void testAop2(){userService.selectUser(1);System.out.println("--------------------------------");adminService.saveAdmin("aa");}

结果

user select method
---------执行方法后打印日志--------------自定义
--------------------------------
---------执行方法前打印日志--------------自定义
save admin method

总结

AOP就是对指定的一批的方法在其执行过程中进行一个统一的处理,将大量重复性的工作抽离了出来,省事!

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

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

相关文章

LeetCode 90. 子集 II(回溯+剪枝)

文章目录1. 题目信息2. 解题2.1 循环2.2 回溯1. 题目信息 给定一个可能包含重复元素的整数数组 nums&#xff0c;返回该数组所有可能的子集&#xff08;幂集&#xff09;。 说明&#xff1a;解集不能包含重复的子集。 示例:输入: [1,2,2] 输出: [[2],[1],[1,2,2],[2,2],[1,2…

BAT研发Java面试36题总结:Spring+Redis+Docker+Dubbo

一面&#xff1a; ArrayList和linkedlist区别。ArrayList是否会越界。 ArrayList和hashset有何区别。hashset存的数是有序的么。 volatile和synchronized区别 多态的原理 数据库引擎Innodb和myisam区别 Redis的数据结构 Redis是基于内存的么 Redis的list zset的底层实现…

中文版GPT-2,可用于写小说、诗歌、新闻等

原文链接&#xff1a;https://www.sohu.com/a/336251713_610300 有人做出了中文版GPT-2&#xff0c;可用于写小说、诗歌、新闻等&#xff1b;15亿参数版GPT-2被两名研究生复现 2019-08-25 12:01 来源:量子位 </div>原标题&#xff1a;有人做出了中文版GPT-2&#xff0…

一份来自清华的数据分析笔记,请查收!

之前发过很多数据分析的文章&#xff0c;收到不少好评&#xff0c;但也有一些困惑&#xff1a;入门数据分析该学哪些知识点&#xff1f;该看哪些书&#xff1f;是从 Python入手还是 R 语言&#xff1f;常用的算法有哪些&#xff1f;练手做项目的数据库去哪里找&#xff1f;好用…

LeetCode 9. 回文数

文章目录1. 题目信息2. 解题1. 题目信息 判断一个整数是否是回文数。回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 示例 1:输入: 121 输出: true 示例 2:输入: -121 输出: false 解释: 从左向右读, 为 -121 。 …

Redis系列教程(四):Redis为什么是单线程、及高并发快的3大原因详解

Redis的高并发和快速原因 1.redis是基于内存的&#xff0c;内存的读写速度非常快&#xff1b; 2.redis是单线程的&#xff0c;省去了很多上下文切换线程的时间&#xff1b; 3.redis使用多路复用技术&#xff0c;可以处理并发的连接。非阻塞IO 内部实现采用epoll&#xff0c;采…

Bing与DuckDuckGo搜索结果惊人一致?Google展现强势差异

文 | 乐乐QvQ搜索引擎之间有何不同&#xff1f;随着世界上最大的两家公司Google和Microsoft争夺Web Search空间的愈发激烈&#xff0c;一超多强的搜索格局已经形成。在目前眼花缭乱的搜索市场中&#xff0c;是搜索结果的千篇一律&#xff0c;九九归一&#xff1b;还是搜索结果的…

图解gpt-2

原文链接&#xff1a;https://www.sohu.com/a/336262203_129720 完全图解GPT-2&#xff1a;看完这篇就够了&#xff08;一&#xff09; 2019-08-25 12:47 来源:机器之心Pro </div>原标题&#xff1a;完全图解GPT-2&#xff1a;看完这篇就够了&#xff08;一&#xff0…

java程序员学习路线以及我的学习经验

本文作者为优知学院创始人陈睿&#xff08;mike&#xff09;,作者有10年以上技术&产品经验&#xff0c;曾任百度研发经理、携程定制旅游CTO。 “ 这是一篇完整的java程序员学习线路图&#xff0c;一共分为六个阶段。 我以java为例&#xff0c;展示完整的学习步骤。 最后…

这几个模型不讲“模德”,我劝它们耗子尾汁

文 | Sheryc_王苏NLP模型要以和为贵&#xff0c;要讲“模德”&#xff08;Modal&#xff09;&#xff0c;不要搞窝里斗。——《王苏老师被多模态预训练模型偷袭实录》&#xff08;全文在末尾&#xff0c;必读&#xff09;最近是不是被马保国“不讲武德”“耗子尾汁”的视频和语…

Java多线程系列(六):深入详解Synchronized同步锁的底层实现

谈到多线程就不得不谈到Synchronized&#xff0c;很多同学只会使用&#xff0c;缺不是很明白整个Synchronized的底层实现原理&#xff0c;这也是面试经常被问到的环节,比如&#xff1a; synchronized的底层实现原理 synchronized锁与JVM的实现 synchronized锁升级顺序 sync…

LeetCode 89. 格雷编码

文章目录1. 题目信息2. 解题1. 题目信息 格雷编码是一个二进制数字系统&#xff0c;在该系统中&#xff0c;两个连续的数值仅有一个位数的差异。 给定一个代表编码总位数的非负整数 n&#xff0c;打印其格雷编码序列。格雷编码序列必须以 0 开头。 示例 1:输入: 2 输出: [0,…

分布式数据层中间件详解:如何实现分库分表+动态数据源+读写分离

分布式数据层中间件&#xff1a; 1.简介&#xff1a; 分布式数据访问层中间件&#xff0c;旨在为供一个通用数据访问层服务&#xff0c;支持MySQL动态数据源、读写分离、分布式唯一主键生成器、分库分表、动态化配置等功能&#xff0c;并且支持从客户端角度对数据源的各方面&a…

清华硕士眼中的2021届算法岗秋招

文 | 李金泽一晃接近三个月过去了&#xff0c;秋招也到了尾声&#xff0c;之前一直忙于写毕业论文&#xff0c;现在在这里想总结一些自己求职互联网大厂算法岗的面经和心得&#xff0c;希望帮助后来的学弟学妹们收获自己心仪的offer。今年的算法岗求职较往年竞争也更加激烈&…

LeetCode 124. 二叉树中的最大路径和(DFS)

文章目录1. 题目信息2. 解题1. 题目信息 给定一个非空二叉树&#xff0c;返回其最大路径和。 本题中&#xff0c;路径被定义为一条从树中任意节点出发&#xff0c;达到任意节点的序列。该路径至少包含一个节点&#xff0c;且不一定经过根节点。 示例 1:输入: [1,2,3]1/ \2 …

Python的reshape的用法:reshape(1,-1)

Python的reshape的用法&#xff1a;reshape(1,-1)https://blog.csdn.net/qq_29831163/article/details/90112000 目录 numpy中reshape函数的三种常见相关用法 reshape(1,-1)转化成1行&#xff1a; reshape(2,-1)转换成两行&#xff1a; reshape(-1,1)转换成1列&#xff1a; …