一、准备

  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. linux中添加环境变量(python为例)

    最近想用Django搭建个人博客,之前学了些python基础语法,准备边学习Django边实战操作.自己有一个阿里云服务器,用的centOS,自带的是python2.7版本,我直接安装了python3 ...

  2. [LeetCode]Rotate Image(矩阵旋转)

    48. Rotate Image     Total Accepted: 69437 Total Submissions: 198781 Difficulty: Medium You are give ...

  3. PowerDesigner建模应用(二)逆向工程,导出PDM文件前过滤元数据(表、视图、存储过程等)

    在上一篇文章<PowerDesigner建模应用(一)逆向工程,配置数据源并导出PDM文件>步骤二中导出了目标数据库对应的PDM文件, 该文件中展示出了所有表的信息与关系. 某些业务场景下 ...

  4. 关于极光推送在手机系统低于iOS10的手机上闪退的问题。

    最近项目中用到了极光推送,升级到了最新的SDK 2.1.9版本,发现只能在iOS10 上运行,其他测试的时候真机闪退.贴上一个可能的原因:

  5. checkSelfPermission 找不到 Android 动态权限问题

    checkSelfPermission 找不到 Android 动态权限问题  最近写了一个Demo,以前好好地.后来手机更新了新系统以后,不能用总是闪退.而且我的小伙伴的是android 7.0系统 ...

  6. 如何使用Vue2做服务端渲染

    花费了一个月时间,终于在新养车之家项目中成功部署了vue2服务端渲染(SSR),并且使用上了Vuex 负责状态管理,首屏加载时间从之前4G网络下的1000ms,提升到了现在500-700ms之间,SS ...

  7. Hibernate写配置文件无提示信息解决

    把Hibernate的相关jar包引入工程后,在配置hibernate.cfg.xml时没有提示信息,对于开发人员来说,那么多标签,标签有那么多属性,全部都记住显然是不可能的,遇到这种情况是很头疼的事 ...

  8. 【SF】开源的.NET CORE 基础管理系统系列导航

    SF是一套基于ASP.NET Core MVC+EFCore+Bootstrap开发出来的基础管理系统,源代码完全开源,可以帮助你解决C#.NET项目中重复编码的繁琐工作,让开发人员远离加班! SF ...

  9. 自适应滤波:维纳滤波器——GSC算法及语音增强

    作者:桂. 时间:2017-03-26  06:06:44 链接:http://www.cnblogs.com/xingshansi/p/6621185.html 声明:欢迎被转载,不过记得注明出处哦 ...

  10. 修复关于apache-xampp的问题:Port 443 in use by “vmware-hostd.exe”!

    内容提要:复关于apache-xampp的问题:Port 443 in use by “vmware-hostd.exe”!在电脑里装了VMware后,再要装xampp,十有八九就会出现这个问题: 复 ...