Spring中的AOP应用
AOP被称为面向切面编程,AOP中的几个重要概念是:
1。切面。切面就是要实现的功能。切面通常是在多数方法中会用到的相同功能,如写日志。
2。连接点。连接点就是应用程序执行过程中插入切面的地点。如:方法的调用,异常的抛出。
3。通知。通知就是某个切入点要执行的代码,Spring中有四种通知类型:环绕通知(around),前置通知,后置通知和异常通知。
4。切入点。切入点定义了通知应该应用在那些连接点上。
5。引入。引入允许你为已存在的类添加新方法和属性。
6。目标对象。目标对象就是被通知的对象。
7。代理。将通知应用到目标对象后创建的对象。
8。织入。织入就是将切面应用到目标对象从而创建一个新的代理对象的过程。
接下来,我们看看Spring中的四种通知的用法。
1。前置通知。就是在目标对象执行前执行的通知。
实现前置通知只需要实现MethodBeforeAdvice接口,并且实现它的public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable就可以了,在方法中编写需要执行的逻辑,其中arg0表示当前调用的方法,arg1表示的是该方法中传递的参数,arg2表示调用该方法的对象。通知写好后,需要在applicationContext.xml文件中告知应用通知的目标对象是谁。
首先将目标对象和通知都注入到Spring容器中:
<bean id="cat" class="com.lovo.bean.CatBean">
<property name="msg">
<value>鱼</value>
</property>
</bean> <bean id="myAdvice" class="com.lovo.advise.TestAdvice"></bean>
然后使用拦截器实现对目标对象的那些行为进行拦截,即定义切入点:
<bean id="myInteceptor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="myAdvice"></property>
<property name="pattern" value="com.lovo.bean.(CatBean|DogBean).*"></property>
</bean>
上面使用的是正则表达式来验证切入点,即CatBean和DogBean的所有方法在调用时都将被拦截器拦截,并且先执行通知里面的代码,然后再执行我们的调用的方法。
最后还要使用代理来创建代理对象:
<bean id="superBean" class="org.springframework.aop.framework.ProxyFactoryBean" abstract="true">
<property name="interceptorNames">
<list>
<value>myInteceptor</value>
</list>
</property>
</bean>
<bean id="superDog" parent="superBean">
<property name="target" ref="dog">
</property>
</bean>
SuperDog就是由代理创建的代理对象,如果要常见DogBean对象,就不需要new出来了,可以这样做:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
DogBean db = (DogBean)context.getBean("superDog");
实现环绕通知只需实现MethodInterceptor接口,并实现public Object invoke(MethodInvocation arg0) throws Throwable方法即可,不过方法的实地执行就要由arg0.proceed()来执行了。也就是说实地方法的执行是在invoke方法里面执行的。
实现后置通知只需实现AfterReturningAdvice接口,并实现public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable方法。后置通知会在方法执行后执行,可以得到方法执行后返回的结果。
异常通知只需实现ThrowsAdvice接口,并实现public void afterThrowing(Exception ex)方法,在方法执行过程中抛出异常时,会调用该方法。
可以根据需要选择一种或几种结合使用。
Spring中的AOP应用的更多相关文章
- Spring中的AOP
什么是AOP? (以下内容来自百度百科) 面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种 ...
- Spring中关于AOP的实践之概念
一.什么是AOP AOP:也称作面向切面编程 在分享几个概念执行我想先举个栗子(可能例子举得并不是特别恰当): 1.假如路人A走在大街上,被一群坏人绑架了: 2.警察叔叔接到报警迅速展开行动:收集情报 ...
- Spring中的AOP 专题
Caused by: java.lang.IllegalArgumentException: ProceedingJoinPoint is only supported for around advi ...
- spring中的AOP 以及各种通知 配置
理解了前面动态代理对象的原理之后,其实还是有很多不足之处,因为如果在项目中有20多个类,每个类有100多个方法都需要判断是不是要开事务,那么方法调用那里会相当麻烦. spring中的AOP很好地解决了 ...
- Spring学习笔记(四)—— Spring中的AOP
一.AOP概述 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.O ...
- 2018.12.24 Spring中的aop演示(也就是运用aop技术实现代理模式)
Aop的最大意义是:在不改变原来代码的前提下,也不对源代码做任何协议接口要求.而实现了类似插件的方式,来修改源代码,给源代码插入新的执行代码. 1.spring中的aop演示 aop:面向方面编程.不 ...
- JavaWeb_(Spring框架)认识Spring中的aop
1.aop思想介绍(面向切面编程):将纵向重复代码,横向抽取解决,简称:横切 2.Spring中的aop:无需我们自己写动态代理的代码,spring可以将容器中管理对象生成动态代理对象,前提是我们对他 ...
- (五)Spring 中的 aop
目录 文章目录 AOP概念 AOP原理 AOP术语 **`Spring`** 中的 **`aop`** 的操作 使用 `AspectJ` 实现 `aop` 的两种方式 AOP概念 浅理解 aop :面 ...
- Spring 中基于 AOP 的 @AspectJ
Spring 中基于 AOP 的 @AspectJ @AspectJ 作为通过 Java 5 注释注释的普通的 Java 类,它指的是声明 aspects 的一种风格. 通过在你的基于架构的 XML ...
- Spring 中基于 AOP 的 XML架构
Spring 中基于 AOP 的 XML架构 为了使用 aop 命名空间标签,你需要导入 spring-aop j架构,如下所述: <?xml version="1.0" e ...
随机推荐
- docker镜像、容器
第一部分:Docker镜像的基本知识 1.1 什么是Docker镜像 从整体的角度来讲,一个完整的Docker镜像可以支撑一个Docker容器的运行,在 Docker容器运行过程中主要提供文件系统视角 ...
- kmeans算法
# coding:utf-8 import numpy as np import matplotlib.pyplot as plt def dis(x, y): #计算距离 return np.sum ...
- 016. asp.net的验证控件
RequiredFileldValidator: 检查某个字段是否输入; 空值检查 主要属性: ControlToValidate:要验证的控件 ErrorMessage:错误提示信息 Compare ...
- linux服务之httpd
http://mirrors.cnnic.cn/apache/httpd/docs/ 英文pdf文档下载 Apache HTTP Project’s goal It is the Apache HTT ...
- wikioi 1474 十进制转m进制
/*===================================== 1474 十进制转m进制 题目描述 Description 将十进制数n转换成m进制数 m<=16 n<=1 ...
- java中的堆、栈、常量池以及String类型的两种声明
参考自http://blog.sina.com.cn/s/blog_798b04f90100ta67.html http://www.cnblogs.com/fguozhu/articles/2661 ...
- hibernate的工作原理
hibernate的工作原理1.Hibernate 的初始化.读取Hibernate 的配置信息-〉创建Session Factory1)创建Configeration类的实例.它的构造方法:将配置信 ...
- scanf与scanf_s
scanf的使用 使用scanf需要记住下面两条简单规则: 如果使用scanf来读取某种基本变量类型(%d,%c,%f,%lf)的值,请在变量名之前加上一个& 如果使用scanf把一个字符串( ...
- JavaScript判断字符串能否转化为数字
判断一个字符串能否转化为数字 我们常常使用parseInt函数. 不过该函数的适用范围是很小的. 一般说来对于 如下类似 var myStr = "123hello"; 使用par ...
- 【故障处理】ORA-12162: TNS:net service name is incorrectly specified
本文将给大家阐述一个因未设置系统环境变量ORACLE_SID导致ORA-12162错误的案例.希望大家有所思考. 1.获得有关ORA-12162报错信息的通用表述信息[oracle@asdlabdb0 ...