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应用的更多相关文章

  1. Spring中的AOP

    什么是AOP? (以下内容来自百度百科) 面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种 ...

  2. Spring中关于AOP的实践之概念

    一.什么是AOP AOP:也称作面向切面编程 在分享几个概念执行我想先举个栗子(可能例子举得并不是特别恰当): 1.假如路人A走在大街上,被一群坏人绑架了: 2.警察叔叔接到报警迅速展开行动:收集情报 ...

  3. Spring中的AOP 专题

    Caused by: java.lang.IllegalArgumentException: ProceedingJoinPoint is only supported for around advi ...

  4. spring中的AOP 以及各种通知 配置

    理解了前面动态代理对象的原理之后,其实还是有很多不足之处,因为如果在项目中有20多个类,每个类有100多个方法都需要判断是不是要开事务,那么方法调用那里会相当麻烦. spring中的AOP很好地解决了 ...

  5. Spring学习笔记(四)—— Spring中的AOP

    一.AOP概述 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.O ...

  6. 2018.12.24 Spring中的aop演示(也就是运用aop技术实现代理模式)

    Aop的最大意义是:在不改变原来代码的前提下,也不对源代码做任何协议接口要求.而实现了类似插件的方式,来修改源代码,给源代码插入新的执行代码. 1.spring中的aop演示 aop:面向方面编程.不 ...

  7. JavaWeb_(Spring框架)认识Spring中的aop

    1.aop思想介绍(面向切面编程):将纵向重复代码,横向抽取解决,简称:横切 2.Spring中的aop:无需我们自己写动态代理的代码,spring可以将容器中管理对象生成动态代理对象,前提是我们对他 ...

  8. (五)Spring 中的 aop

    目录 文章目录 AOP概念 AOP原理 AOP术语 **`Spring`** 中的 **`aop`** 的操作 使用 `AspectJ` 实现 `aop` 的两种方式 AOP概念 浅理解 aop :面 ...

  9. Spring 中基于 AOP 的 @AspectJ

    Spring 中基于 AOP 的 @AspectJ @AspectJ 作为通过 Java 5 注释注释的普通的 Java 类,它指的是声明 aspects 的一种风格. 通过在你的基于架构的 XML ...

  10. Spring 中基于 AOP 的 XML架构

    Spring 中基于 AOP 的 XML架构 为了使用 aop 命名空间标签,你需要导入 spring-aop j架构,如下所述: <?xml version="1.0" e ...

随机推荐

  1. Oracle数据库查询语句

    编写以下查询的SQL语句,以scott用户的emp表和dept表作为查询数据: 1.列出至少有一个员工的所有部门. SQL语句: select * from SCOTT.DEPT where dept ...

  2. C++ string::size_type 类型【转】

    int main() { string str("Hello World!\n"); cout << "The size of " << ...

  3. TKinter之菜单

    菜单的分类也较多,通常可以分为下拉菜单.弹出菜单. 1.使用Menu类创建一个菜单 2.add_command添加菜单项,如果该菜单是顶层菜单,则添加的菜单项依次向右添加. 如果该菜单时顶层菜单的一个 ...

  4. oracle 自定义异常处理

    --第一种方式:使用raise_application_error抛出自定义异常declare i number:=-1;begin if i=-1 then raise_application_er ...

  5. HDP2.4安装(四):ambari安装

    ambari是apache基金会的开源项目,它的优势在于巧妙溶合已有的开源软件,提供集群自动化安装.中心化管理.集群监控.报警等功能.据Hortonwork官方资料介绍,不同的HDP版本,对ambar ...

  6. 屏幕取色工具推荐 ColorPix

    很好用的一个屏幕取色工具,方便套页面时,在图片上取色. 用鼠标指到取色未知,按CTRL+C,就可复制16进制的颜色值. 下载地址:http://files.cnblogs.com/zjfree/Col ...

  7. github 添加 C# IGNORE

    在创建仓库时选择 VisualStudio 即可.

  8. 关于iis站点无法读取 服务器共享目录的问题

    也是权限问题,具体解决方法如下: 1. 找到该站点所在的应用程序池>>高级设置>>进程模型>>设置标志账号,如下图所示 2. 设置账号之后,找到该共享目录>& ...

  9. FIR系统的递归与非递归实现

    首先,因为FIR的脉冲响应是有限长,所以总是可以非递归实现的: 其次,也可以用递归系统来实现它. 以滑动平均做例子,最直观的想法就是,每次来一个新的值,丢掉最老的,加上最新的: y[n]=y[n-1] ...

  10. php require和include区别

    require的使用方法如:require("myfile.php"),这个语句通常放在PHP脚本程序的最前面.PHP程序在执行前,就会先读入require()语句所引入的文件,使 ...