Spring的AOP基于AspectJ的注解方式开发2
参考自黑马培训机构
上一篇博客提到了在配置文件中开启aop的注解开发,以及简单使用了@Before,@Aspect 这是为了告诉spring为前置通知和切面类
接下来介绍aop的注解的通知类型,和切入点的注解。参考自https://www.cnblogs.com/ltfxy/p/9885742.html
Spring的注解的AOP的通知类型
- @Before:前置通知
 - @AfterReturning:后置通知
 - @Around:环绕通知
 - @AfterThrowing:异常抛出通知
 - @After:最终通知
 - @Pointcut:切入点的注解
 
切面类代码如下
package spring.day2_aop2; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before; /*
* 编写切面类
*/
@Aspect
public class MyAspect {
/*
* 前置通知
*/
@Before(value="execution(* spring.day2_aop2.OrderDao.save(..))")
public void checkPri() {
System.out.println("=============权限校验(前置通知)=============");
}
/*
* 可以带返回值的后置通知
*/
@AfterReturning(value="execution(* spring.day2_aop2.OrderDao.delete(..))",returning="result" )
public void writeLog(Object result) {
System.out.println("=============日志记录(后置通知)============="+result);
}
/*
* 环绕通知
*/
@Around(value="execution(* spring.day2_aop2.OrderDao.update(..))")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("==========环绕前增强============");
Object proceed = joinPoint.proceed();
System.out.println("==========环绕后增强============");
return proceed;
}
/*
* 异常抛出通知
*/
@AfterThrowing(value="execution(* spring.day2_aop2.OrderDao.find(..))")
public void afterThrowing(JoinPoint joinPoint) {
System.out.println("==========异常抛出通知============"+joinPoint);
}
}
目标类,配置文件,及测试类代码如下
package spring.day2_aop2;
/*
* 编写目标类
*/
public class OrderDao { public void save() {
System.out.println("orderDao的save方法已经执行......");
}
public String delete() {
System.out.println("orderDao的delete方法已经执行......");
return "张三";
}
public void update() {
System.out.println("orderDao的update方法已经执行......");
}
public void find() {
System.out.println("orderDao的find方法已经执行......");
int i=1/0;
} }
<?xml version="1.0" encoding="UTF-8"?>
<!-- ===============================引入aop开发的约束============================ -->
<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"> <!-- ====在注解文件里开启aop的开发===== -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy> <!-- 配置目标类 -->
<bean id="orderDao" class="spring.day2_aop2.OrderDao"></bean> <!-- 配置切面类 -->
<bean id="myAspect" class="spring.day2_aop2.MyAspect"></bean> </beans>
package spring.day2_aop2; import javax.annotation.Resource; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /*
* 编写测试类
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext5.xml")
public class SpringDemo1 { @Resource(name="orderDao")
private OrderDao orderDao; @Test
public void demo1() {
orderDao.save();
orderDao.delete();
orderDao.update();
orderDao.find();
}
}
测试结果如下:

补充:
转载自https://www.cnblogs.com/yuwenlanleng/p/6704780.html
AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点对象,该类是JoinPoint的子接口。任何一个增强方法都可以通过将第一个入参声明为JoinPoint访问到连接点上下文的信息。我们先来了解一下这两个接口的主要方法: 
1)JoinPoint 
 java.lang.Object[] getArgs():获取连接点方法运行时的入参列表; 
 Signature getSignature() :获取连接点的方法签名对象; 
 java.lang.Object getTarget() :获取连接点所在的目标对象; 
 java.lang.Object getThis() :获取代理对象本身; 
2)ProceedingJoinPoint 
ProceedingJoinPoint继承JoinPoint子接口,它新增了两个用于执行连接点方法的方法: 
 java.lang.Object proceed() throws java.lang.Throwable:通过反射执行目标对象的连接点处的方法; 
 java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:通过反射执行目标对象连接点处的方法,不过使用新的入参替换原来的入参。
Spring的AOP基于AspectJ的注解方式开发2的更多相关文章
- Spring的AOP基于AspectJ的注解方式开发1
		
参考自黑马培训机构 创建项目,引入jar包 编写目标类,切面类并完成配置 package spring.day2_aop2; /* * 编写目标类 */ public class OrderDao { ...
 - Spring的AOP基于AspectJ的注解方式开发3
		
上上偏博客介绍了@Aspect,@Before 上篇博客介绍了spring的AOP开发的注解通知类型:@Before,@AfterThrowing,@After,@AfterReturning,@Ar ...
 - 基于AspectJ的注解方式进行AOP开发
		
-------------------siwuxie095 基于 AspectJ 的注解方式进行 AOP 开发 ...
 - spring AOP (使用AspectJ的注解方式 的aop实现) (6)
		
目录 一.在 Spring 中启用 AspectJ 注解支持 二.AspectJ 支持 5 种类型的通知注解: 2.1.使用之前的 计算器接口和实现类 ArithmeticCalculator.jav ...
 - AOP——基于AspectJ的注解来实现AOP操作
		
1.使用注解方式实现AOP操作 第一步:创建对象 <!-- 创建对象 --> <bean id="book" class="com.bjxb.aop.B ...
 - Spring框架的事务管理之基于AspectJ的注解方式(重点掌握,最简单的方式)
		
1. 步骤一:恢复转账的开发环境(具体开发环境实现见:https://www.cnblogs.com/wyhluckdog/p/10137283.html)2. 步骤二:applicationCont ...
 - 【AOP】操作相关术语---【Spring】的【AOP】操作(基于aspectj的xml方式)
		
[AOP]操作相关术语 Joinpoint(连接点):类里面哪些方法可以被增强,这些方法称为连接点. Pointcut(切入点):在类里面可以有很多的方法被增强,比如实际操作中,只是增强了类里面add ...
 - day39-Spring 08-Spring的AOP:基于AspectJ的注解
		
基于AspectJ的注解的开发要重点掌握. 这些表达式肯定要应用在我们的某些个增强上. 学习AspectJ也是两种形式:一种是XML,一种是注解.AspectJ的增强,就是那些通知的类型.Aspect ...
 - Spring_AOP基于AspectJ的注解开发&JDBC的模板使用&事务管理(学习笔记3)
		
一:AOP基于AspectJ的注解开发 1,简单的实例: 1)引入相应的jar包  2)在配置文件里引入相关约束 <beans xmlns="http://www.springfra ...
 
随机推荐
- Spring Boot 设置静态资源访问
			
问题描述 当使用spring Boot来架设服务系统时,有时候也需要用到前端页面,当然就不可或缺地需要访问其他一些静态资源,比如图片.css.js等文件.那么如何设置Spring Boot网站可以访问 ...
 - 数据库部分(MySql)_4
			
约束 约束:给表的字段名添加限制条件; 非空约束(not null):添加非空约束后,字段值不能为null: 唯一约束(unique):添加唯一约束后,字段值不能重复: 主键约束(primary ke ...
 - C# 操作注册表WindowsRegistry
			
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsof ...
 - [PHP]PHP rpc框架hprose测试
			
建立composer.json { "name": "hprose/examples", "description": "exam ...
 - [android] 开启新的activity获取他的返回值
			
应用场景:打开一个新的activity,在这个activity上获取数据,返回给打开它的界面 短信发送时,可以直接选择系统联系人 界面布局是一个线性布局,里面右侧选择联系人在EditText的右上,因 ...
 - SaaS技术栈的走势
			
本地部署时代 在软件还是“本地部署(on-premise)”的时候,SaaS的版图被大型玩家把持着,几乎所有的垂直领域(营销.支持.销售.人力)都被微软.SAP等大公司的解决方案占据.那时候的用户并没 ...
 - idea编辑器快捷键调整
			
习惯了Eclipse中的删除快捷键,idea中的快捷键用着不是很适应,于是乎调整了下. idea编辑器快捷键调整: 默认:删除代码行:Ctrl+Y复制代码行:Ctrl+D在当前行之前添加一行: Ctr ...
 - vue从入门到进阶:计算属性computed与侦听器watch(三)
			
计算属性computed 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example" ...
 - 2017-11-07 中文代码示例之Angular入门教程尝试
			
"中文编程"知乎专栏原址 原文: 中文代码示例教程之Angular尝试 为了检验中文命名在Angular中的支持程度, 把Angular官方入门教程的示例代码中尽量使用了中文命名. ...
 - phpcms调用指定文章内容模型的ID
			
一.使用GET调用Phpcms V9指定id页面数据方法 {pc:get sql="SELECT * FROM cmsyou_news WHERE id='55'" cache=& ...