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 ...
随机推荐
- [数据挖掘] - 聚类算法:K-means算法理解及SparkCore实现
聚类算法是机器学习中的一大重要算法,也是我们掌握机器学习的必须算法,下面对聚类算法中的K-means算法做一个简单的描述: 一.概述 K-means算法属于聚类算法中的直接聚类算法.给定一个对象(或记 ...
- iOS回顾笔记(03) -- 自定义View的封装和xib文件的使用详解
iOS回顾笔记(03) -- 自定义View的封装和xib文件的使用详解 iOS开发中,我们常常将一块View封装起来,以便于统一管理内部的子控件.如iOS回顾笔记(02)中的"书" ...
- 中软卓越IT培训:给IT程序员的18个忠告
1 .想清楚,写清楚,说清楚,才是真正的清楚! 2 .多花点时间沟通清楚需求,才能把握正确方向! 3 .修复需求错误的成本是代码错误的几十倍! 4 .程序员最大的坏习惯就是:急于动手写代码! 5 .提 ...
- 构建Docker平台【第四篇】创建服务及扩缩容等操作
第一步:创建服务 1. 配置 nginx 的 yaml 文件 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: my-ng ...
- 如何让celery接受定制的参数
背景介绍 最近的一个项目使用到celery结算订单,使用celery的确很方便.但是复杂的内部框架导致了需要传人大量的参数例如数据库配置文件等.下面先来看看我仿照官网写的代码.所有代码都放到githu ...
- 第二章 mac上运行第一个appium实例
一.打开appium客户端工具 1 检查环境是否正常运行: 点击左边第三个图标 这是测试你环境是否都配置成功了 2 执行的过程中,遇到Could not detect Mac OS ...
- js对象继承的问题
js继承方法有多种: 1.利用call()和apply()的方法. call()里面接受多个参数:apply()只能接受两个参数. call()第一个参数是本身,后面都是他的属性和方法. apply( ...
- Cesium原理篇:3D Tiles(2)数据结构
上一节介绍3D Tiles渲染调度的时候,我们提到目前Cesium支持的Cesium3DTileContent目前支持如下类型: Batched3DModel3DTileContent Instanc ...
- R处理大数据集
R会把所有的对象读存入虚拟内存中.对我们大多数用户来说,这种设计可以提高与R相互的速度,但是当分析大数据集时,这种设计会降低程序运行速度有时还会产生跟内存相关的错误. 内存限制主要取决于R的build ...
- windows修改Host后未生效。
打开CMD命令,输入ipconfig /flushdns即可