AOP (面向切面编程)

软件由多个独立的模块组成,但有些功能分布于各个模块之中,比如记日志,这些功能叫做“横切关注点”,cross-cutting concerns。面向切面编程的目的就是——将横切关注点与模块的业务逻辑相分离。

概念

通知,advice

切面要做的事情称作通知。五种类型的通知:
before:在方法运行之前。
after:在方法运行之后,无论方法运行是否成功。
after-returning:在方法成功运行之后通知。
after-throwwing:在方法运行期间抛出异常时通知。
around::类似于jsp的Filter,切点的执行由around()方法调用。

切点,pointCut
切点定义了通知发生在何处。

切面,aspect
切面是“通知”和“切点”的结合。

AOP工具
有三大框架——AspectJ、JBossAOP、SpringAOP。通常用AspectJ。

常用类

org.aspectj.lang.ProceedingJoinPoint
实现around通知的方法的形参。
org.aspectj.lang.ProceedingJoinPoint.proceed()
调用切点方法,类似于jsp的Filter的chain.doFilter(request, response)。

例子

演员表演前观众要入席,表演后观众要鼓掌。

App.java

package com.likeyichu.aop;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
	@SuppressWarnings("resource")
	public static void main(String[] args)
	{
		ApplicationContext ctx ;
		ctx=new ClassPathXmlApplicationContext("com/likeyichu/aop/beans.xml");
		Performer performer=ctx.getBean("performer", Performer.class);
		performer.perform();

	}
}
/*the audience is taking seats
the performer is performing
clap clap
*/

Performer.java

package com.likeyichu.aop;

public class Performer{
	public void perform(){
		System.out.println("the performer is performing");
	}
}

Audience.java

package com.likeyichu.aop;

public class Audience {
	//表演之前要坐下
	public void takeSeats(){
		System.out.println("the audience is taking seats");
	}
	//表演成功,故障
	public void applause(){
		System.out.println("clap clap ");
	}
	//若表演失败 需要喝倒彩
	public void boo(){
		System.out.println("boo boo ");
	}
}

beans.xml

<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	 xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-4.0.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"  >
	<bean id="performer" class="com.likeyichu.aop.Performer"/>
	<bean id="audience" class="com.likeyichu.aop.Audience"/>
 <aop:config>
	<aop:aspect ref="audience">
		<aop:pointcut id="performance" expression="execution (* com.likeyichu.aop.Performer.perform(..))"/>
		<aop:before pointcut-ref="performance" method="takeSeats"/>
		<aop:after-returning pointcut-ref="performance" method="applause"/>
		<aop:after-throwing pointcut-ref="performance" method="boo"/>
	</aop:aspect>
</aop:config>
</beans>

maven依赖

<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
		<version>4.1.6.RELEASE</version>
	</dependency>
	<dependency>
			<groupId>org.aspectj</groupId>
		<artifactId>aspectjweaver</artifactId>
		<version>1.6.11</version>
	</dependency>
</dependencies>
时间: 2024-08-02 04:53:52

AOP (面向切面编程)的相关文章

spring aop面向切面编程:如何来做一个强大的日志记录功能

这个东西怎么做:spring aop 面向切面编程 如何来做一个强大的日志记录功能模板; 昨天经理把这个任务交给我,让我为公司现在的项目加上一个详细的日志记录功能模板,对所有的操作,至少是增删改运作进行一个记录,其要记录操作者,以及执行的方法,IP,以及操作的方法的参数. 我以前做过类似的功能,不过是在filter里做的,通过filter来检查action请求,记录请求中的参数及action名字.但是今天公司这个是要求用spring aop来做,这样就可以在spring里对要进行的日志记录方法进

Javascript aop(面向切面编程)之around(环绕)分析

  这篇文章主要介绍了Javascript aop(面向切面编程)之around(环绕) ,需要的朋友可以参考下 Aop又叫面向切面编程,其中"通知"是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被严重忽视的技术点.但是利用aop可以有效的改善js代码逻辑,比如前端框架dojo和yui3中AOP则被提升至自定义事件的一种内在机制,在源码中随处可见.得益于这种抽象使得doj

yui3的AOP(面向切面编程)和OOP(面向对象编程)

  这篇文章主要介绍了yui3的AOP(面向切面编程)和OOP(面向对象编程),需要的朋友可以参考下 首先请把手放胸前成沉思状:我上了生活,还是被生活上了自己? 没想出答案把,恩,可以读下文了.从语义角度讲,同一事物的不同表述可以反映人的主观视角的不同,从哲学角度将,世界观影响方法论,我们看事物的角度不同,有时会得出截然相悖的结论,从而会影响我们的做事方式和行为准则,现实生活如此,在丰富多彩的编程语言中更是如此,编程模式充满了对现实世界的各种模拟,包括是面向过程,面向对象,还有面向切面.我们大概

Java实现AOP面向切面编程的实例教程_java

介绍 众所周知,AOP(面向切面编程)是Spring框架的特色功能之一.通过设置横切关注点(cross cutting concerns),AOP提供了极高的扩展性.那AOP在Spring中是怎样运作的呢?当你只能使用core java,却需要AOP技术时,这个问题的解答变得极为关键.不仅如此,在高级技术岗位的面试中,此类问题也常作为考题出现.这不,我的朋友最近参加了一个面试,就被问到了这样一个棘手的问题--如何在不使用Spring及相关库,只用core Java的条件下实现AOP.因此,我将在

Javascript aop(面向切面编程)之around(环绕)

Aop又叫面向切面编程,其中"通知"是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被严重忽视的技术点.但是利用aop可以有效的改善js代码逻辑,比如前端框架dojo和yui3中AOP则被提升至自定义事件的一种内在机制,在源码中随处可见.得益于这种抽象使得dojo的自定义事件异常强大和灵活.dojo中aop的实现在dojo/aspect模块中,主要有三个方法:before.

yui3的AOP(面向切面编程)和OOP(面向对象编程)_YUI.Ext相关

首先请把手放胸前成沉思状:我上了生活,还是被生活上了自己? 没想出答案把,恩,可以读下文了.从语义角度讲,同一事物的不同表述可以反映人的主观视角的不同,从哲学角度将,世界观影响方法论,我们看事物的角度不同,有时会得出截然相悖的结论,从而会影响我们的做事方式和行为准则,现实生活如此,在丰富多彩的编程语言中更是如此,编程模式充满了对现实世界的各种模拟,包括是面向过程,面向对象,还有面向切面.我们大概已经非常熟悉面向过程和面向对象,切面的英文是Aspects(有时译作方面,我感觉用切面更能贴切的表达A

Javascript aop(面向切面编程)之around(环绕)分析_javascript技巧

Aop又叫面向切面编程,其中"通知"是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被严重忽视的技术点.但是利用aop可以有效的改善js代码逻辑,比如前端框架dojo和yui3中AOP则被提升至自定义事件的一种内在机制,在源码中随处可见.得益于这种抽象使得dojo的自定义事件异常强大和灵活.dojo中aop的实现在dojo/aspect模块中,主要有三个方法:before.

MVC AOP面向切面编程简单介绍及实例_java

MVC AOP面向切面编程 AOP这个词相信大家都没有接触太多过,但是实际上你们已经有所接触了,就在设计模式中.AOP所用的思想其实和设计模式是一样的,即在不修改原代码的情况下统一增加或者修改功能.还有,AOP大多用在spring里面,但是本文所写的只是在MVC中的应用,要注意. 一.简介         所谓AOP(Aspect Oriented Programming的缩写)意为面向切面的编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中

Guice框架-AOP(@面向切面编程)

2.AOP 面向切面编程 2.1 AOP入门 在前面的章节主要讲Guice的依赖注入,有了依赖注入的基础后我们再来看Guice的AOP.我们先从一个例子入手,深入浅出的去理解Guice的AOP的原理和实现. 首先我们定义服务Service,这个服务有一个简单的方法sayHello,当然了我们有一个服务的默认实现ServiceImpl,然后使用@ImplementedBy将服务和默认实现关联起来,同时将服务的实现标注为单例模式. 1 @ImplementedBy(ServiceImpl.class

在.NET项目中使用PostSharp,实现AOP面向切面编程处理

PostSharp是一种Aspect Oriented Programming 面向切面(或面向方面)的组件框架,适用在.NET开发中,本篇主要介绍Postsharp在.NET开发中的相关知识,以及一些如日志.缓存.事务处理.异常处理等常用的切面处理操作. AOP(Aspect-Oriented Programming)是一种将函数的辅助性功能与业务逻辑相分离的编程泛型(programming paradigm),其目的是将横切关注点(cross-cutting concerns)分离出来,使得