Aspect oriented programming
面向切面编程,对某一类对象编程。
1. 简介
面向切面编程(AOP)通过提供另外一种思考程序结构的途经来弥补面向对象编程(OOP)的不足。在OOP中模块化的关键单元是类(classes),而在AOP中模块化的单元则是切面。切面能对关注点进行模块化,例如横切多个类型和对象的事务管理。
(在AOP术语中通常称作横切(crosscutting)关注点。)
AOP框架是Spring的一个重要组成部分。但是Spring IoC容器并不依赖于AOP,这意味着你有权利选择是否使用AOP,AOP做为Spring IoC容器的一个补充,使它成为一个强大的中间件解决方案。
重点 :Spring Framework一个重要的原则就是无侵入性(non-invasiveness); 这个思想指你不应当被迫引入框架特定的类和接口到你的业务/领域模型中。然而,Spring Framework在某些地方给你一个是否引入Spring框架特定依赖到你的代码的选项: 给你这个选项的理由是因为在特定的场景中它可能仅仅是容易阅读或用这种方法编写特定的功能块。Spring Framework(几乎)一直会为你提供这种选择:从而使你能做出一个明智的决定,使它最适应你的特定用例或场景。
2. 理解其原理
如:有许多service类都需要使用事务、日志、拦截器等。
面向切面编程的思想就是把这些都需要的功能点抽出来,谁需要用就注入给谁。
举一个例子:
userSrvice派生自IService接口,并实现了login方法,我们需要使用切面编程的思想将写日志的功能抽离出去。
public interface IService {
public void login();
}
public class UserService implements IService {
@Override
public void login() {
}
}
关系图:
我们需要增加两个内容:1.写日志的实现类,2.代理类
抽离出来的日志实现类,专业述语叫:通知
Spring有四类通知:
通知类型 | 接口 | 描述 |
Around | org.aopalliance.intercept.Methodinterceptor | 拦截对目标方法调用 |
Before | org.springframework.aop.MethodBeforeAdvice | 在目标方法调用前调用 |
After | org.springframework.aop.AfterReturningAdvice | 在目标方法调用后调用 |
Throws | org.springframework.aop.ThrowsAdvice | 当目标方法抛出异常时调用 |
这里因为是需要在调用方法前打出日志,因此使用before类型:
public class MyMethodBeforeAdvice implements MethodBeforeAdvice{
public void before(Mthod method, Object[] args, Object target) throws Throwable{
System.out.print("记录日志:"+method.getName());
}
}
再来写代理类:注:代理类其实是不用写的,只需要配置即可,但为了更直观的理解切面编程的思想,我们来模拟实现一下:
public class ProxyService implements IService {
private MyMethodBeforeAdvice myMethodBeforeAdvice;// 通知
private UserService userservice;// 被代理对象
@Override
public void login() {
myMethodBeforeAdvice.before();
userservice.login();
}
}
现在的类图为:
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
IService us = (IService) ac.getBean("ProxyService");
us.login();
或者更直观的写法:
IService us = new ProxyService();
us.login();
这样,在不改动UserService代码的情况下,为其函数添加了日志。
其中“通知”类是根据自己的需要,从四种不同的类型中派生,在固定的方法中写与业务相关的代码。
其中“代理”类通过在配置文件中配置其代理的接口是什么(IService ),配置被代理对象是谁(UserService ),配置注入的“通知”是谁(MyMethodBeforeAdvice )。
Aop编程,实际上在实际项目中用的不是很多,在开发框架本身时用的多,