- 切面(Aspect)
切面是一个关注点的模块化,如事务管理就是一个在JavaEE企业中应用最常见的界面。在企业应用编程中,首先需要通过分析,抽取出通用的功能,即“切面”。
事务、日志、安全性的框架、权限都是切面 - 连接点(Joinpoint)
连接点是执行程序过程中的特定的点。Spring框架只支持方法作为连接点,如方法调用之前、方法调用后、或者发生异常时等。 - 通知(Advice)
通知就是切面的具体实现。通知将在切面的某个特定的连接点上执行动作,Spring中执行的动作往往就是调用某一个类的具体方法。例如:在保存订单的模块中,进行日志管理(一个切面),具体是在保存订单的方法执行之前(连接点)执行写日志(通知)的功能。其中,日志管理是很多模块中通用的功能,因此这就是一个切面,而具体是在保存订单之前执行日志保存,那么保存订单前这个点就是连接点,实现日志保存功能的类就是通知。
就是切面中的方法。 切入点(Pointcut)
切入点是连接点的集合,通知将在满足一个切入点表达式的所有连接点上运行。
举例:
在拦截器中,有一系列判断性的内容1
if(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和实现类personDaoImpl1
2
3
4
5
6public interface PersonDao {
/**
* 目标方法
*/
public void savePerson();
}
1
2
3
4
5public class PersonDaoImpl implements PersonDao{
public void savePerson() {
System.out.println("save person");
}
}事务处理类Transaction
1
2
3
4
5
6
7
8
9public class Transaction {
public void beginTransaction(){
System.out.println("begin transaction");
}
public void commit(){
System.out.println("commit");
}
}接下来最重要的就是AOP的配置文件,applicationContext.xml。通过配置AOP可以实现创建代理对象:代理对象的方法=目标方法+通知。将原本不相关的目标方法和通知结合起来。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<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>客户端代码
1
2
3
4
5public 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容器中查找相应对象,如果有代理对象则返回代理对象,否则返回对象本身。
AOP面向切面
最新推荐文章于 2024-08-31 18:26:50 发布