Java手写Spring的AOP(切面织入)小Demo--盲僧代理击飞 亚索接大实例
在学习Spring的过程中总会很迷茫,打个@Aspect
注解切面功能就有了,只要脱离了框架感觉自己还是什么都没会,所以自己猜了一下切面的思路,大概写了个小Demo,欢迎交流。
涉及知识:JDK动态代理、自定义注解
设计思路:孤儿索击飞不了敌人,需要盲僧开大击飞,所以给自己的大招方法打上了
@MyBefore
注解,这样盲僧识别这个注解就知道亚索大好了,执行代理击飞。
提示:注释中也有说明,请参考。
一、创建自定义注解
模拟spring的@Before,参考代码注释
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Documented
@Retention(RetentionPolicy.RUNTIME)//运行时
@Target(ElementType.METHOD)//加在方法上
public @interface MyBefore {}
二、定义一个Hero
接口,让其成为原对象以及最后生成的代理对象的顶级接口。
/*** 顶端接口* @author xi.luo**/
public interface Hero {public void jieDa();
}
三、创建亚索对象,实现顶端接口Hero
,并在接大追加@MyBefore
/*** 青铜亚索,需要队友代理击飞才能接大* @author xi.luo**/
public class YaSuo implements Hero{@MyBeforepublic void jieDa(){System.out.println("亚索:狂风绝息斩!!");}
}
四、创建王者盲僧对象,实现InvocationHandler
,处理亚索的@Before
注解。
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;/*** 王者盲僧,为亚索代理击飞* @author xi.luo**/
public class MangSeng implements InvocationHandler{YaSuo yaSuo;MangSeng(YaSuo yaSuo){this.yaSuo = yaSuo;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//获取Yasuo类的接口信息,如果有Before注解进行击飞Method[] declaredMethods = YaSuo.class.getDeclaredMethods();boolean findBefore = false;//遍历找到叫 接大 的方法,再遍历寻找该方法上打没打before注解for(Method m:declaredMethods){if("jieDa".equals(m.getName())){Annotation[] declaredAnnotations = m.getDeclaredAnnotations();for(Annotation annotation:declaredAnnotations){if(annotation.annotationType() == MyBefore.class){System.out.println(annotation.annotationType());System.out.println("这个类加了Before注解,在方法前织入逻辑");findBefore = true;break;}}}}if(findBefore == true){System.out.println("盲僧击飞->->-> 神龙摆尾! 亚索,接好了!!");}return method.invoke(yaSuo, args);}}
五、创建运行类
import java.lang.reflect.Proxy;public class Demo001 {public static void main(String[] args) {//孤儿索YaSuo ySuo = new YaSuo();//王者盲僧托管孤儿索MangSeng mangSeng = new MangSeng(ySuo);//甜蜜CP组合组成Hero yasuoProxy = (Hero)Proxy.newProxyInstance(YaSuo.class.getClassLoader(), YaSuo.class.getInterfaces(), mangSeng);//一脚升天yasuoProxy.jieDa();}
}
运行结果贴图:
下图为无@MyBefore
注解运行结果 很孤独
下图为有@MyBefore
注解运行结果 有画面了
总结:网上对于切入点、切面、织入的概念五花八门,自己大概猜了个思路以便理解,如有问题欢迎交流,开黑的话春节再说哈哈。
Java手写Spring的AOP(切面织入)小Demo--盲僧代理击飞 亚索接大实例相关推荐
- 【手写 Spring 框架 AOP 篇】一、基于 JDK、CGlib 实现 AOP 切面
这个系列是基于小傅哥的「手撸 Spring」学习的一个记录 目标 AOP 意为面向切面编程,通过预编译的方式和运行期间动态代理实现程序功能的统一维护.这句话可能不太好理解,可以先看下图: 从图中可以看 ...
- 从Spring源码探究AOP代码织入的过程
随着不断地使用Spring,以及后续的Boot.cloud,不断的体会到这个拯救Java的生态体系的强大,也使我对于这个框架有了极大的好奇心,以至于产生了我为什么不能写一个这样的框架的思考. 通过自学 ...
- 手把手教你手写Spring框架
手写spring准备工作: 新建一个maven工程: 架构 新建类: package com.spring;public class keweiqinApplicationContext {priva ...
- JAVA项目代码手写吗_一个老程序员是如何手写Spring MVC的
见人爱的Spring已然不仅仅只是一个框架了.如今,Spring已然成为了一个生态.但深入了解Spring的却寥寥无几.这里,我带大家一起来看看,我是如何手写Spring的.我将结合对Spring十多 ...
- 十年java架构师分享:我是这样手写Spring的
人见人爱的 Spring 已然不仅仅只是一个框架了.如今,Spring 已然成为了一个生态.但深入了解 Spring 的却寥寥无几.这里,我带大家一起来看看,我是如何手写 Spring 的.我将结合对 ...
- 手写springIOC、AOP
手写springIOC.AOP 一.核心思想 1.IoC 1.1 什么是IoC? 1.2 IoC解决了什么问题 1.3 IoC和DI的区别 2.AOP 2.1 什么是AOP? 2.2 AOP解决的什么 ...
- 手写 Spring 事务、IOC、DI 和 MVC
Spring AOP 原理 什么是 AOP? AOP 即面向切面编程,利用 AOP 可以对业务进行解耦,提高重用性,提高开发效率 应用场景:日志记录,性能统计,安全控制,事务处理,异常处理 AOP 底 ...
- 05. 手写Spring核心框架
目录 05 手写Spring核心框架 Pt1 手写IoC/DI Pt1.1 流程设计 Pt1.2 基础配置 application.properties pom.xml web.xml Pt1.3 注 ...
- 记录一次阿里架构师全程手写Spring MVC
人见人爱的Spring已然不仅仅只是一个框架了.如今,Spring已然成为了一个生态.但深入了解Spring的却寥寥无几.这里,我带大家一起来看看,我是如何手写Spring的.我将结合对Spring十 ...
最新文章
- Android--SQLite(一)
- R语言使用ggplot2包的快速可视化函数qplot绘制分组箱图实战
- 远程办公中的IT女性:工作量增加3倍,离职率却下降近50%
- 印度太阳能企业争取对中、台、马实施反倾销税
- 小程序中textarea层级最高的结局办法
- 修改数据结构记录,将同级数据改成父子集数据
- k8s概念: service和ingress
- 二进制代码查看器Binary Viewer下载教程
- leetcode 526. Beautiful Arrangement | 526. 优美的排列(回溯)
- PHP直接输出一张图片
- checkbox取反
- linux下查看表类型注释命令@tcc
- c语言中的memset函数与bzero函数
- 飞机器减震器的matlab建模和仿真模拟
- 学习银行系统开发经验
- 标准Modbus通讯协议格式
- R语言 创建空的数据框
- 微生物组测序方法比较
- VsCode使用Git连接Gitee和GitHub
- 9-5日度小满金融Java研发工程师笔试