在学习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--盲僧代理击飞 亚索接大实例相关推荐

  1. 【手写 Spring 框架 AOP 篇】一、基于 JDK、CGlib 实现 AOP 切面

    这个系列是基于小傅哥的「手撸 Spring」学习的一个记录 目标 AOP 意为面向切面编程,通过预编译的方式和运行期间动态代理实现程序功能的统一维护.这句话可能不太好理解,可以先看下图: 从图中可以看 ...

  2. 从Spring源码探究AOP代码织入的过程

    随着不断地使用Spring,以及后续的Boot.cloud,不断的体会到这个拯救Java的生态体系的强大,也使我对于这个框架有了极大的好奇心,以至于产生了我为什么不能写一个这样的框架的思考. 通过自学 ...

  3. 手把手教你手写Spring框架

    手写spring准备工作: 新建一个maven工程: 架构 新建类: package com.spring;public class keweiqinApplicationContext {priva ...

  4. JAVA项目代码手写吗_一个老程序员是如何手写Spring MVC的

    见人爱的Spring已然不仅仅只是一个框架了.如今,Spring已然成为了一个生态.但深入了解Spring的却寥寥无几.这里,我带大家一起来看看,我是如何手写Spring的.我将结合对Spring十多 ...

  5. 十年java架构师分享:我是这样手写Spring的

    人见人爱的 Spring 已然不仅仅只是一个框架了.如今,Spring 已然成为了一个生态.但深入了解 Spring 的却寥寥无几.这里,我带大家一起来看看,我是如何手写 Spring 的.我将结合对 ...

  6. 手写springIOC、AOP

    手写springIOC.AOP 一.核心思想 1.IoC 1.1 什么是IoC? 1.2 IoC解决了什么问题 1.3 IoC和DI的区别 2.AOP 2.1 什么是AOP? 2.2 AOP解决的什么 ...

  7. 手写 Spring 事务、IOC、DI 和 MVC

    Spring AOP 原理 什么是 AOP? AOP 即面向切面编程,利用 AOP 可以对业务进行解耦,提高重用性,提高开发效率 应用场景:日志记录,性能统计,安全控制,事务处理,异常处理 AOP 底 ...

  8. 05. 手写Spring核心框架

    目录 05 手写Spring核心框架 Pt1 手写IoC/DI Pt1.1 流程设计 Pt1.2 基础配置 application.properties pom.xml web.xml Pt1.3 注 ...

  9. 记录一次阿里架构师全程手写Spring MVC

    人见人爱的Spring已然不仅仅只是一个框架了.如今,Spring已然成为了一个生态.但深入了解Spring的却寥寥无几.这里,我带大家一起来看看,我是如何手写Spring的.我将结合对Spring十 ...

最新文章

  1. Android--SQLite(一)
  2. R语言使用ggplot2包的快速可视化函数qplot绘制分组箱图实战
  3. 远程办公中的IT女性:工作量增加3倍,离职率却下降近50%
  4. 印度太阳能企业争取对中、台、马实施反倾销税
  5. 小程序中textarea层级最高的结局办法
  6. 修改数据结构记录,将同级数据改成父子集数据
  7. k8s概念: service和ingress
  8. 二进制代码查看器Binary Viewer下载教程
  9. leetcode 526. Beautiful Arrangement | 526. 优美的排列(回溯)
  10. PHP直接输出一张图片
  11. checkbox取反
  12. linux下查看表类型注释命令@tcc
  13. c语言中的memset函数与bzero函数
  14. 飞机器减震器的matlab建模和仿真模拟
  15. 学习银行系统开发经验
  16. 标准Modbus通讯协议格式
  17. R语言 创建空的数据框
  18. 微生物组测序方法比较
  19. VsCode使用Git连接Gitee和GitHub
  20. 9-5日度小满金融Java研发工程师笔试

热门文章

  1. B/S三层架构[转载]
  2. 谷歌账户无法添加_如何将另一个Google帐户添加到您的Android设备
  3. Google账户登录服务
  4. 高阶ts内置泛型帮助类型
  5. Windows 7常用48款软件兼容性测试
  6. 非线性降维方法 Isomap Embedding
  7. Smoke testing,Sanity testing and Regression testing
  8. 关闭搜狐微门户弹窗终极方法
  9. 微信第三方开发行业解决方案
  10. 和尚吃馒头c语言程序,(八十一)约瑟夫环/鲁智深吃馒头