AOP中的ASPECTJ
一、准备
1.架包
2.配置文件
二、注解的形式
UserDao.java
package cn.itcast.spring.aspectj.annocation; public class UserDao { public void add(){
System.out.println("add......");
} public void delete(){
System.out.println("delete......");
int i = 1/0;
} public String update(){
System.out.println("update......"); return "我被返回了";
} public void find(){
System.out.println("find......");
} public void edit(){
System.out.println("edit");
} }
MyAspectj.java
package cn.itcast.spring.aspectj.annocation; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
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;
import org.aspectj.lang.annotation.Pointcut; /**
* 定义切面类: 切点和通知
* @author Administrator
*
*/
@Aspect//切面类的标识
public class MyAspectj { /**
* 前置通知
*/
@Before("MyAspectj.myPointcut()")
public void before(JoinPoint point){
System.out.println("前置通知");
System.out.println("方法名"+point.getSignature().getName());
} /**
* 后置通知
*/
@AfterReturning(value="execution(* cn.itcast.spring.aspectj.annocation.UserDao.update(..))",returning="val")
public void afterReturning(JoinPoint point,Object val){
System.out.println("后置通知");
System.out.println("方法名"+point.getSignature().getName());
System.out.println("返回值:"+val);
} /**
* 环绕增强
* @throws Throwable
*/
@Around(value="execution(* cn.itcast.spring.aspectj.annocation.UserDao.find(..))")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
System.out.println("环绕前");
Object result = proceedingJoinPoint.proceed();//可以组织方法执行
System.out.println("环绕后");
return result;
} /*
* 异常通知
*/
@AfterThrowing(value="execution(* cn.itcast.spring.aspectj.annocation.UserDao.delete(..))",throwing="tw")
public void afterThrowing(Throwable tw){
System.out.println("异常通知");
System.out.println(tw.getMessage());
} /*
* 最终通知
*/
@After("execution(* cn.itcast.spring.aspectj.annocation.UserDao.edit(..))")
public void after(){
System.out.println("最终通知");
} /*
* 定义一个切点,通用型的表达式
* 使用切面类.切点()
*/ @Pointcut("execution(* cn.itcast.spring.aspectj.annocation.UserDao.add(..))")
private void myPointcut(){}; }
TestAspectjAnnocation.java
package cn.itcast.spring.aspectj.annocation; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class TestAspectjAnnocation {
@Autowired
@Qualifier("userDao")
private UserDao userDao; @Test
public void testAspectjAnnocation(){
userDao.add();
//userDao.delete();
} }
applicationContxt.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.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 引入目标类 和切面类-->
<bean id="userDao" class="cn.itcast.spring.aspectj.annocation.UserDao"></bean>
<bean id="myAspectj" class="cn.itcast.spring.aspectj.annocation.MyAspectj"></bean> <!-- 使用aop的自动代理自动扫描 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans>
三、使用xml的形式
UserDao.java
package cn.itcast.spring.aspectj.xml; public class UserDao { public void add(){
System.out.println("add......");
} public void delete(){
System.out.println("delete......");
int i = 1/0;
} public String update(){
System.out.println("update......"); return "我被返回了";
} public void find(){
System.out.println("find......");
} public void edit(){
System.out.println("edit");
} }
MyAspectj.java
package cn.itcast.spring.aspectj.xml; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
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;
import org.aspectj.lang.annotation.Pointcut; /**
* 定义切面类: 切点和通知
* @author Administrator
*
*/ public class MyAspectj { /**
* 前置通知
*/ public void before(JoinPoint point){
System.out.println("前置通知");
System.out.println("方法名"+point.getSignature().getName());
} /**
* 后置通知
*/
public void afterReturning(JoinPoint point,Object val){
System.out.println("后置通知");
System.out.println("方法名"+point.getSignature().getName());
System.out.println("返回值:"+val);
} /**
* 环绕增强
* @throws Throwable
*/
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
System.out.println("环绕前");
Object result = proceedingJoinPoint.proceed();//可以组织方法执行
System.out.println("环绕后");
return result;
} /*
* 异常通知
*/
public void afterThrowing(Throwable tw){
System.out.println("异常通知");
System.out.println(tw.getMessage());
} /*
* 最终通知
*/
public void after(){
System.out.println("最终通知");
} }
TestAspectjXml.java
package cn.itcast.spring.aspectj.xml; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext2.xml")
public class TestAspectjXML {
@Autowired//自动装配bean
@Qualifier("userDao")
private UserDao userDao; @Test
public void testAspectjAnnocation(){
System.out.println(userDao);
userDao.add();
//userDao.delete();
} }
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.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 引入目标类 和切面类-->
<bean id="userDao" class="cn.itcast.spring.aspectj.xml.UserDao"></bean>
<bean id="myAspectj" class="cn.itcast.spring.aspectj.xml.MyAspectj"></bean> <!-- aop的配置 -->
<aop:config>
<!-- 定义切入点:也就是也要增强的哪些方法 -->
<aop:pointcut expression="execution(* cn.itcast.spring.aspectj.xml.UserDao.add(..))" id="myPointcut1"/>
<aop:pointcut expression="execution(* cn.itcast.spring.aspectj.xml.UserDao.find(..))" id="myPointcut2"/>
<aop:pointcut expression="execution(* cn.itcast.spring.aspectj.xml.UserDao.delete(..))" id="myPointcut3"/>
<aop:pointcut expression="execution(* cn.itcast.spring.aspectj.xml.UserDao.update(..))" id="myPointcut4"/>
<aop:pointcut expression="execution(* cn.itcast.spring.aspectj.xml.UserDao.edit(..))" id="myPointcut5"/>
<!-- 切面类的配置 -->
<aop:aspect ref="myAspectj">
<aop:before method="before" pointcut-ref="myPointcut1"/>
<aop:after-returning method="afterReturning" returning="val" pointcut-ref="myPointcut2" />
<aop:after-throwing method="afterThrowing" throwing="tw" pointcut-ref="myPointcut3"/>
<aop:around method="around" pointcut-ref="myPointcut4"/>
<!-- 最终通知 -->
<aop:after method="after" pointcut-ref="myPointcut5"/>
</aop:aspect> </aop:config>
</beans>
AOP中的ASPECTJ的更多相关文章
- AOP中使用Aspectj对接口访问权限进行访问控制
切面编程的应用案例比较多,在统一的日志处理,鉴权过程中都会用的AOP原理,本文主要针对对进口的访问权限进行控制为例,说明 切面编程的使用: 1.使用Aspectj的方式进行切面编程: 2.编码环境,s ...
- 在Spring中使用AspectJ实现AOP
在Spring中,最常用的AOP框架是AspectJ,使用AspectJ实现AOP有2种方式: 基于XML的声明式AspectJ 基于注解的声明式AspectJ 基于XML的声明式AspectJ 1. ...
- Spring AOP支持的AspectJ切入点语法大全
原文出处:http://jinnianshilongnian.iteye.com/blog/1420691 Spring AOP支持的AspectJ切入点指示符 切入点指示符用来指示切入点表达式目的, ...
- (转)实例简述Spring AOP之间对AspectJ语法的支持(转)
Spring的AOP可以通过对@AspectJ注解的支持和在XML中配置来实现,本文通过实例简述如何在Spring中使用AspectJ.一:使用AspectJ注解:1,启用对AspectJ的支持:通过 ...
- Spring AOP中定义切点(PointCut)和通知(Advice)
如果你还不熟悉AOP,请先看AOP基本原理,本文的例子也沿用了AOP基本原理中的例子.切点表达式 切点的功能是指出切面的通知应该从哪里织入应用的执行流.切面只能织入公共方法.在Spring AOP中, ...
- 正确理解Spring AOP中的Around advice
Spring AOP中,有Before advice和After advice,这两个advice从字面上就可以很容易理解,但是Around advice就有点麻烦了. 乍一看好像是Before ad ...
- Spring AOP高级——源码实现(2)Spring AOP中通知器(Advisor)与切面(Aspect)
本文例子完整源码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/Spring%20AOP%E9%A ...
- 笔记13 AOP中After和AfterReturning的区别
AOP中 @Before @After @AfterThrowing@AfterReturning的执行顺序 public Object invoke(Object proxy, Method met ...
- spring aop中pointcut表达式完整版
spring aop中pointcut表达式完整版 本文主要介绍spring aop中9种切入点表达式的写法 execute within this target args @target @with ...
随机推荐
- for循环的表达规则,for循环的嵌套,跳转语句;穷举;迭代;异常处理
for循环的基本格式 for(表达式1:表达式2:表达式3) { 循环体: } for循环的四要素 表达式1就是变量初始化:表达式2就是循环条件:表达式3是状态改变 static void Main( ...
- jquery与js的区别与基础操作
一.什么是 jQuery jQuery是一个JavaScript库,它通过封装原生的JavaScript函数得到一整套定义好的方法.它的作者是John Resig,于2006年创建的一个开源项目,随着 ...
- Prince2学习有感:PRINCE2项目管理到底是什么?
2007年1月份,我加入了荷兰Irdeto(中国)有限公司.刚进入公司,我就结识了Prince2(受控环境下的项目管理),才知道Prince2是英国政府在政府项目中使用的项目管理标准. 这个标准早 ...
- 3555: [Ctsc2014]企鹅QQ
3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 696 Solved: 294[Submit][Status ...
- hdoj 1175 (bfs)
题意: 判断两点之间是否可以通过至多有两次转变方向以达到相连,就是平时玩的连连看游戏,但是不能从外面绕过去. 思路:bfs,给每个加入的队列的点添加转变方向次数turn和点当前要走的方向dir属性,起 ...
- Go语言并发机制初探
Go 语言相比Java等一个很大的优势就是可以方便地编写并发程序.Go 语言内置了 goroutine 机制,使用goroutine可以快速地开发并发程序, 更好的利用多核处理器资源.这篇文章学习 g ...
- GCC命令
一. 常用编译命令选项 源程序test.c 1. 无选项编译链接用法:#gcc test.c作用:将test.c预处理.汇编.编译并链接形成可执行文件.这里未指定输出文件,默认输出为a.out. 2. ...
- MySQL入门(下)
1. 课程回顾(很清晰明了) mysql基础 1)mysql存储结构: 数据库 -> 表 -> 数据 sql语句 2)管理数据库: 增加: create database 数据库 de ...
- 性能测试平台效率优化的一次经验(python版)
在做性能测试平台的优化过程中,由于启动任务相对其他测试任务比较频繁,而目前30次两个包的交叉对比(30次)测试需要耗时30分钟整,因此打算优先对测试流程做一次优化,将测试时间消耗降低到20分钟. 由于 ...
- Android 增加(键盘)按键
以添加 camera按键为例(红色是需要添加的) 一.kernel键值定义 (1)键扫描码 ScanCode是由linux的Input驱动框架定义的整数类型,可参考input.h头文件,即geteve ...