JAVA框架 Spring AOP--切入点表达式和通知类型
一:AOP的相关术语:
1)Joinpoint(连接点):所谓的连接点是指那些可以被拦截点,在spring中这些点是指方法。因为在spring中支持方法类型的连接点。
2)Pointcut(切入点):所谓切入点是对那些连接点进行定义(增强。)也就是说拦截点包含切入点。
3)Advice(通知/增强):所谓通知就是拦截到joinpoint之后所要做的事情,就是通知。通知的类型分:前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)。
4)induction(引介):引介是一种特殊的通知在不修改类的代码前提下,introduction可以在运行期动态的添加一些方法或者field。
5)Target(目标对象): 代理的目标对象。
6)Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程。
7)proxy(代理):一个类被AOP织入增强后,就产生结果代理类。
8)Aspect(切面):是切入点和通知的结合,需要我们自己编写和配置的。
二、AOP入门
我们使用的AOP是第三方的 aspectJ出的。所以需要整合他们的jar包。
1)引入jar包(需要导入4个jar包)。
需要如下jar包:
1、spring-aop-4.2.4.RELEASE.jar ----aop的原始jar包。
2、com.springsource.org.aopalliance-1.0.0.jar---aopalliance联盟的意思。aop联盟是针对aop制定的一些规范。如果想使用aop需要导入该jar包。
3、com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar依赖的aspectJ的jar包。

4、spring-aspects-4.2.4.RELEASE.jar spring本身的aspects支持的jar包。
2)约束引入
也之前的文件中:

引入:
<?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 definitions here --> </beans>
3)创建包结构:
接口:
package jd.com.demo;
public interface asTest {
void save();
void update();
}
实现类:
package jd.com.demo;
public class asTestImpl implements asTest {
@Override
public void save() {
System.out.println("this save method!");
}
@Override
public void update() {
System.out.println("this is update!");
}
}
切面类:
package jd.com.demo;
public class asdemo {
public void log(){
System.out.println("日志输出");
}
}
配置文件:
1)实现类声明:
<!--目标类的定义声明-->
<bean id="asTest" class="jd.com.demo.asTestImpl"/>
2)切面类声明:
<!--切面类的定义声明-->
<bean class="jd.com.demo.asdemo" id="asdemo"/>
引入切面和需要增强方法:
<aop:config >
<!--引入切面-->
<aop:aspect ref="asdemo">
<!--定义通知类型-->
<aop:before method="log" pointcut="execution(public void jd.com.demo.asTestImpl.save())"/>
</aop:aspect>
</aop:config>
分析:

2-->aop;before 通知类型 前置通知,即被增强的方法在执行前执行增强方法。其中method和1对应即那个切面的那个方法。
1-->引入切面类。
3-->pointcut 切入点那个类的那个方法需要增强 后面跟的切入点表达式 。 修饰符 返回值 类的全路径 方法 用属性点连接。
3)切入点表达式:
<bean id="asTest" class="jd.com.demo.asTestImpl"/>
<bean class="jd.com.demo.asdemo" id="asdemo"/>
<aop:config >
<aop:aspect ref="asdemo">
<!--、execution()固定写法-->
<!--<aop:before method="log" pointcut="execution(public void jd.com.demo.asTestImpl.save())"/>-->
<!--
、修饰符public可以省略
<aop:before method="log" pointcut="execution( void jd.com.demo.asTestImpl.save())"/>-->
<!--
、返回值 可以写任意类型,比如:void 、String 会根据返回值得类型去匹配需要加强的类。
匹配任意类型* 该值不可以省略。
<aop:before method="log" pointcut="execution( * jd.com.demo.asTestImpl.save())"/>-->
<!--
、包路径可以省略,用*代替。但是只代表一层(*.asTestImpl 表示src下面的一层目录下面的实现类)。包的名字可以写成*Impl 表示以什么结尾 同样方法也可以这么写:*save 表示以save结尾的方法。
<aop:before method="log" pointcut="execution( * *.*.*.*Impl.*save())"/>-->
<!--
、方法的参数可以省略.. 表示任意参数。
<aop:before method="log" pointcut="execution( * *.*.*.*Impl.*save(..))"/>-->
</aop:aspect>
</aop:config>
注意:
再注入被加强的类的时候,设置字段的时候,类型需要写成接口的类型!!!!

4)通知类型:
1:前置通知 在方法运行前运行,可以对方法的参数来做校验。
<aop:before method="log" pointcut="execution( * *.*.*.*Impl.*save())"/>
2:最终通知类型通知,无论方法执行失败还是成功,都会在原先方法执行完之后执行。该类型可以用于一些资源的释放。、
<aop:after method="after" pointcut="execution( * *.*.*.*Impl.*save())"/>

3、后置通知 方法正常执行,才执行,一般用于方法成功执行的时候,对结果做一些简单的处理。
<aop:after-returning method="afterreturning" pointcut="execution( * *.*.*.*Impl.*save())"/>
4、异常通知:当被增强的方法,出现异常的时候,执行。
<aop:after-throwing method="afterthrowing" pointcut="execution( * *.*.*.*Impl.*save())"/>

5、环绕通知:在使用该通知的时候,如果不手动开启执行被增强方法的话。增强方法不会被执行。需要手动传入参数:ProceedingJoinPoint proceedingJoinPoint 然后执行: proceedingJoinPoint.proceed()。
<aop:around method="afteraround" pointcut="execution( * *.*.*.*Impl.*save())"/>
public void afteraround(ProceedingJoinPoint proceedingJoinPoint){
System.out.println("环绕通知.");
try {
proceedingJoinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("环绕通知.");
}
切面代码:
package jd.com.demo;
import org.aspectj.lang.ProceedingJoinPoint;
public class asdemo {
public void log(){
System.out.println("日志输出");
}
public void after(){
System.out.println("最终类型通知!");
}
public void afterreturning(){
System.out.println("后置类型通知");
}
public void afterthrowing(){
System.out.println("后置异常通知.");
}
public void afteraround(ProceedingJoinPoint proceedingJoinPoint){
System.out.println("环绕通知.");
try {
proceedingJoinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("环绕通知.");
}
}
JAVA框架 Spring AOP--切入点表达式和通知类型的更多相关文章
- JAVA框架 Spring AOP注解
一.准备工作: 1)导入jar包: 4个jar包. 2)约束:(spring需要所有的约束)有IOC约束和AOP 还有事务(tx)以及注解注入的约束(context). <?xml versio ...
- Spring aop 切入点表达式
转自: https://blog.csdn.net/qq_36951116/article/details/79172485 切入点指示符用来指示切入点表达式目的,,在Spring AOP中目前只 ...
- spring aop的五种通知类型
昨天在腾讯课堂看springboot的视频,老师随口提问,尼玛竟然回答错了.特此记录! 问题: Spring web项目如果程序启动时出现异常,调用的是aop中哪类通知? 正确答案是: 异常返回通知. ...
- spring aop 的五种通知类型
本文转自:http://blog.csdn.net/cqabl/article/details/46965197 spring aop通知(advice)分成五类: 前置通知[Before advic ...
- JAVA框架 Spring AOP底层原理
一:AOP(Aspect Oriented Programming)面向切面编程. 底层实现原理是java的动态代理:1.jdk的动态代理.2.spring的cglib代理. jdk的动态代理需要被代 ...
- Java开发学习(十六)----AOP切入点表达式及五种通知类型解析
一.AOP切入点表达式 对于AOP中切入点表达式,总共有三个大的方面,分别是语法格式.通配符和书写技巧. 1.1 语法格式 首先我们先要明确两个概念: 切入点:要进行增强的方法 切入点表达式:要进行增 ...
- Java框架spring 学习笔记(十四):注解aop操作
回见Java框架spring Boot学习笔记(十三):aop实例操作,这里介绍注解aop操作 首先编写一个切入点HelloWorld.java package com.example.spring; ...
- [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.
前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...
- Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)
在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...
随机推荐
- 巧用css的border属性完成对图片编辑功能的性能优化
一.需求场景: 最近闲来无事,boss提出了一个要求,研究相关代码并完成一个关于编辑图片功能的性能优化,该功能的主要界面展示如下: 通过了几分钟的短暂试用,发现就是一个简单的裁剪并保存用户选择并上传的 ...
- js-ES6学习笔记-Proxy
1.Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程. 2.Proxy 可以理解成,在目标对象之前架设 ...
- ActiveReports 报表控件V12新特性 -- 页面报表新增子报表
ActiveReports是一款专注于 .NET 平台的报表控件,全面满足 HTML5 / WinForms / ASP.NET / ASP.NET MVC / WPF 等平台下报表设计和开发工作需求 ...
- 敏捷开发的道与术---MPD软件工作坊培训感想(上)
注:由麦思博(MSUP)主办的2013年亚太软件研发团队管理峰会(以下简称MPD大会)分别于6月15及6月22日在北京.上海举办,葡萄城的部分程序员参加了上海的会议,本文是参会的一些感受和心得. 这次 ...
- 安装Wamp时出现无法启动此程序,因为计算机中丢失MSVCR110.dll
一.问题描述 安装Wamp时出现无法启动此程序,因为计算机中丢失MSVCR110.dll 二.解决方法 首先进入 http://www.microsoft.com/zh-CN/download/det ...
- VS2008 试图运行未注册64位调试器组件
安装即可
- BootStrap学习之栅格布局
Bootstrap 提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的改变,系统会自动分为最多12列.它包含了易于使用的预定义类,还有强大的mixin用于生成更具语 ...
- CountDownTimer 源码分析
倒计时的功能,比如说:发送短信验证码倒计时. public class CountDownTimerActivity extends Activity { private Button mSend; ...
- OneAPM大讲堂 | 监控数据的可视化分析神器 Grafana 的告警实践
文章系国内领先的 ITOM 管理平台供应商 OneAPM 编译呈现. 概览 Grafana 是一个开源的监控数据分析和可视化套件.最常用于对基础设施和应用数据分析的时间序列数据进行可视化分析,也可以用 ...
- linux安装activemq
ActiveMQ是由Apache出品的,一款最流行的,能力强劲的开源消息总线.ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,它非常快速,支持多种语言 ...