(1)Spring AOP的简单应用:

AOP 主要应用场景有:

1. Authentication 权限

2. Caching 缓存

3. Context passing 内容传递

4. Error handling 错误处理

5. Lazy loading 懒加载

6. Debugging 调试

7. logging, tracing, profiling and monitoring 记录跟踪 优化 校准

8. Performance optimization 性能优化

9. Persistence 持久化

10. Resource pooling 资源池

11. Synchronization 同步

12. Transactions 事务

-->AOP:(Aspect Orinted Programming)面向切面编程,用于具有横切逻辑的场合,如:访问控制,事务管理,性能检测,由切入点和增强处理组成。

AOP主要核心是:在什么位置(pointcut:切入点)执行什么功能(advice:增强处理),AOP在Java里是利用反射机制实现,

关键词:
-->Aspect(切面):一个模块化的横切逻辑,类似于 Java 中的类声明。
-->Join Point(连接点):原程序执行过程中的某一个点,构造方法调用,字段的设置和获取,方法的调用,方法的执行,异常的处理执行,类的初始化。比如方法1-->方法2-->方法3,此时方法2可以称作一个连接点

-->Advice(增强处理):在连接点上执行的代码逻辑,Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。eg:在2的前后加上日志输出
-->Pointcut(切入点):对连接点的描述,即匹配的条件,它定义了相应的 Advice 将要发生的地方,eg:假如符合2连接点的某一个特征,执行增强程序
-->Target Object(目标对象):被切面增强的对象
-->Weaving(织入):执行增强处理程序的过程

xml文件配置实现方式:

 <!-- 注解方式配置事物 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<bean class="com.one.ssm.impl.aopTest.UserServiceLogger" />
<aop:aspectj-autoproxy/>
注意:需要在配置文件中加入<aop:aspectj-autoproxy/>就可以启用对@AspectJ注解的支持
<!--Aop配置实例-->
<bean id="thLogger" class="com.one.ssm.impl.aopTest.UserServiceLogger"></bean>
<aop:config>
<aop:pointcut id="pointcut" expression="execution(public void *(..))"></aop:pointcut>
<aop:aspect ref="thLogger">
<!--前置增强-->
<aop:before method="before" pointcut-ref="pointcut"/>
<!--后置增强-->
<aop:after-returning returning="result" method="afterRunning" pointcut-ref="pointcut"/>
<!--异常抛出增强-->
<aop:after-throwing method="afterThrowing" pointcut-ref="pointcut" throwing="e"/>
<!--实现最终增强,无论如何都要执行,相当于finally-->
<aop:after method="afterLogger" pointcut-ref="pointcut"/>
<!--实现环绕增强,通过方法名为ProceedingJoinPoint类型的参数获取连接点的信息
她的proceed()方法可以调用真正的目标方法,实现对连接点的完全控制-->
<aop:around method="aroundLogger" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>

xml配置方式

注解实现方式:

 @Aspect //将UserServiceLogger 定义为切面
public class UserServiceLogger {
private static final Logger log=Logger.getLogger("UserServiceLogger.class"); @Before("excution(*service.UserService.*(..))")//将before()方法定义为前置增强
public void before(JoinPoint jp){
log.info("前置增强:调用"+jp.getSignature().getName().toString()+"的方法执行," +
"方法入参:"+Arrays.toString(jp.getArgs()));
}
@ afterRunning("excution(*service.UserService.*(..))" returning =result) //代表将afterRunning()方法定义为后置增强
public void afterRunning(JoinPoint jp,Object result){
log.info("后置增强"+jp.getSignature().getName().toString()+"的方法执行"+
"方法入参:"+Arrays.toString(jp.getArgs()));
}
//异常抛出增强
public void afterThrowing(JoinPoint jp,RuntimeException e){
log.info(jp.getSignature().getName().toString()+"方法异常为:"+e);
}
//最终增强
public void afterLogger(JoinPoint jp){
log.info(jp.getSignature().getName().toString()+"方法结束执行。"+
"方法入参:"+Arrays.toString(jp.getArgs()));
}
//环绕增强
public Object aroundLogger(ProceedingJoinPoint jp) throws Throwable {
log.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName().toString()+"方法。方法入参:"
+ Arrays.toString(jp.getArgs()));
try {
//执行目标方法并获得返回值
Object result=jp.proceed();
log.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName().toString()+result);
return result;
} catch (Throwable e) {
log.info(jp.getSignature().getName().toString()+"方法发生异常"+e);
throw e;
}finally {
log.info(jp.getSignature().getName().toString()+"方法结束执行");
}

java代码实现

(2)execution表达式实例与概念说明

execution()        表达式的主体;
第一个”*“符号         表示返回值的类型任意;
包名后面的”..“          表示当前包及子包
第二个”*“ 表示类名     表示所有类。
.*(..) 表示任何方法名,   括号表示参数,两个点表示任何参数类型
基本语法格式为:
execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)  除了返回类型模式、方法名模式和参数模式外,其它项都是可选的。

execution(public * *(..)):任意公共方法的执行

execution(* *To(..)):匹配目标类所有以To为后缀的方法

execution(* com.xyz.service.AccountService.*(..)) :定义在service包里的任意方法的执行

execution(* com.xyz.service.*.*(..))   :定义在service包和所有子包里的任意类的任意方法的执行:

execution(* com..*.*Dao.find*(..)) :匹配包名前缀为com的任何包下类名后缀为Dao的方法,方法名必须以find为前缀

execution(* joke(String,..))):匹配目标类中的joke()方法,该方法第 一个入参为String,后面可以有任意个入参且入参类型不限,如joke(String s1)、joke(String s1,String s2)和joke(String s1,double d2,Strings3)都匹配

l其他相关AOP链接:https://segmentfault.com/a/1190000007469968

以上内容个人学习所得,仅供参考!!!

SpringAOP的xml实例、注解形式实例、概念理解 以及execution表达式实例与概念说明的更多相关文章

  1. hibernate中.hbm.xml和注解方式自动生成数据表的简单实例(由新手小白编写,仅适用新手小白)

    绝逼新手小白,so 请大神指点! 如果真的错的太多,错的太离谱,错的误导了其他小伙伴,还望大神请勿喷,大神请担待,大神请高抬贵嘴......谢谢. 好了,正题 刚接触ssh,今天在搞使用.hbm.xm ...

  2. mybatis学习一:基于xml与注解配置入门实例与问题

    注:本case参考自:http://www.cnblogs.com/ysocean/p/7277545.html 一:Mybatis的介绍: MyBatis 本是apache的一个开源项目iBatis ...

  3. Spring 通过XML配置文件以及通过注解形式来AOP 来实现前置,环绕,异常通知,返回后通知,后通知

    本节主要内容: 一.Spring 通过XML配置文件形式来AOP 来实现前置,环绕,异常通知     1. Spring AOP  前置通知 XML配置使用案例     2. Spring AOP   ...

  4. springAop:Aop(Xml)配置,Aop注解配置,spring_Aop综合案例,Aop底层原理分析

    知识点梳理 课堂讲义 0)回顾Spring体系结构 Spring的两个核心:IoC和AOP 1)AOP简介 1.1)OOP开发思路 OOP规定程序开发以类为模型,一切围绕对象进行,OOP中完成某个任务 ...

  5. 基础概念:Oracle数据库、实例、用户、表空间、表之间的关系

    基础概念:Oracle数据库.实例.用户.表空间.表之间的关系 数据库: Oracle数据库是数据的物理存储.这就包括(数据文件ORA或者DBF.控制文件.联机日志.参数文件).其实Oracle数据库 ...

  6. spring面向切面编程示例(xml配置形式vs@注解形式)

    一.xml配置形式 1.在Spring配置文件中增加面向切面配置当调用com.activemq.service.impl.ConsumerServiceImpl接口实现类的任意方法时执行切面类中的方法 ...

  7. kubernetes1.9管中窥豹-CRD概念、使用场景及实例

    欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 默认读者有kubernetes基础概念的背景知识,因此基础概念例如有状态.pod.Replica Sets.Deployments.state ...

  8. 【Spring】Spring中的Bean - 5、Bean的装配方式(XML、注解(Annotation)、自动装配)

    Bean的装配方式 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 文章目录 Bean的装配方式 基于XML的装配 基于注解 ...

  9. 三。Hibernate 注解形式

    Hibernate支持JPA注解的jar包 JPA全称: Java Persistence API JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现. ...

随机推荐

  1. c语言中对于移位运算符的用法

    //1 << 0 是把1 按2进制 左移0位,结果还是 1 ,2进制 0000 0001 //1 << 1, 是把1 按2进制 左移1位,结果是2,2进制 0000 0010 ...

  2. 关于 RESTful API 中 HTTP 状态码的定义

    最近正好使用了一会儿 Koa ,在这说一下自己对各个 请求码的见解和使用场景,懒人直接看 200.400.401.403.404.500 就可以了. 其中 2XX/3XX 其实都是请求成功,但是结果不 ...

  3. Nginx实现负载均衡的简单案例

    七层负载均衡的实现(Nginx): 基于URL等应用层信息的负载均衡,一般使用Nginx来实现 Nginx的proxy是它一个很强大的功能,实现了7层负载均衡 功能强大.性能卓越.运行稳定 配置简单灵 ...

  4. liunx安装py.27

    liunx安装py.27 按网站(https://blog.csdn.net/u012071918/article/details/78817344) 上的教程安装py.27 1.安装依赖的库 在终端 ...

  5. Windows 系统快速查看文件MD5

    关键 ·打开命令窗口(Win+R),然后输入cmd ·输入命令certutil -hashfile 文件绝对路径 MD5 快速获取文件绝对路径 ·找到文件,右键属性 注意 ·在Win7上,MD5不要使 ...

  6. python类与对象-如何派生内置不可变类型并修其改实例化行为

    如何派生内置不可变类型并修其改实例化行为 问题举例 自定义一种新类型的元组,对传入的可迭代对象,我们只保留 其中int类型且值大于0的元素,例如 IntTuple([1, -1, 'abc', 6, ...

  7. 让我怀疑人生的bug集合

    bug1:一个人人都知道全局变量易污染,但是我就是污染不了的问题 解决:刚开始动用了session来存这个值,后来觉得太小题大做了,最后使用了闭包来解决,第一个function结束后开启第二个,起初没 ...

  8. 排序之冒泡排序(bubblesort)

    package com.pailian; /* * 冒泡排序 * 比较相邻的俩位数,这样每轮比较都会出现一个最大值或最小值 * 下一轮比较就会减少一次(因为已经知道了一个最大值或最小值) * 注意根据 ...

  9. centos上发布部署python的tornado网站项目完整流程

    先说下大体上的做法,开发环境上要新弄一个 virtualenv的环境,在这个里面放你的开发调试,当然这个其实也不是必须的,但是这样会方便管理一些. 再在centos上也弄一个 virtualenv虚拟 ...

  10. 记录心得-shiro框架demo示例

    从懵懂到了解,再到熟悉,是一个进步的过程! 先撸代码,跑起来看效果,再做详细的介绍,开始干活! 1,先列出工程目录结构,自己需要创建对应层级的程序和相关配置文件. 2,导入maven依赖的jar包.打 ...