AOP 概念 原理及代码实现

 

AOP技术,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。例如,给用户管理类中的每个方法前都加一个验证,那么这个验证就是一个切面,也就是一个方面。

AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。

使用“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。正如Avanade公司的高级方案构架师Adam Magee所说,AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。”

实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。然而殊途同归,实现AOP的技术特性却是相同的,分别为:

? Cross Cutting Concern

– 是一种独立服务,它会遍布在系统的处理流程之中

? Aspect

– 对横切性关注点的模块化

? Advice

– 对横切性关注点的具体实现

? Pointcut

– 它定义了Advice应用到哪些JoinPoint上,对Spring来说是方法调用

? JoinPoint

– Advice在应用程序上执行的点或时机,Spring只支持方法的JoinPoint,这个点也可以使属性修改,如:Aspecj可以支持

? Weave

– 将Advice应用到Target Object上的过程叫织入,Spring支持的是动态织入

? Target Object

– Advice被应用的对象

? Proxy

– Spring AOP默认使用JDK的动态代理,它的代理是运行时创建,也可以使用CGLIB代理

? Introduction

– 可以动态的为类添加方法

实现Spring对AOP的支持可以采用Annotation的方式,也可以采用配置文件的方式。代码示例如下:

接口

public interface UserManager {

public void addUser(String userName, String password);

public void delUser(String userId);

}

实现类:

public class UserManagerImp implements UserManager {

public void addUser(String userName, String password) {

System.out.println(“——–UserManager.addUser()——“);

}

public void delUser(String userId) {

System.out.println(“——–UserManager.delUser()——“);

}

}

// Advice

public class SecurityHandler {

public void checkSecurity() {

System.out.println(“—–checkSecurity—-“);

}

}

客户端

public class Client {

public static void main(String[] args) {

//读取配置文件,获得Beanfactory

BeanFactory factory = new ClassPathXmlApplicationContext(“applicationContext.xml”);

//利用反射机制,实例化UserManager

UserManager userManager = (UserManager)factory.getBean(“userManager”);

userManager.addUser(“zhang san “, “123”);

}

}

在applicationContext.xml文件中加入:

<beanid=”userManager”class=”spring.UserManagerImp”></bean>

<beanid=”securityHandler”class=”spring.SecurityHandler”></bean>

<aop:config>

<aop:aspectid=”securityAspect”ref=”securityHandler”>

<!– 所有add和del开头的方法适用 –>

<aop:pointcutid=”pointcut”expression=”execution(* spring.*.add*(..)) || execution(* spring.*.del*(..))”/>

<aop:beforemethod=”checkSecurity()”pointcut-ref=”pointcut”/>

</aop:aspect>

</aop:config>

参考网址:

http://www.cnblogs.com/zhugenqiang/archive/2008/07/27/1252761.html

    原文作者:AOP
    原文地址: https://blog.csdn.net/sundenskyqq/article/details/6643030
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞