模拟AOP 面向切面编程

模拟AOP 面向切面编程
假设我们有个类UserDAO 里面有个save方法我们现在要在这个方法前加一个日志
当然我们可以创建一个日志类,然后将测试代码组合到源代码,不过这样已经改动了源代码了
所以我们用动态代理来解决这个问题



LogInterceptor.java===============
public class LogInterceptor implements InvocationHandler {
private Object target;
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public void beforeMethod(Method m) {
System.out.println(m.getName() + " start");
}
public Object invoke(Object proxy, Method m, Object[] args)
throws Throwable {
beforeMethod(m);
m.invoke(target, args);
return null;
}
}


UserDAOImple.java=====================
public class UserDAOImpl implements UserDAO {
public void save(User user) {
System.out.println("user saved!");
}
public void delete() {
System.out.println("user deteleted");
}
}


Test.java========================用于测试.
public void testProxy() {
UserDAO userDAO = new UserDAOImpl();
LogInterceptor li = new LogInterceptor();
li.setTarget(userDAO);
UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), li);
System.out.println(userDAOProxy.getClass());
userDAOProxy.delete();
userDAOProxy.save(new User());

}
### Java AOP面向切面编程)概念 Java AOP 是一种编程范式,旨在通过分离横切关注点来提高模块化程度。横切关注点是指那些影响多个类的功能,如事务管理、日志记录和安全性等。这些功能通常散布于整个应用的不同部分,难以维护和修改。 Spring AOP 提供了声明式和编程式的 AOP 实现,其中较常用的是声明式 AOP[^1]。这种技术允许开发者定义特定的行为——称为“方面”,并将其应用于程序的其他部分而不改变原有业务逻辑代码。 ### 创建增强方法所在类 (即切面) 为了实现增强功能,需要创建一个包含增强逻辑的方法所在的类: ```java package Semester_4.AOP.JDKDynamicProxy.intensifier; public class MyAspect { public void checkPermissions(){ System.out.println("模拟检查权限的过程……"); } public void log(){ System.out.println("模拟记录权限的过程……"); } } ``` 上述代码展示了如何在一个名为 `MyAspect` 的类中定义两个简单的增强函数:一个是用于模拟权限验证过程,另一个则是用来打印日志信息[^2]。 ### 日志记录功能的应用场景 在实际开发过程中,利用 Spring AOP 可以方便地实现在不侵入原业务逻辑的情况下添加额外行为的需求。比如,在应用程序内部自动捕获所有公共接口调用的信息,并将它们写入到文件或其他存储介质里去。这不仅简化了编码工作量还提高了系统的可读性和灵活性[^3]。 ### 定义切面类与配置切入点表达式 下面是一个具体的例子展示怎样基于 AspectJ 注解风格来构建一个完整的切面组件: ```java @Aspect @Component public class LogAspect { /** * Before注解: 前置通知,在目标方法执行之前执行; * value参数: 切入点表达式,指定哪些方法需要被植入增强逻辑; */ @Before(value = "execution(public int cn.tedu._07springaop.aop.CalculatorImpl.*(..))") public void beforeMethod() { //前置通知的增强逻辑 System.out.println("即将执行计算操作..."); } /* 还可以有其他的环绕通知(@Around), 后置返回通知 (@AfterReturning), 抛出异常后的处理(@AfterThrowing),以及最终的通知(@After) */ } ``` 这段代码片段说明了一个典型的切面类结构及其基本组成部分。这里使用了 `@Aspect` 和 `@Component` 来标记该类为一个切面组件;并通过 `@Before` 注解读取切入点表达式从而决定何时触发相应的增强逻辑[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值