AOP面向切面

xiaoxiao2021-02-28  52

切面(Aspect)切面是一个关注点的模块化,如事务管理就是一个在JavaEE企业中应用最常见的界面。在企业应用编程中,首先需要通过分析,抽取出通用的功能,即“切面”。事务、日志、安全性的框架、权限都是切面连接点(Joinpoint)连接点是执行程序过程中的特定的点。Spring框架只支持方法作为连接点,如方法调用之前、方法调用后、或者发生异常时等。通知(Advice)通知就是切面的具体实现。通知将在切面的某个特定的连接点上执行动作,Spring中执行的动作往往就是调用某一个类的具体方法。例如:在保存订单的模块中,进行日志管理(一个切面),具体是在保存订单的方法执行之前(连接点)执行写日志(通知)的功能。其中,日志管理是很多模块中通用的功能,因此这就是一个切面,而具体是在保存订单之前执行日志保存,那么保存订单前这个点就是连接点,实现日志保存功能的类就是通知。就是切面中的方法。

切入点(Pointcut)切入点是连接点的集合,通知将在满足一个切入点表达式的所有连接点上运行。举例:在拦截器中,有一系列判断性的内容

1if(method.equals("savePerson")||method.equals("updatePerson") ||method.equals("deletePerson")){ ... }

满足了上面三个方法才能开启事务,这些判断条件就为切入点

引入(Introduction)引入的意思是在一个类中加入新的属性或者方法。目标对象(Target Object)被一个或多个切面所通知的对象成为目标对象。AOP代理(AOP Proxy)AOP代理是AOP框架所生成的对象,该对象是目标对象的代理对象。代理对象能够在目标对象的基础上,在相应的连接点上调用通知。织入(Weaving)把切面连接到其他的应用程序之上,创建一个被通知的对象的过程,被称为织入。

AOP两种实现模式

xml形式

举例说明如何在applicationContext.xml中配置AOP(因为当前只负责介绍AOP实现模式,因此配置环境需要的jar包先不介绍)

举例说明

创建接口personDAO和实现类personDaoImpl 123456public interface PersonDao { /** * 目标方法 */ public void savePerson();} 12345public class PersonDaoImpl implements PersonDao{ public void savePerson() { System.out.println("save person"); }}

事务处理类Transaction

123456789public class Transaction { public void beginTransaction(){ System.out.println("begin transaction"); } public void commit(){ System.out.println("commit"); }}

接下来最重要的就是AOP的配置文件,applicationContext.xml。通过配置AOP可以实现创建代理对象:代理对象的方法=目标方法+通知。将原本不相关的目标方法和通知结合起来。

123456789101112131415<bean id="personDao" class="cn.zju.spring.PersonDaoImpl"></bean><bean id="transaction" class="cn.zju.spring.Transaction"></bean> <aop:config><!-- 切入点表达式 确定目标类 id 标示--> <aop:pointcut expression="execution(* cn.zju.spring.PersonDaoImpl.*(..))" id="perform"/> <aop:aspect ref="transaction"> <!-- ref指向切面类 --> <aop:before method="beginTransaction" pointcut-ref="perform"/> <!--前置通知 --> <aop:after-returning method="commit" pointcut-ref="perform"/> <!--后置通知 --> </aop:aspect></aop:config>

客户端代码

12345public static void main(String[] args){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); PersonDao personDao = (PersonDao)context.getBean("personDao"); personDao.savePerson();}

实现原理

当启动Spring容器时,因为声明了两个bean,… 所以Spring容易会为这两个bean创建对象。当Spring解析到aop:config的时候,解析切入点表达式,让切入点表达式和Spring容器中的bean做匹配如果匹配成功则为该类创建代理对象:代理对象的方法=目标方法+通知在客户端通过getBean在Spring容器中查找相应对象,如果有代理对象则返回代理对象,否则返回对象本身。

转载请注明原文地址: https://www.6miu.com/read-2629409.html

最新回复(0)