手写aop(手写输入法 手写板)
## 手写 AOP ### 简介AOP(Aspect Oriented Programming),面向切面编程,是一种编程范式,旨在将横切关注点(cross-cutting concerns)与业务逻辑分离,提高代码模块化和可维护性。本文将介绍如何不依赖框架,仅使用原生 Java 代码实现 AOP 的核心功能。### 核心概念
切面(Aspect):
封装横切关注点的模块,例如日志记录、事务管理、性能监控等。
连接点(Join point):
程序执行过程中可以插入切面的点,例如方法调用、异常抛出等。
切点(Pointcut):
定义匹配哪些连接点的表达式。
通知(Advice):
切面在连接点上执行的操作,例如方法执行前记录日志、方法执行后提交事务等。
目标对象(Target object):
被切面织入的业务逻辑对象。
代理对象(Proxy):
封装了目标对象和切面的对象,对外提供与目标对象一致的接口。
织入(Weaving):
将切面应用到目标对象的过程,生成代理对象。### 手写 AOP 实现我们将实现一个简单的 AOP,包含以下功能:
定义切点,支持匹配方法名。
定义通知,支持方法执行前和方法执行后两种类型。
手动创建代理对象,织入切面逻辑。#### 1. 定义切点```java public class Pointcut {private String methodName;public Pointcut(String methodName) {this.methodName = methodName;}public boolean matches(String methodName) {return this.methodName.equals(methodName);} } ```#### 2. 定义通知```java public interface Advice {void before(Object[] args);void after(Object result); } ```#### 3. 创建代理工厂```java public class ProxyFactory {private Object target;private Pointcut pointcut;private Advice advice;public ProxyFactory(Object target, Pointcut pointcut, Advice advice) {this.target = target;this.pointcut = pointcut;this.advice = advice;}public Object getProxy() {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),(proxy, method, args) -> {if (pointcut.matches(method.getName())) {advice.before(args);Object result = method.invoke(target, args);advice.after(result);return result;} else {return method.invoke(target, args);}});} } ```#### 4. 使用示例```java public interface UserService {void createUser(String username, String password); }public class UserServiceImpl implements UserService {@Overridepublic void createUser(String username, String password) {System.out.println("Creating user: " + username);// 模拟业务逻辑} }public class Main {public static void main(String[] args) {UserService userService = new UserServiceImpl();Pointcut pointcut = new Pointcut("createUser");Advice advice = new Advice() {@Overridepublic void before(Object[] args) {System.out.println("Before creating user...");}@Overridepublic void after(Object result) {System.out.println("User created successfully.");}};ProxyFactory proxyFactory = new ProxyFactory(userService, pointcut, advice);UserService proxy = (UserService) proxyFactory.getProxy();proxy.createUser("john", "password123");} } ```### 总结本文介绍了如何使用原生 Java 代码实现一个简单的 AOP,展示了 AOP 的核心概念和实现原理。实际应用中,可以使用更强大的 AOP 框架,例如 Spring AOP 和 AspectJ,它们提供了更丰富的功能和更灵活的配置方式。
手写 AOP
简介AOP(Aspect Oriented Programming),面向切面编程,是一种编程范式,旨在将横切关注点(cross-cutting concerns)与业务逻辑分离,提高代码模块化和可维护性。本文将介绍如何不依赖框架,仅使用原生 Java 代码实现 AOP 的核心功能。
核心概念* **切面(Aspect):** 封装横切关注点的模块,例如日志记录、事务管理、性能监控等。 * **连接点(Join point):** 程序执行过程中可以插入切面的点,例如方法调用、异常抛出等。 * **切点(Pointcut):** 定义匹配哪些连接点的表达式。 * **通知(Advice):** 切面在连接点上执行的操作,例如方法执行前记录日志、方法执行后提交事务等。 * **目标对象(Target object):** 被切面织入的业务逻辑对象。 * **代理对象(Proxy):** 封装了目标对象和切面的对象,对外提供与目标对象一致的接口。 * **织入(Weaving):** 将切面应用到目标对象的过程,生成代理对象。
手写 AOP 实现我们将实现一个简单的 AOP,包含以下功能:* 定义切点,支持匹配方法名。 * 定义通知,支持方法执行前和方法执行后两种类型。 * 手动创建代理对象,织入切面逻辑。
1. 定义切点```java public class Pointcut {private String methodName;public Pointcut(String methodName) {this.methodName = methodName;}public boolean matches(String methodName) {return this.methodName.equals(methodName);} } ```
2. 定义通知```java public interface Advice {void before(Object[] args);void after(Object result); } ```
3. 创建代理工厂```java public class ProxyFactory {private Object target;private Pointcut pointcut;private Advice advice;public ProxyFactory(Object target, Pointcut pointcut, Advice advice) {this.target = target;this.pointcut = pointcut;this.advice = advice;}public Object getProxy() {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),(proxy, method, args) -> {if (pointcut.matches(method.getName())) {advice.before(args);Object result = method.invoke(target, args);advice.after(result);return result;} else {return method.invoke(target, args);}});} } ```
4. 使用示例```java public interface UserService {void createUser(String username, String password); }public class UserServiceImpl implements UserService {@Overridepublic void createUser(String username, String password) {System.out.println("Creating user: " + username);// 模拟业务逻辑} }public class Main {public static void main(String[] args) {UserService userService = new UserServiceImpl();Pointcut pointcut = new Pointcut("createUser");Advice advice = new Advice() {@Overridepublic void before(Object[] args) {System.out.println("Before creating user...");}@Overridepublic void after(Object result) {System.out.println("User created successfully.");}};ProxyFactory proxyFactory = new ProxyFactory(userService, pointcut, advice);UserService proxy = (UserService) proxyFactory.getProxy();proxy.createUser("john", "password123");} } ```
总结本文介绍了如何使用原生 Java 代码实现一个简单的 AOP,展示了 AOP 的核心概念和实现原理。实际应用中,可以使用更强大的 AOP 框架,例如 Spring AOP 和 AspectJ,它们提供了更丰富的功能和更灵活的配置方式。