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 ...
随机推荐
- Oracle数据库查询语句
编写以下查询的SQL语句,以scott用户的emp表和dept表作为查询数据: 1.列出至少有一个员工的所有部门. SQL语句: select * from SCOTT.DEPT where dept ...
- C++ string::size_type 类型【转】
int main() { string str("Hello World!\n"); cout << "The size of " << ...
- TKinter之菜单
菜单的分类也较多,通常可以分为下拉菜单.弹出菜单. 1.使用Menu类创建一个菜单 2.add_command添加菜单项,如果该菜单是顶层菜单,则添加的菜单项依次向右添加. 如果该菜单时顶层菜单的一个 ...
- oracle 自定义异常处理
--第一种方式:使用raise_application_error抛出自定义异常declare i number:=-1;begin if i=-1 then raise_application_er ...
- HDP2.4安装(四):ambari安装
ambari是apache基金会的开源项目,它的优势在于巧妙溶合已有的开源软件,提供集群自动化安装.中心化管理.集群监控.报警等功能.据Hortonwork官方资料介绍,不同的HDP版本,对ambar ...
- 屏幕取色工具推荐 ColorPix
很好用的一个屏幕取色工具,方便套页面时,在图片上取色. 用鼠标指到取色未知,按CTRL+C,就可复制16进制的颜色值. 下载地址:http://files.cnblogs.com/zjfree/Col ...
- github 添加 C# IGNORE
在创建仓库时选择 VisualStudio 即可.
- 关于iis站点无法读取 服务器共享目录的问题
也是权限问题,具体解决方法如下: 1. 找到该站点所在的应用程序池>>高级设置>>进程模型>>设置标志账号,如下图所示 2. 设置账号之后,找到该共享目录>& ...
- FIR系统的递归与非递归实现
首先,因为FIR的脉冲响应是有限长,所以总是可以非递归实现的: 其次,也可以用递归系统来实现它. 以滑动平均做例子,最直观的想法就是,每次来一个新的值,丢掉最老的,加上最新的: y[n]=y[n-1] ...
- php require和include区别
require的使用方法如:require("myfile.php"),这个语句通常放在PHP脚本程序的最前面.PHP程序在执行前,就会先读入require()语句所引入的文件,使 ...