基于使用AspectJ实现AOP,注解AOP开发(基于xml文件、基于注解)

AOP概念
AOP是Aspect Oriented Programming的缩写,即『面向切面编程』。它和我们平时接触到的OOP都是编程的不同思想,OOP,即『面向对象编程』,它提倡的是将功能模块化,对象化,而AOP的思想,则不太一样,它提倡的是针对同一类问题的统一处理,当然,我们在实际编程过程中,不可能单纯的安装AOP或者OOP的思想来编程,很多时候,可能会混合多种编程思想,大家也不必要纠结该使用哪种思想,取百家之长,才是正道

AspectJ
AspectJ实际上是对AOP编程思想的一个实践,当然,除了AspectJ以外,还有很多其它的AOP实现,例如ASMDex,但目前最好、最方便的,依然是AspectJ。


Advice(通知)
注入到class文件中的代码。典型的 Advice 类型有 before、after 和 around,分别表示在目标方法执行之前、执行后和完全替代目标方法执行的代码。 除了在方法中注入代码,也可能会对代码做其他修改,比如在一个class中增加字段或者接口。

Joint point(连接点)
程序中可能作为代码注入目标的特定的点,例如一个方法调用或者方法入口。

Pointcut(切入点)
告诉代码注入工具,在何处注入一段特定代码的表达式。例如,在哪些 joint points 应用一个特定的 Advice。切入点可以选择唯一一个,比如执行某一个方法,也可以有多个选择,比如,标记了一个定义成@DebguTrace 的自定义注解的所有方法。

AspectJ提供不同类型的通知,分别为:
@Before 前置通知,相当于BeforeAdvice
@AfterReturning 后置通知,相当于AfterReturningAdvice
@Around 环绕通知,相当于MethodInterceptor
@AfterThrowing异常抛出通知,相当于ThrowAdvice
@After 最终final通知,不管是否异常,该通知都会执行

1:引入aspectj依赖

        <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version></dependency>

 

2:新建一个User类

 

public class User {public void add(){System.out.println("add方法");}
}

 

3:新建一个UserProxy类,被增强的一个类,

Before方法上加上@Before注解,配置切入点表达式,
*表示所有修饰符类型,后面加一个空格 

接着后面上全路径和方法名,最后..表示参数

@Component
@Aspect //表示生成一个代理对象
public class UserProxy {//前置通知//@Before注解表示作为前置通知@Before("execution(* com.example.wzy.demo.aop.User.add(..))")public void before(){System.out.println("before方法");}
}

 

 

4:新建一个bean9.xml

首先加上context和aop的名称空间

接着配置开启组件扫描

<context:component-scan base-package="com.example.wzy.demo.aop"></context:component-scan>

com.example.wzy.demo.aop是全路径,表示扫描这个包

 

还有添加

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

表示开启Aspect生成代理对象,就是去类上找有没有@Aspect注解,有的话就把这个对象生成一个代理对象

 

5:最后添加一个测试类

 

6:输出结果,这就是前置通知,在方法执行之前执行

 

 

 

 

@Component
@Aspect //表示生成一个代理对象
public class UserProxy {//前置通知//@Before注解表示作为前置通知@Before("execution(* com.example.wzy.demo.aop.User.add(..))")public void before() {System.out.println("before方法");}//后置通知,最终通知,方法执行之后执行,有异常也会执行@After("execution(* com.example.wzy.demo.aop.User.add(..))")public void after() {System.out.println("after方法");}//后置通知(返回通知)方法返回结果之后执行,有异常不执行@AfterReturning("execution(* com.example.wzy.demo.aop.User.add(..))")public void afterReturning() {System.out.println("AfterReturning");}//异常通知@AfterThrowing("execution(* com.example.wzy.demo.aop.User.add(..))")public void afterThrowing() {System.out.println("AfterThrowing");}//环绕通知@Around("execution(* com.example.wzy.demo.aop.User.add(..))")public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {System.out.println("环绕通知之前");proceedingJoinPoint.proceed();//被增强的方法执行System.out.println("环绕通知之后");}
}

 

 

 

 

优化:

相同的切入点抽取,下面的都是重复的,可以提取出来,如下图

execution(* com.example.wzy.demo.aop.User.add(..))

 

 

比如对User的add方法需要两个增强类,那么使用

@Order()注解可以,里面的数字越小表示先执行

 

看下执行结果

 

 

 

 

 

使用下xml配置文件配置

新建Book类和BookProxy类

public class Book {public void buy(){System.out.println("buy*********");}
}

public class BookProxy {public void before(){System.out.println("before**********");}
}

 

2:新建bean.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:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!--名称空间--><!--创建对象--><bean id="book" class="com.example.wzy.demo.aopxml.Book"></bean><bean id="bookProxy" class="com.example.wzy.demo.aopxml.BookProxy"></bean><!--配置aop增强--><aop:config><!--切入点--><aop:pointcut id="p" expression="execution(* com.example.wzy.demo.aopxml.Book.buy(..))"/><!--配置切面--><aop:aspect ref="bookProxy"><!--增强作用在具体的方法上--><aop:before method="before" pointcut-ref="p"/></aop:aspect></aop:config>
</beans>

 

新建测试类

 

 @Testpublic void test2(){ApplicationContext ac = new ClassPathXmlApplicationContext("bean10.xml");Book book = ac.getBean("book", Book.class);book.buy();}

执行结果

配置的是前置通知,所以先输出before再输出buy

 

 

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

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

相关文章

湖北大学 计算机考研,湖北大学考研难吗?一般要什么水平才可以进入?

问&#xff1a;从湖北大学毕业的学生就业怎么样&#xff1f;值不值得报考&#xff1f;想要了解湖北大学更多毕业生就业情况见>>>湖北大学总之&#xff0c;湖北大学就业率相对来说是比较良好的&#xff0c;如果大家对此学校感兴趣的话&#xff0c;可以大胆备考&#xf…

手机被锁在耳机模式了

我的多普达575昨晚突然被锁在耳机模式中&#xff0c;怎么也恢复不到正常模式。后来一急&#xff0c;干脆恢复出厂设置。天啦&#xff0c;还是不行。幸亏这是智能手机&#xff0c;所有的资料都备份在我的电脑上。最后上网查查&#xff0c;原来是因为耳机孔中的弹簧没有复位。问同…

python PIL图像处理

新建图像 # 三个参数分别代表图像的模式&#xff1a;常用的为RGB(3通道) 、RGBA(4通道为透明通道&#xff0c;0为完全透明&#xff0c; 256为不透明) # 第二个参数为图像的长宽参数 # 第三个为默认的填充颜色&#xff0c;RGB时长度为3&#xff0c;RGBA是长度为4 img Image.new(…

唐山师范学院计算机考试,[河北]唐山师范学院2017年3月计算机一级考试报名时间...

唐山师范学院2017年上半年全国计算机等级考试(以下简称NCRE)将于3月份举行。按照教育部考试中心有关要求&#xff0c;现就报名工作有关事项通知如下&#xff1a;一、考试时间2017年上半年NCRE时间为3月25日-28日。二、报名事项说明(一)报名时间2017年上半年NCRE报名工作于2017年…

浅析Asp.net MVC 中Ajax的使用

在ASP.NET MVC beta中我们可以使用Ajax.BeginForm, Ajax.ActionLink来进行Ajax调用&#xff0c;同样我们也可以使用一些支持Ajax 框架如jQuery来简化对ajax的调用。一、使用System.Web.Mvc.Ajax 1.1 System.Web.Mvc.Ajax.BeginForm 1.2 System.Web.Mvc.Ajax.ActionLink 二、手工…

IronPython for ASP.NET:使用共享代码

IronPython入门教程第二篇使用共享代码&#xff0c;创建一个简单的IronPython类&#xff0c;并在ASP.NET页面中使用它。1&#xff0e;创建Web站点和ASP.NET页面&#xff0c;选择语言为IronPython。2&#xff0e;关于App_Script文件夹。经过上面第一步操作后&#xff0c;新建Web…

量子计算机到底神在哪里说明文,刘露《神奇的量子通信》初中说明文阅读及答案...

时至今日&#xff0c;究竟有没有一种绝对不可破译的保密方式&#xff0c;能让传送的信息绝对安全可靠&#xff1f;量子通信&#xff0c;就是迄今为止唯一被严格证明是无条件安全的通信方式。量子通信是利用量子力学基本原理进行信息传递的一种新型通信方式。理论上&#xff0c;…

SQLite—homework

主要的界面布局&#xff1a; <EditText android:id"id/edt" android:textSize"20dp" android:layout_width"match_parent" android:layout_height"wrap_content"/> <LinearLayout …

计算机硬件假故障,计算机硬件故障

计算机硬件故障电脑故障是指造成电脑系统正常工作能力失常的硬件物理损坏和软件系统的错误&#xff0c;因此总的可以分为硬件故障和软件故障&#xff0e;&#xff11;&#xff0e;硬件故障硬件故障是指电脑硬件系统使用不当或硬件物理损坏所造成的故障&#xff0e;例如&#xf…

@EnableConfigurationProperties 注解和@ConfigurationProperties注解实现配置绑定

ConfigurationProperties注解主要用来把properties配置文件转化为bean来使用的&#xff0c;而EnableConfigurationProperties注解的作用是ConfigurationProperties注解生效。如果只配置ConfigurationProperties注解&#xff0c;在IOC容器中是获取不到properties配置文件转化的b…

Windows Server 2003 群集配置测试

安装后配置心跳配置现在&#xff0c;每个节点上的网络都已得到了正确的配置&#xff0c;而且群集服务也已配置完毕&#xff0c;这时您需要配置网络角色&#xff0c;以定义其在群集中的功能。此处是一份“群集管理器”中网络配置选项的列表&#xff1a;为群集应用启用&#xff1…

可穿戴计算机硬件技术研究,可穿戴计算机硬件技术应用探究.doc

可穿戴计算机硬件技术应用探究可穿戴计算机硬件技术应用探究摘 要 可穿戴计算机是科技进步的产物&#xff0c;结合了“以人为本”的理念&#xff0c;作为新一代的计算机&#xff0c;其拥有独具一格的特征和性能。本文介绍可穿戴计算机的概念和特点&#xff0c;简要分析可穿戴计…

html.1

从w3school开始我的征途转载于:https://www.cnblogs.com/yueruifeng/p/6868836.html

“http 500内部服务器错误”的解决方法

“http 500内部服务器错误”的解决方法 IIS500错误&#xff0c;是因为微软的一个BUG所造成的。下面是解决办法:主要是由于IWAM账号&#xff08;在我的计算机即是IWAM_MYSERVER账号&#xff09;的密码错误造成了HTTP 500内部错误。 在详细分析HTTP500内部错误产生的原因之前&…

debug=true开启自动配置报告

Negative matches:表示不生效的自动配置 Positive matches:表示生效的自动配置

计算机的键盘如何保养,知识每天涨一点:快捷键2 键盘键位知识 电脑小保养

快捷键2win菜单键 L 快速锁屏&#xff0c;如果加了密码的话就可以在自己离开的时候防止别人窥屏哦win菜单键 E 快速打开我的电脑&#xff0c;加快查找文件的速度win菜单键 R 在打开的运行页面中输入psr.exe 回车进入选择开始录制就可以录制电脑此时操作了(不是视频&#xff0c;…

强制IE下载的代码

强制ie下载代码&#xff1a;示例&#xff1a;下载source/aaa.zip文件<a href"download.asp?naaa.zip">download.asp: <%Response.Buffer trueResponse.Cleardim urlDim fso,fl,flsizedim DnameDim objStream,ContentType,flName,isre,url1’*************…

vue移动端300毫秒延时

引入&#xff0c;在main.js里 import FastClick from fastclick FastClick.attach(document.body); 双击事件另行封装转载于:https://www.cnblogs.com/liuhuanwen/p/6869096.html

Lombok中@Data注解 @ToString注解 @NoArgsConstructo注解 @AllArgsConstructor注解

1:项目中引入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency> 2:实体类上加上Data注解可以生产get和set方法 ToString表示可以生成ToString方法 NoArgsConstructor表示无参构造器 …