基于Aspectj表达式配置的Spring AOP
AOP(Aspect-Oriented Programming, 面向切面编程):是一种新的方法论, 是对传统OOP(Object-Oriented Programming, 面向对象编程)的补充。
它其实就是将公共的东西收取出来进行处理,横向重复,纵向抽取。从而使得代码更简洁。
我的博客地址:https://www.cnblogs.com/themysteryofhackers/p/12013351.html
更新时间:2019-12-09
一、创建Maven项目
创建Maven项目的步骤和我上一篇博客的步骤差不多,这里就不再论述了,如果不记得的话,点击这里如何创建Maven项目。
创建好Maven项目后,就直接创建包和类。
二、添加项目依赖
因为要用到Spring中的AOP技术,所以要导入Spring的依赖,又因为要用到单元测试,所以也要导入Junit的依赖。
- <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zzx</groupId> <artifactId>Spring_AOP</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.12.RELEASE</version> </dependency> <!-- spring aop支持 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.3.12.RELEASE</version> </dependency> <!-- aspectj支持 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.7</version> </dependency> </dependencies> </project>
三、创建类
我的是在com.zzx.aspect包下创建了一个MyAspect.java类,
- package com.zzx.aspect; import org.springframework.stereotype.Component; //这是将对象交给Spring容器管理,并且取名为myAspect @Component("myAspect") public class MyAspect { //这是前置通知的方法 public void before(){ System.out.println("商品进货!"); } //这是后置通知的方法 public void afterReturn(){ System.out.println("售后分红!"); } }
我的是在com.zzx.sales包下创建了一个OppoSales.java和XiaomiSales.java类。
OppoSales.java
- package com.zzx.sales; import org.springframework.stereotype.Component; //这是将对象交给Spring容器管理,并且取名为oppo @Component("oppo") public class OppoSales { public void salePhone() { System.out.println("出售OPPO手机!"); } public void salePC() { System.out.println("出售OPPO电脑!"); } }
XiaomiSales.java
- package com.zzx.sales; import org.springframework.stereotype.Component; //这是将对象交给Spring容器管理,并且取名为xiaomi @Component("xiaomi") public class XiaomiSales { public void salePhone() { System.out.println("出售小米手机!"); } public void salePC() { System.out.println("出售小米电脑!"); } }
我的是在resources目录下创建了applicationContext.xml配置文件。配置文件中的表达式
execution(* com.zzx.sales..*.salePC(..))就是Aspectj表达式,这个表达式的意思是第一个*号是代表所有返回类型,com.zzx.sales是需要拦截的类的包名,后面的两个点,是代表当前包和它的子孙包,第二*号代表的是类名,salePC是方法名,方法名里面的两个点是代表任何参数,如果你还想深入了解Aspectj表达式的话,就点击Aspectj表达式详解。
applicationContext.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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"> <!-- Spring扫描包 --> <!-- 扫描包,只有扫描的包,Spring的注解才会生效,设置要扫描的那个包,那它的子包也会扫描 --> <context:component-scan base-package="com.zzx"/> <aop:config> <!-- 配置切入点 --> <aop:pointcut id="pointId" expression="execution(* com.zzx.sales..*.salePC(..))"/> <!-- 配置切面,把增强用来方法上面 --> <aop:aspect ref="myAspect"> <!-- 前置通知 method填的是切面对象方法 , pointcut-ref填的是切点id --> <aop:before method="before" pointcut-ref="pointId"></aop:before> <!-- 后置通知 --> <aop:after method="afterReturn" pointcut-ref="pointId"></aop:after> </aop:aspect> </aop:config> </beans>
我的是在text目录下创建了com.zzx.aop包,还创建了一个Test01.java类。
Test01.java
- package com.zzx.aop; import com.zzx.sales.OppoSales; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test01 { @Test public void testSpringAOP(){ ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); OppoSales oppoSales = (OppoSales) applicationContext.getBean("oppo"); oppoSales.salePC(); System.out.println("=================================="); oppoSales.salePhone(); } }
最后直接运行程序,结果如下:(因为我的Aspectj表达式最后那里指定了方法salePC,所以只有调用salePC方法才会将前置和后置方法切入,如果想要任何方法都要切入,就把salePC该成*即可)
结尾
我是一个Java程序员,一个向往技术的小白,以后我会陆续将自己学习到的Java或者其他的知识会以博客的形式分享出来,希望能对大家有帮助。
喜欢小编的就给我一个关注吧!
如果有哪些问题、有哪些不妥或者侵犯到您的权益的地方,可以联系我,我马上修改。
基于Aspectj表达式配置的Spring AOP的更多相关文章
- Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探
由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现. 本文一下未贴出的相关代码示例请关注小编的上篇博文<Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AO ...
- Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较
本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一 ...
- spring-AOP框架(基于AspectJ注解配置AOP)
基于AspectJ注解配置AOP 1.加入jar包: 要在Spring应用中使用AspectJ注解,必须在classpath下包含AspectJ类库:aopalliance.jar.aspectj.w ...
- Spring Aop(七)——基于XML配置的Spring Aop
转发:https://www.iteye.com/blog/elim-2396043 7 基于XML配置的Spring AOP 基于XML配置的Spring AOP需要引入AOP配置的Schema,然 ...
- 基于AspectJ的XML方式进行AOP开发
-------------------siwuxie095 基于 AspectJ 的 XML 方式进行 AOP 开发 1 ...
- 基于AspectJ的注解方式进行AOP开发
-------------------siwuxie095 基于 AspectJ 的注解方式进行 AOP 开发 ...
- 基于配置的Spring AOP
前面几篇学习了Spring的依赖注入,这篇开始学习另一个核心功能——面向切面编程AOP. 通过本文,你可以了解到: 1 Spring xml规范 2 通过配置文件实现面向切面编程 3 对比与传统AOP ...
- 基于XML配置的spring aop增强配置和使用
在我的另一篇文章中(http://www.cnblogs.com/anivia/p/5687346.html),通过一个例子介绍了基于注解配置spring增强的方式,那么这篇文章,只是简单的说明,如何 ...
- 基于@AspectJ注解配置切面与基于XML配置切面
1. Waiter目标类 package com.smart.aop.advice.pointcut; public class Waiter { public void greetTo(String ...
随机推荐
- django实现简易登录注册
经过一些文档的理解,以及一些时间的琢磨.我觉得可以用django做一些小项目了 先说说登录功能吧. 先创建一个app,用admin命令 在cmd打开到manage.py同级目录下,django-adm ...
- jarvis OJ部分writeup
[XMAN]level 0 [XMAN]level 1 —— 简单shellcode利用 [XMAN]level 2 [XMAN]level 3 —— ret2libc尝试 [XMAN]level2& ...
- appium+android测试环境安装
1. jdk配置 一.背景 JDK已经更新到12了,但是由于很多工具仍然未及时更新,故推荐最稳定的JDK版本1.8.x: JDK需要配置通常情况下,JDK配置分为三项: JAVA_HOME:某些软件仍 ...
- pymysql模块学习
#Pymysql 用于连接mysql数据库 #连接数据库 data_ip = "192.168.34.128" data_name = "lch" data_p ...
- HDU1312 Red and Black(dfs+连通性问题)
这有一间铺满方形瓷砖的长方形客房. 每块瓷砖的颜色是红色或者黑色. 一个人站在一块黑色瓷砖上, 他可以从这块瓷砖移动到相邻(即,上下左右)的四块瓷砖中的一块. 但是他只能移动到黑色瓷砖上,而不能移动到 ...
- 持续集成与自动化部署---代码流水线管理及Jenkins和gitlab集成
1.代码流水线管理 Pipeline名词顾名思义就是流水线的意思,因为公司可能会有很多项目.如果使用jenkins构建完成后,开发构建项目需要一项一项点击,比较麻烦.所以出现pipeline名词. 代 ...
- python3练习100题——008
今天第二道,做了明天就可以休息一下- 原题链接:http://www.runoob.com/python/python-exercise-example8.html 题目:输出 9*9 乘法口诀表. ...
- make && make install
./configure --prefix= /usr/local/python3.6.6 make && make install prefix=/usr/local/pyth ...
- codeforces 1288D. Minimax Problem(二分)
链接:https://codeforces.com/contest/1288/problem/D D. Minimax Problem 题意:给定n个数组,长度为m,从n中数组挑选两个数组,两个数组中 ...
- laravel路由组中namespace的的用法详解
做公司一个项目的时候发现laravel框架中可以省去action的路径前缀的用法: ps:用简短的话来理解就是说在路由组中定义namespace,可以省去你路由的前缀下面看例子 最终显示如下: 定义的 ...