手写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,它们提供了更丰富的功能和更灵活的配置方式。

标签列表