一、准备

  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. css模拟Bootstrap响应式布局——栅格

    做作业的时候遇见用css模拟Bootstrap的栅格布局,学习了一下.发现这个很有用,用来在不同的平台上得到很好地用户体验,比如Phone.Pad.大屏幕显示器.小屏幕显示器.自己模拟用css写了一下 ...

  2. js substr和substring的区别

    在js中substring和substr都是用来截取字符串的,substr函数和substring函数都是用来从某个“母字符串”中提取“子字符串”的函数.但用法有些差别,下面分别介绍但是它们还是有区别 ...

  3. 关于redis 缓存的问题

    项目是 星期三上线的 , 今天来的时候有个问题,  我觉得很有价值,所以就记录了一下. 问题描述:  我们是做app 开发 的, 这次开发是要 把 以前的app 的业务 分开,新建一 个app ,这个 ...

  4. App Store 审核 IPv6 问题

    应用提交了N次,每次被拒都是说IPv6的事情,花点功夫把这个事情搞清楚. 苹果审核人员回复的原因都差不多,说在他们的IPv6-Only的环境中测试应用,无法正常请求我们的服务器. 因为我们的域名确实没 ...

  5. 初写Python

    #!/usr/bin/env python (指定用什么解释器运行脚本以及解释器所在的位置) # -*- coding:utf-8 -*- (用来指定文件编码为utf-8的)   # 无效的内容,只做 ...

  6. 1036: [ZJOI2008]树的统计Count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7496  Solved: 3078[Submit] ...

  7. 2015: [Usaco2010 Feb]Chocolate Giving

    2015: [Usaco2010 Feb]Chocolate Giving Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 269  Solved: 1 ...

  8. 1601: [Usaco2008 Oct]灌水

    1601: [Usaco2008 Oct]灌水 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 1342  Solved: 881 [Submit][S ...

  9. commonJS的核心思想

    服务器端的 Node.js 遵循 CommonJS规范,该规范的核心思想是允许模块通过 require 方法来同步加载所要依赖的其他模块,然后通过 exports 或 module.exports 来 ...

  10. 【WCF】错误处理(二):错误码―—FaultCode

    先来说说SOAP消息中错误消息的包装结构,一条SOAP错误消息的大致形式如下: <s:Fault> <faultcode xmlns:a="me-cust-error&qu ...