AOP(Aspect-Oriented Programming), 又称为面向切面编程. 作为一种编程思想, AOP 是 OOP(Object-Oriented Programing 面向对象编程) 一种 补充和完善.
AOP 相关的术语
1.0 关注点
关注点就是所关注的与业务无关的公共服务或系统级服务, 如日志记录, 权限检查, 事务管理等. 关注点通常称为横切关注点, 表示要做什么.
2.0 连接点
连接点就是程序执行过程中明确的阶段点, 如方法的调用或异常的抛出等. 其实, 关注点的功能就是添加到相应的连接点. 因此, 连接点表示在那里做. 在 spring aop 中, 一个连接点总代表一个方法的执行.
3.0 增强
增强就是在特定的连接点处所执行的处理逻辑, 也就是面向连接点注入代码. 增强通常有称为增强处理, 表示具体做什么.
3.1.0 Before Advice 前置处理, 在连接点执行前处理.
3.2.0 AfterReturning Advice 后置增强, 在连接点成功执行后调用.
3.3.0 AfterThrowing Advice, 异常增强, 在连接点抛出异常后被调用.
3.4.0 Around Advice 环境增强, 在连接点执行前与执行后被调用.
4.0 切入点
切入点就是可以插入增强的连接点.
image.png
Jdk 的动态代理
AOP 是基于代理实现的, 代理分为 2 大类, 静态代理与动态代理. 静态代理是在编译时候生成的, 动态代理是在运行的时候生成的.
下面看一个 jdk 的动态代理的 deom.
jdk 动态代理需要一个接口, 以及其实现类.
定义接口 UserService
- package dflx;
- public interface UserService {
- public void add();
- public void serach();
- }
以及其实现类 UserImpl, 和 jdk 动态代理类 MyJdkProxy
- public class UserImpl implements UserService {
- @Override
- public void add() {
- System.out.println("add user");
- }
- @Override
- public void serach() {
- System.out.println("search user");
- }
- }
- class MyJdkProxy implements InvocationHandler{
- private UserService user;
- public MyJdkProxy(UserService user)
- {
- this.user=user;
- }
- public UserService createJDKProxy(){
- return (UserService) Proxy.newProxyInstance(user.getClass().getClassLoader(),
- user.getClass().getInterfaces(),this);
- }
- @Override
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- if(method.getName().equals("add"))
- {
- System.out.println("记录日志");
- return method.invoke(user, args);
- }else {
- return method.invoke(user, args);
- }
- }
- }
测试类 MyJdkTest 如下
- package dflx;
- import org.junit.Test;
- public class MyJdkTest {
- @Test
- public void test() {
- // 代理对象
- UserService user=new UserImpl();
- // 创建代理
- MyJdkProxy myJdkProxy=new MyJdkProxy(user);
- UserService proxy=myJdkProxy.createJDKProxy();
- proxy.add(); // 对 add 方法进行了增强
- proxy.serach();
- }
- }
对 add 方法, 进行了增强.
结果如下
记录日志
- add user
- search user
来源: http://www.jianshu.com/p/325acf9cbc32