AOP原理,实现(内附项目代码)

本文详细介绍了如何在Java中使用AOP解决代码重复和测试性能问题,通过动态代理实现对`getUserList()`方法的性能计时,展示了AOP如何提升代码整洁度和测试效率。

**

关于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的简单实现举例)

项目中包含内容简单的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

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值