一、准备

  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的更多相关文章

  1. AOP中使用Aspectj对接口访问权限进行访问控制

    切面编程的应用案例比较多,在统一的日志处理,鉴权过程中都会用的AOP原理,本文主要针对对进口的访问权限进行控制为例,说明 切面编程的使用: 1.使用Aspectj的方式进行切面编程: 2.编码环境,s ...

  2. 在Spring中使用AspectJ实现AOP

    在Spring中,最常用的AOP框架是AspectJ,使用AspectJ实现AOP有2种方式: 基于XML的声明式AspectJ 基于注解的声明式AspectJ 基于XML的声明式AspectJ 1. ...

  3. Spring AOP支持的AspectJ切入点语法大全

    原文出处:http://jinnianshilongnian.iteye.com/blog/1420691 Spring AOP支持的AspectJ切入点指示符 切入点指示符用来指示切入点表达式目的, ...

  4. (转)实例简述Spring AOP之间对AspectJ语法的支持(转)

    Spring的AOP可以通过对@AspectJ注解的支持和在XML中配置来实现,本文通过实例简述如何在Spring中使用AspectJ.一:使用AspectJ注解:1,启用对AspectJ的支持:通过 ...

  5. Spring AOP中定义切点(PointCut)和通知(Advice)

    如果你还不熟悉AOP,请先看AOP基本原理,本文的例子也沿用了AOP基本原理中的例子.切点表达式 切点的功能是指出切面的通知应该从哪里织入应用的执行流.切面只能织入公共方法.在Spring AOP中, ...

  6. 正确理解Spring AOP中的Around advice

    Spring AOP中,有Before advice和After advice,这两个advice从字面上就可以很容易理解,但是Around advice就有点麻烦了. 乍一看好像是Before ad ...

  7. Spring AOP高级——源码实现(2)Spring AOP中通知器(Advisor)与切面(Aspect)

    本文例子完整源码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/Spring%20AOP%E9%A ...

  8. 笔记13 AOP中After和AfterReturning的区别

    AOP中 @Before @After @AfterThrowing@AfterReturning的执行顺序 public Object invoke(Object proxy, Method met ...

  9. spring aop中pointcut表达式完整版

    spring aop中pointcut表达式完整版 本文主要介绍spring aop中9种切入点表达式的写法 execute within this target args @target @with ...

随机推荐

  1. for循环的表达规则,for循环的嵌套,跳转语句;穷举;迭代;异常处理

    for循环的基本格式 for(表达式1:表达式2:表达式3) { 循环体: } for循环的四要素 表达式1就是变量初始化:表达式2就是循环条件:表达式3是状态改变 static void Main( ...

  2. jquery与js的区别与基础操作

    一.什么是 jQuery jQuery是一个JavaScript库,它通过封装原生的JavaScript函数得到一整套定义好的方法.它的作者是John Resig,于2006年创建的一个开源项目,随着 ...

  3. Prince2学习有感:PRINCE2项目管理到底是什么?

      2007年1月份,我加入了荷兰Irdeto(中国)有限公司.刚进入公司,我就结识了Prince2(受控环境下的项目管理),才知道Prince2是英国政府在政府项目中使用的项目管理标准. 这个标准早 ...

  4. 3555: [Ctsc2014]企鹅QQ

    3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 696  Solved: 294[Submit][Status ...

  5. hdoj 1175 (bfs)

    题意: 判断两点之间是否可以通过至多有两次转变方向以达到相连,就是平时玩的连连看游戏,但是不能从外面绕过去. 思路:bfs,给每个加入的队列的点添加转变方向次数turn和点当前要走的方向dir属性,起 ...

  6. Go语言并发机制初探

    Go 语言相比Java等一个很大的优势就是可以方便地编写并发程序.Go 语言内置了 goroutine 机制,使用goroutine可以快速地开发并发程序, 更好的利用多核处理器资源.这篇文章学习 g ...

  7. GCC命令

    一. 常用编译命令选项 源程序test.c 1. 无选项编译链接用法:#gcc test.c作用:将test.c预处理.汇编.编译并链接形成可执行文件.这里未指定输出文件,默认输出为a.out. 2. ...

  8. MySQL入门(下)

    1. 课程回顾(很清晰明了) mysql基础 1)mysql存储结构: 数据库 -> 表 -> 数据   sql语句 2)管理数据库: 增加: create database 数据库 de ...

  9. 性能测试平台效率优化的一次经验(python版)

    在做性能测试平台的优化过程中,由于启动任务相对其他测试任务比较频繁,而目前30次两个包的交叉对比(30次)测试需要耗时30分钟整,因此打算优先对测试流程做一次优化,将测试时间消耗降低到20分钟. 由于 ...

  10. Android 增加(键盘)按键

    以添加 camera按键为例(红色是需要添加的) 一.kernel键值定义 (1)键扫描码 ScanCode是由linux的Input驱动框架定义的整数类型,可参考input.h头文件,即geteve ...