在SpringAOP开发之前,首先要了解一下这几个概念。Target:目标,通俗的说对哪个类做增强,那个类就是目标。JoinPoint:连接点,在实际开发中可以被增强的点。PointCut:切入点,在实际开发中真正被增强了的点称为PointCut ,对连接点进行拦截的定义。Advice:通知,在拦截到连接点之后,执行的代码,该通知分为前置,后置,环绕,异常,最终。Weaving:织入,把通知加入到连接点的过程。Proxy:代理,增强之后的对象就称为代理。Introduction:引介,指的是类层面的增强,不需要掌握。Aspect:切面,多个advince和pointCut的组合。下面来着重介绍advince在开发中的运用。在运用之前首先开启aspectj代理(注解开发),如果对以下实体类做增强,如下(接口):

public interface CustomDao {

    public void save();//增

    public Integer delete();//删

    public void update();//改

    public void list();//查

}

实现的类:

@Repository("customDao")
public class CustomDaoImpl implements CustomDao { public void save() {
System.out.println("持久层:保存");
} public Integer delete() {
System.out.println("持久层:删除");
return 100;
} public void update() {
System.out.println("持久层:更新");
} public void list() {
System.out.println("持久层:查询");
int i=100/0;
}
}

首先先来说说前置通知,顾名思义,就是,在方法之前执行的一串代码,这相当于一个拦截器的形式。后置通知跟前置通知类似,它是在目标方法执行之后执行,其注解为:@afterReturning,其中属性中value表示切入点表达式,returning属性指定返回值得名字,该方法形参的名字要与returning的值一致。环绕通知:其注解为:@Around,其属性value指定切入点表达式,但务必要给该方法增加一个形参ProceedingJoinPoint,表示正在执行的连接点(目标),也就是目标方法,joinpoint.proceed( ):表示调用目标方法。异常通知:其注解为:@afterThrowing,其属性value指定切入点表达式,通过throwing属性指定异常的名字,在该方法中增加一个形参,表示发生的的异常,形参的名字与throwing属性值一致。最终通知:其注解为:@After,其属性value指定切入点表达式。在这里,最终通知和后置通知的区别在于,不管异常与否,都执行,而后置通知,在异常时不执行。这些通知将会在切面类中:

@Component
@Aspect //该注解表示这类为切面类
public class MyAspectAnnotation { // 前置通知
@Before("execution(* com.cus.dao.impl.CustomDaoImpl.save(..))")
public void checkBefore(JoinPoint jp){
System.out.println("前置通知..."+jp);
} // 后置通知
@AfterReturning(value="execution(* com.cus.dao.impl.CustomDaoImpl.delete(..))",returning="result")
public void checkAfter(Object result){
System.out.println("后置通知..."+result);
} //环绕通知
@Around(value="execution(* com.cus.dao.impl.CustomDaoImpl.update(..))")
/*
* ProceedingJoinPoint:正在执行的连接点
* */
public Object checkAround(ProceedingJoinPoint pjp){
System.out.println("环绕通知first..."); Object result=null; try {
result = pjp.proceed(); //调用目标的方法
} catch (Throwable e) {
e.printStackTrace();
} System.out.println("环绕通知last..."+result);
return result;
} // 异常通知
@AfterThrowing(value="execution(* com.cus.dao.impl.CustomDaoImpl.list(..))",throwing="ex")
public void checkException(Exception ex){
System.out.println("这是异常通知..."+ex.getMessage());
} // 最终通知
@After(value="execution(* com.cus.dao.impl.CustomDaoImpl.list(..))")
public void checkFinal(){
System.out.println("最终通知");
}
}

整合Spingjunit测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestDemo { @Autowired
private CustomDao customDao; @Test
public void test() { // customDao.save(); // customDao.delete(); // customDao.update(); customDao.list();
}
}

Spring核心技术AOP案例的更多相关文章

  1. Spring核心技术AOP实现原理

    关于Spring的AOP也是Spring的非常重要的一项技术.大致上可以这样说,面向切面编程,它的出现说明可以在不修改代码的情况下实现对功能的增强.而增强就是给一个方法增加一些功能.AOP主要思想就是 ...

  2. 3、Spring的AOP详解和案例

    AOP(Aspect Oriented Programming),即面向切面编程. 1.OOP回顾 在介绍AOP之前先来回顾一下大家都比较熟悉的OOP(Object Oriented Programm ...

  3. Spring 中AOP及前后置增强案例

    1.AOP面向切面编程 面向切面编程的本质:面向切面编程,指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来.  1主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等.  2主要意 ...

  4. Spring第二次案例和AOP

    Spring加上AOP com.mapper.entity.UserInfo package com.Spring.entity; public class UserInfo { private In ...

  5. 咋滴,不就是面试总考Spring的AOP吗,办它!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么,你的代码总是糊到猪圈上? 怎么办,知道你在互联网,不知道你在哪个大厂.知道你 ...

  6. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  7. Spring中AOP简介与切面编程的使用

    Spring中AOP简介与使用 什么是AOP? Aspect Oriented Programming(AOP),多译作 "面向切面编程",也就是说,对一段程序,从侧面插入,进行操 ...

  8. Spring【AOP模块】就是这么简单

    前言 到目前为止,已经简单学习了Spring的Core模块.....于是我们就开启了Spring的AOP模块了...在讲解AOP模块之前,首先我们来讲解一下cglib代理.以及怎么手动实现AOP编程 ...

  9. Java基础-SSM之Spring和Mybatis以及Spring MVC整合案例

    Java基础-SSM之Spring和Mybatis以及Spring MVC整合案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 能看到这篇文章的小伙伴,详细你已经有一定的Java ...

随机推荐

  1. http协议----->http请求方式,post,get

    4.http请求方式有七种(http请求是想web资源请求数据) Post get head options delete trace put 常用:GET POST POST例如form表单提交,G ...

  2. Accuracy, Precision, Resolution & Sensitivity

    Instrument manufacturers usually supply specifications for their equipment that define its accuracy, ...

  3. [译]关于JavaScript 作用域你想知道的一切

    原文连接 在学习js的过程对闭包什么的,理解不好,偶然搜到这篇文章.豁然开朗,随翻译. Javacript 中有一系列作用域的概念.对于新的JS的开发人员无法理解这些概念,甚至一些经验丰富的开发者也未 ...

  4. 剑指Offer——数字在排序数组中出现的次数

    题目描述: 统计一个数字在排序数组中出现的次数. 分析: 二分变形.二分查找最左边和最右边k的位置,然后相减加一就是结果. 代码: class Solution { public: int GetNu ...

  5. CF#301 C:Ice Cave(简单BFS)

    C:Ice Cave 有一个m*n的地图,里面包含'.'表示完整的冰块,'X'表示有裂痕的冰块,当游戏者到达完整的冰块时,这个位置的冰块会变成有裂痕的冰块,如果到达有裂痕的冰块时,游戏者会进入下一关 ...

  6. 漫谈JS 的继承方式

    一.原型链原型链的基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.每一个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的指针.如果:我们让 ...

  7. CDH部署日志

    CDH部署时出现如图所示的错误 可去服务器查看:/opt/cm-5.5.0/run/cloudera-scm-agent/process/ccdeploy_hbase-conf_etchbasecon ...

  8. nsq里面WaitGroups两种实用的用法

    看过好几遍了,觉得挺实用的,记录备忘一下. 1.开启很多个 goroutine 之后,等待执行完毕 type WaitGroupWrapper struct { sync.WaitGroup } fu ...

  9. redis之数据操作详解

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  10. PHP计算经纬度之间的距离

    <?php /** * 求两个已知经纬度之间的距离,单位为米 * * @param lng1 $ ,lng2 经度 * @param lat1 $ ,lat2 纬度 * @return floa ...