一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。
AOP的实现原理
概述
什么是AOP?
AOP并不是Spring专属的,他只是一种开发模式,在不修改源代码的情况下对代码进行增强。借助于动态代理的模式进行开发
不使用Spring如何实现AOP?
类的方法本身是有实现接口来的:使用JDK动态代理
实现:
创建接口实现类代理对象,增强类的方法
创建要增强的对象:创建要增强的接口和实现类
public interface UserInfo { void sayHello(); } public class UserInfoImpl implements UserInfo{ @Override public void sayHello() { System.out.print("hello"); } }
创建增强对象:代理对象中参数需要实现了InvocationHandler的对象
class UserInfoProxy implements InvocationHandler { private Object obj; public UserInfoProxy(Object obj) { this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //增强的目标方法 method.invoke(obj, args); //要增强的逻辑 System.out.println(" my Name is Tom"); return null; } }
创建接口实现类代理对象执行业务逻辑:业务执行的时候不直接使用对应的实现类来执行,而是使用接口的代理对象执行对应的方法。所以要创建接口的代理对象
public class JDKProxy { public static void main(String[] args) { UserInfo userInfo = new UserInfoImpl(); //创建接口实现类代理对象 Class[] interfaces = { UserInfo.class }; UserInfo info = (UserInfo) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserInfoProxy(userInfo)); info.sayHello(); } }
结果输出:hello my Name is Tom
类的方法本身不是实现接口来的:使用CGLIB动态代理
实现:
创建子类的代理对象,增强类的方法
UserInfo中sayHello。然后Person中继承UserInfo。在sayHello方法的实现先调用super.sayHello();然后写具体的增强逻辑
AOP概念
-
连接点:一个类中的可以被增强的方法就叫做连接点:比如上述的UserInfo中的sayHello()
-
切点:实际被增强的方法,就称为切点
-
切面:一个动作:将通知应用到切点的操作动作就是切面
-
通知:增强的逻辑代码。
System.out.println(" my Name is Tom");
- 前置通知:
- 后置通知:方法执行完
- 环绕通知:前后都通知
- 异常通知:出现异常才执行切面代码
- 最终通知:有没有异常都会执行