**
关于Java中AOP的实现
**
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、AOP是什么?
AOP(Aspect Oriented Programming),又称为面向切面编程,可以简单的理解为对面向对象编程(OOP)的补充和完善。它的出现,改善了OOP编程设计的散布在各处的无关代码的重复问题(冗余)。
二、问题案例
假如想对一些代码进行测试,测试它的执行时间是多少
代码如下(示例):
long startTime = new Date().getTime();
System.out.println("一些被测试代码段");
System.out.println("一些被测试代码段");
System.out.println("一些被测试代码段");
System.out.println("一些被测试代码段");
long endTime = new Date().getTime();
long totalTime = endTime - startTime;
long startTime1 = new Date().getTime();
System.out.println("一些被测试代码段");
System.out.println("一些被测试代码段");
System.out.println("一些被测试代码段");
System.out.println("一些被测试代码段");
long endTime1 = new Date().getTime();
long totalTime1= endTime - startTime;
long startTime2 = new Date().getTime();
System.out.println("一些被测试代码段");
System.out.println("一些被测试代码段");
System.out.println("一些被测试代码段");
System.out.println("一些被测试代码段");
long endTime2 = new Date().getTime();
long totalTime2 = endTime - startTime;
可以明显的发现,如下代码重复了很多次。通常情况下,如果被测试代码增多,多至成百上千条,这些重复的代码便会让测试效率大大下降,不易于维护。
日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。
long startTime2 = new Date().getTime();
long endTime2 = new Date().getTime();
long totalTime2 = endTime - startTime;
三、使用动态代理解决问题(AOP的简单实现举例)
项目中包含内容
DyProxy.java中的代码(动态代理核心)
package com.icss.AOP;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;
public class DyProxy
{
//动态代理技术(DynamicProxy):生成一个代理对象
//使用泛型返回一个代理对象
//当我有对象想被代理时,用它来得到对象的代理信息 代理对象也
private Object toProxyObj;
public Object getProxyObject(Object object)
{
this.toProxyObj = object;
//用来创建代理类对象的函数
return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(), new InvocationHandler()
{
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
Object result;
if(method.isAnnotationPresent(Performance.class))
{
long startTime = new Date().getTime();
result = method.invoke(toProxyObj, args);
long endTime = new Date().getTime();
long totalTime = endTime - startTime;
System.out.println("函数执行时间"+totalTime);
}
else
{
result = method.invoke(toProxyObj, args);
}
//调用原函数
return result;
}
});
}
}
UserService接口中代码
对 getUserList() 抽象方法添加自定义注解@Performance
package com.icss.AOP;
public interface UserService {
void login();
void logout();
@Performance
void getUserList();
}
自定义注解Performance代码
package com.icss.AOP;
import static java.lang.annotation.ElementType.METHOD;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value=ElementType.METHOD)
@Retention(value=RetentionPolicy.RUNTIME)
public @interface Performance {
}
package com.icss.AOP;
public class UserServiceImpl implements UserService{
//对应的接口实现类
@Override
public void login() {
// TODO Auto-generated method stub
System.out.println("调用login");
//假设进行了一系列复杂的操作
}
@Override
public void logout() {
// TODO Auto-generated method stub
System.out.println("调用logout");
//假设进行了一系列复杂的操作
}
@Override
public void getUserList() {
// TODO Auto-generated method stub
System.out.println("调用UserList");
//假设进行了一系列复杂的操作
}
}
测试类TestAOP中代码
package com.icss.AOP;
public class TestAOP {
public static void main(String[] args)
{
//AOP是面向切面编程:测试性能 同一日志 事务管理
UserService us = (UserService) new DyProxy().getProxyObject(new UserServiceImpl());
us.getUserList();
us.login();
us.logout();
}
}
将原有代码中,下面三段代码通过动态代理技术进行了优化,的到的测试结果与原来的是一样的
long startTime2 = new Date().getTime();
long endTime2 = new Date().getTime();
long totalTime2 = endTime - startTime;
总结
AOP编程是对OOP编程的补充和完善,是一种思路上和技术升级版 就像游戏中的升级补丁一样修复了原版的一些BUG
本文详细介绍了如何在Java中使用AOP解决代码重复和测试性能问题,通过动态代理实现对`getUserList()`方法的性能计时,展示了AOP如何提升代码整洁度和测试效率。
1万+





