【AOP系列】爱之初体验(一)

【AOP系列】爱之初体验

前言

在java开发的面试过程中少不了会问道Spring框架

然鹅 Spring框架最基本的两个功能就是IOC和AOP。

本文就直说AOP

AOP是啥?

AOP红酒是法国红酒等级中最高的一级,属于顶级酒。AOP红酒就是原来的AOC红酒。

2010法国葡萄酒新等级——AOC已成为历史,2009年10月的时候,法国国家葡萄酒行业协会新闻公报报道称,为了配合欧洲葡萄酒的级别标注形式,AOC葡萄酒(法定产区葡萄酒)变成AOP葡萄酒

不好意思复制错了 - _ - `

AOP为Aspect Oriented Programming的缩写,是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。

AOP的出现弥补了OOP的这点不足,AOP 是一个概念,一个规范,本身并没有设定具体语言的实现,AOP是基于动态代理模式。AOP是方法级别的,要测试的方法不能为static修饰,因为接口中不能存在静态方法,编译就会报错。

AOP可以分离业务代码和关注点代码(重复代码),在执行业务代码时,动态的注入关注点代码。切面就是关注点代码形成的类。Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。

哦,看了一大堆,到底想说啥?

【AOP系列】爱之初体验(一)_第1张图片

List在增删改查的时候,在控制台上输出一条记录怎么实现?

		List<String> list = new ArrayList<>();
		list.add("a");
		System.out.println("add:a");
		list.add("b");
		System.out.println("add:b");
		list.add("c");
		System.out.println("add:c");
		list.remove("c");
		System.out.println("remove:c");

写好了 - _ - ~

别蠢了,现在要给所有的方法都添加日志,就在所有的方法后面打印一下?

那么看看AOP的方式实现

AopUtil.java

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;

public class AopUtil {

	public static List aop(List list){
		return (List)Proxy.newProxyInstance(null, new Class[]{List.class}, new Log(list));
	}
	
	static class Log implements InvocationHandler{
		Object target;	
		public Log(Object obj){
			this.target=obj;
		}
		@Override
		public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
			System.out.print(method.getName()+":");
			for (Object object : args) {
				System.out.print(object);
			}
			System.out.println();
			Object o=method.invoke(target, args);
			return o;
		}
	}
}
public class Main {
	public static void main(String[] args) throws Throwable{
		//原来写法
		List<String> list = new ArrayList<>();
		list.add("a");
		System.out.println("add:a");
		list.add("b");
		System.out.println("add:b");
		list.add("c");
		System.out.println("add:c");
		list.remove("c");
		System.out.println("remove:c");
		
		List<String> aoplist = AopUtil.aop(list);//经过AOP处理的list
		aoplist.add("1");
		aoplist.add("2");
		aoplist.add("3");
		aoplist.remove("3");
		
		System.out.println(aoplist.equals(list));
		//true说明还是原来的list对象,只是把原来的对象进行了增强
	}
}

看下效果

【AOP系列】爱之初体验(一)_第2张图片

鹅 美 净~ (amazeing)

经过AOP动态代理处理后我们原来的List就有了,输出的功能。

AOP具体运用在什么地方呢?

日志记录,性能统计,安全控制,事务处理,异常处理等很多地方都会用到。

博文

【AOP系列】爱之初体验(一)

【AOP系列】静态代理和动态代理(二)

【AOP系列】JDK动态代理源码分析(三)

【AOP系列】自己动手实现一个JDK的Proxy类(四)

【AOP系列】一个切面类搞定请求日志

【AOP系列】后端登录这样写才香

【AOP系列】CGlib代码跟读

问题清单⭐

什么是AOP?

什么是动态代理?

动态代理有哪些实现方式?

为啥要使用AOP?

JDK动态代理的原理是什么?

JDK动态代理为只能代理实现了接口的方法?

AOP的两种底层实现性能分析和比较?

应用场景

AOP结合 stopwatch 写一个 请求时间的统计工具

AOP写一个登录拦截的功能

AOP写一个日志请求处理器

AOP简单模拟@Transactional的事务处理

此博文中的源代码都在这里 aopdemo

这里还有其他有意思的小demo GitHub

{
	"author": "大火yzs",
	"title": "【AOP系列】爱之初体验",
	"tag": "AOP,List,日志",
	"createTime": "2020-03-07  13:10"
}

你可能感兴趣的:(java,【AOP系列】)