{"id":13694794,"url":"https://github.com/Nepxion/Matrix","last_synced_at":"2025-05-03T04:30:55.240Z","repository":{"id":109497824,"uuid":"57598071","full_name":"Nepxion/Matrix","owner":"Nepxion","description":"🔑 Nepxion Matrix is an AOP framework integrated with Spring AutoProxy, Spring Registrar and Spring Import Selector with high universality, robustness, flexibility and usability 面向注解的业务场景，包括代理、拦截、开关","archived":false,"fork":false,"pushed_at":"2024-08-11T11:03:54.000Z","size":373,"stargazers_count":134,"open_issues_count":3,"forks_count":58,"subscribers_count":12,"default_branch":"master","last_synced_at":"2024-10-14T01:08:42.057Z","etag":null,"topics":["aopalliance","cglib","spring","spring-autoproxy","spring-boot"],"latest_commit_sha":null,"homepage":"http://www.nepxion.com","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Nepxion.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-05-01T12:45:57.000Z","updated_at":"2024-08-11T11:03:58.000Z","dependencies_parsed_at":"2023-04-06T06:35:38.424Z","dependency_job_id":"9de575c6-2b55-4ac6-ae9c-5db6ee0f2b38","html_url":"https://github.com/Nepxion/Matrix","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nepxion%2FMatrix","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nepxion%2FMatrix/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nepxion%2FMatrix/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nepxion%2FMatrix/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Nepxion","download_url":"https://codeload.github.com/Nepxion/Matrix/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252144488,"owners_count":21701423,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aopalliance","cglib","spring","spring-autoproxy","spring-boot"],"created_at":"2024-08-02T17:01:42.543Z","updated_at":"2025-05-03T04:30:53.915Z","avatar_url":"https://github.com/Nepxion.png","language":"Java","funding_links":[],"categories":["Java","AOP"],"sub_categories":[],"readme":"# Nepxion Matrix\n![Total visits](https://visitor-badge.laobi.icu/badge?page_id=Nepxion\u0026title=total%20visits)  [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg?label=license)](https://github.com/Nepxion/Matrix/blob/master/LICENSE)  [![Maven Central](https://img.shields.io/maven-central/v/com.nepxion/matrix.svg?label=maven)](https://search.maven.org/artifact/com.nepxion/matrix)  [![Javadocs](http://www.javadoc.io/badge/com.nepxion/matrix-aop.svg)](http://www.javadoc.io/doc/com.nepxion/matrix-aop)  [![Build Status](https://github.com/Nepxion/Matrix/workflows/build/badge.svg)](https://github.com/Nepxion/Matrix/actions)  [![Codacy Badge](https://app.codacy.com/project/badge/Grade/15cd6e89da2c46daabf027d377cd5e11)](https://www.codacy.com/gh/Nepxion/Matrix/dashboard?utm_source=github.com\u0026amp;utm_medium=referral\u0026amp;utm_content=Nepxion/Matrix\u0026amp;utm_campaign=Badge_Grade)  [![Stars](https://img.shields.io/github/stars/Nepxion/Matrix.svg?label=Stars\u0026style=flat\u0026logo=GitHub)](https://github.com/Nepxion/Matrix/stargazers)  [![Stars](https://gitee.com/Nepxion/Matrix/badge/star.svg)](https://gitee.com/Nepxion/Matrix/stargazers)\n\n\u003ca href=\"https://github.com/Nepxion\" tppabs=\"#\" target=\"_blank\"\u003e\u003cimg width=\"25\" height=\"25\" src=\"https://nepxion.github.io/Discovery/docs/icon-doc/github.png\"\u003e\u003c/a\u003e\u0026nbsp;  \u003ca href=\"https://gitee.com/Nepxion\" tppabs=\"#\" target=\"_blank\"\u003e\u003cimg width=\"25\" height=\"25\" src=\"https://nepxion.github.io/Discovery/docs/icon-doc/gitee.png\"\u003e\u003c/a\u003e\u0026nbsp;  \u003ca href=\"https://search.maven.org/search?q=g:com.nepxion\" tppabs=\"#\" target=\"_blank\"\u003e\u003cimg width=\"25\" height=\"25\" src=\"https://nepxion.github.io/Discovery/docs/icon-doc/maven.png\"\u003e\u003c/a\u003e\u0026nbsp;  \u003ca href=\"https://nepxion.github.io/Discovery/docs/contact-doc/wechat.jpg\" tppabs=\"#\" target=\"_blank\"\u003e\u003cimg width=\"25\" height=\"25\" src=\"https://nepxion.github.io/Discovery/docs/icon-doc/wechat.png\"\u003e\u003c/a\u003e\u0026nbsp;  \u003ca href=\"https://nepxion.github.io/Discovery/docs/contact-doc/dingding.jpg\" tppabs=\"#\" target=\"_blank\"\u003e\u003cimg width=\"25\" height=\"25\" src=\"https://nepxion.github.io/Discovery/docs/icon-doc/dingding.png\"\u003e\u003c/a\u003e\u0026nbsp;  \u003ca href=\"https://nepxion.github.io/Discovery/docs/contact-doc/gongzhonghao.jpg\" tppabs=\"#\" target=\"_blank\"\u003e\u003cimg width=\"25\" height=\"25\" src=\"https://nepxion.github.io/Discovery/docs/icon-doc/gongzhonghao.png\"\u003e\u003c/a\u003e\u0026nbsp;  \u003ca href=\"mailto:1394997@qq.com\" tppabs=\"#\"\u003e\u003cimg width=\"25\" height=\"25\" src=\"https://nepxion.github.io/Discovery/docs/icon-doc/email.png\"\u003e\u003c/a\u003e\n\nNepxion Matrix是一款集成Spring AutoProxy，Spring Registrar和Spring Import Selector三种机制的AOP框架，具有很高的通用性、健壮性、灵活性和易用性\n\n## 简介\n### Spring AutoProxy机制\n它统一封装接口（Spring）代理和类代理（CGLIB），注解无论在接口和类的头部或者方法上，都可以让业务端执行有效切面，可以轻松快速实现对接口或者类的复杂代理业务。代码参考com.nepxion.matrix.proxy，示例参考matrix-spring-boot-proxy-example\n- 实现接口走Spring代理，类走CGLIB代理\n- 实现通用代理和额外代理两种机制\n- 实现同一进程中，可以接口代理和类代理同存\n- 实现对类或者接口名上注解Annotation，方法上注解Annotation的快速扫描，并开放处理接口供业务端实现\n- 实现“只扫描不代理”，“既扫描又代理”；代理模式ProxyMode，支持“只代理类或者接口名上注解”、“只代理方法上的注解”、“全部代理”三种模式；扫描模式ScanMode，支持“只扫描类或者接口名上注解”、“只扫描方法上的注解”、“全部扫描”三种模式\n- 实现“代理和扫描多个注解“\n- 实现“支持多个切面实现类Interceptor做调用拦截”  \n- 实现“自身调用自身的注解方法，达到切面效果”，提供自动装配（Spring 4.3.X以上的版本支持）和AopContext.currentProxy()两种方式\n- 实现“只扫描指定目录”和“扫描全局目录”两种方式\n- 实现根据Java8的特性来获取注解对应方法上的变量名（不是变量类型），支持标准反射和字节码CGLIG（ASM library）来获取，前者适用于接口代理，后者适用于类代理\n\n  标准反射的方式，需要在IDE和Maven里设置\"-parameters\"的Compiler Argument。参考如下：\n  - Eclipse加\"-parameters\"参数：https://www.concretepage.com/java/jdk-8/java-8-reflection-access-to-parameter-names-of-method-and-constructor-with-maven-gradle-and-eclipse-using-parameters-compiler-argument\n  - Idea加\"-parameters\"参数：http://blog.csdn.net/royal_lr/article/details/52279993\n\n### Spring Registrar机制\n实现象@FeignClient注解那样，只有接口没有实现类，就能实现注入和动态代理。代码参考com.nepxion.matrix.registrar，示例参考matrix-spring-boot-registrar-example\n- 如果本地只有接口并加相关的注解，那么执行对应的切面调用方式\n- 如果本地有接口(不管是否加注解)，并也有实现类，那么执行对应的实现类的逻辑\n\n### Spring Import Selector机制\n实现象@EnableCircuitBreaker注解那样，入口加上@EnableMyAnnotation，自动初始化对应的Configuration。代码参考com.nepxion.matrix.selector，示例参考matrix-spring-boot-selector-example\n- 入口加上@EnableXXX，并提供在spring.factories定义@EnableXXX和Configuration类的关联，达到通过注解的配置与否，控制对应相关上下文对象，例如Bean类的初始化与否\n- 提供在application.properties配置参数，达到上述的目的\n\n## 场景\nMatrix框架一般可以应用到如下场景中：\n\n### Spring AutoProxy机制\n- 对于有复杂AOP使用场景的，用Matrix可以简化你的切面开发。例如：\n  - 根据不同的业务逻辑，指定所有的注解由同一个或者多个拦截类来拦截；也可以指定不同的注解由不同的切面拦截类来拦截；更可以指定不同的接口和实现类，由不同的拦截类来拦截\n  - 如果注解很多，可以指定，你只关心哪些类注解，哪些方法注解，不管这些注解是你自定义的，还是系统定义的\n- 注解加在接口上，还是实现类上，或者没有接口的类，可以随意换\n- 扫描到一个注解后，你可以做一些处理，例如你可以把注解对应的数据存入数据库\n- 强大的注解扫描和拦截功能，在不侵入业务代码的前提下(只是需要在业务端加入一个注解而已)，你可以实现业务应用，例如API监控统计、API健康检查等\n\n### Spring Registrar机制\n\u003e 参考@FeignClient的用法\n\n### Spring Import Selector机制\n\u003e 参考@EnableCircuitBreaker的用法\n\n## 兼容\n最新版本兼容\n- Spring 4.x.x和Spring Boot 1.x.x\n- Spring 5.x.x和Spring Boot 2.x.x\n\n## 依赖\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.nepxion\u003c/groupId\u003e\n    \u003cartifactId\u003ematrix-aop\u003c/artifactId\u003e\n    \u003cversion\u003e${matrix.version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## Spring AutoProxy机制的示例\n### 注意\n拦截实现类中@Component注解一定要加名称，因为全局拦截机制是根据名称BeanName来的\n```java\n@Component(\"myInterceptor1\")\npublic class MyInterceptor1 extends AbstractInterceptor {\n    @Override\n    public Object invoke(MethodInvocation invocation) throws Throwable {\n        ......\n    }\n}\n```\n\n### 示例\n调用入口1，通过全局拦截器实现对类头部注解的扫描和代理，详细用法可参考示例3\n```java\npackage com.nepxion.matrix.proxy.simple.aop;\n\n/**\n * \u003cp\u003eTitle: Nepxion Matrix\u003c/p\u003e\n * \u003cp\u003eDescription: Nepxion Matrix AOP\u003c/p\u003e\n * \u003cp\u003eCopyright: Copyright (c) 2017-2050\u003c/p\u003e\n * \u003cp\u003eCompany: Nepxion\u003c/p\u003e\n * @author Haojun Ren\n * @version 1.0\n */\n\nimport java.lang.annotation.Annotation;\n\nimport org.aopalliance.intercept.MethodInterceptor;\nimport org.springframework.stereotype.Component;\n\nimport com.nepxion.matrix.proxy.aop.DefaultAutoScanProxy;\nimport com.nepxion.matrix.proxy.mode.ProxyMode;\nimport com.nepxion.matrix.proxy.mode.ScanMode;\n\n// 通过全局拦截器实现对类头部注解的扫描和代理\n// 该类描述的逻辑是，目标接口或者类头部如果出现了MyAnnotation1注解，那么该接口或者类下面所有的方法都会被执行扫描和代理，代理类为MyInterceptor1\n@Component(\"myAutoScanProxyForClass\")\npublic class MyAutoScanProxyForClass extends DefaultAutoScanProxy {\n    private static final long serialVersionUID = -5968030133395182024L;\n\n    // 多个包路径，用“;”分隔\n    private static final String SCAN_PACKAGES = \"com.nepxion.matrix.proxy.simple\";\n\n    @SuppressWarnings(\"rawtypes\")\n    private Class[] commonInterceptorClasses;\n\n    @SuppressWarnings(\"rawtypes\")\n    private Class[] classAnnotations;\n\n    public MyAutoScanProxyForClass() {\n        super(SCAN_PACKAGES, ProxyMode.BY_CLASS_ANNOTATION_ONLY, ScanMode.FOR_CLASS_ANNOTATION_ONLY);\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    @Override\n    protected Class\u003c? extends MethodInterceptor\u003e[] getCommonInterceptors() {\n        if (commonInterceptorClasses == null) {\n            commonInterceptorClasses = new Class[] { MyInterceptor1.class };\n        }\n        return commonInterceptorClasses;\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    @Override\n    protected Class\u003c? extends Annotation\u003e[] getClassAnnotations() {\n        if (classAnnotations == null) {\n            classAnnotations = new Class[] { MyAnnotation1.class };\n        }\n        return classAnnotations;\n    }\n\n    @Override\n    protected void classAnnotationScanned(Class\u003c?\u003e targetClass, Class\u003c? extends Annotation\u003e classAnnotation) {\n        System.out.println(\"Class annotation scanned, targetClass=\" + targetClass + \", classAnnotation=\" + classAnnotation);\n    }\n}\n```\n\n调用入口2，通过额外拦截器实现对方法头部注解的扫描和代理\n```java\npackage com.nepxion.matrix.proxy.simple.aop;\n\n/**\n * \u003cp\u003eTitle: Nepxion Matrix\u003c/p\u003e\n * \u003cp\u003eDescription: Nepxion Matrix AOP\u003c/p\u003e\n * \u003cp\u003eCopyright: Copyright (c) 2017-2050\u003c/p\u003e\n * \u003cp\u003eCompany: Nepxion\u003c/p\u003e\n * @author Haojun Ren\n * @version 1.0\n */\n\nimport java.lang.annotation.Annotation;\nimport java.lang.reflect.Method;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport com.nepxion.matrix.proxy.aop.DefaultAutoScanProxy;\nimport com.nepxion.matrix.proxy.mode.ProxyMode;\nimport com.nepxion.matrix.proxy.mode.ScanMode;\nimport com.nepxion.matrix.proxy.simple.service.MyService2Impl;\n\n// 通过额外拦截器实现对方法头部注解的扫描和代理\n// 该类描述的逻辑是，目标接口或者类的某个方法上如果出现了MyAnnotation2注解，那么该接口或者类下面所有的方法都会被执行扫描和代理，并为该接口或者类指定一个具体的代理类为MyInterceptor2\n@Component(\"myAutoScanProxyForMethod\")\npublic class MyAutoScanProxyForMethod extends DefaultAutoScanProxy {\n    private static final long serialVersionUID = -481395242918857264L;\n\n    private static final String[] SCAN_PACKAGES = { \"com.nepxion.matrix.proxy.simple\" };\n\n    @SuppressWarnings(\"rawtypes\")\n    private Class[] methodAnnotations;\n\n    @Autowired\n    private MyInterceptor2 myInterceptor2;\n\n    private Object[] myInterceptor2Array;\n\n    public MyAutoScanProxyForMethod() {\n        super(SCAN_PACKAGES, ProxyMode.BY_METHOD_ANNOTATION_ONLY, ScanMode.FOR_METHOD_ANNOTATION_ONLY);\n    }\n\n    @Override\n    protected Object[] getAdditionalInterceptors(Class\u003c?\u003e targetClass) {\n        if (targetClass == MyService2Impl.class) {\n            return getMyInterceptor2Array();\n        }\n        return null;\n    }\n\n    private Object[] getMyInterceptor2Array() {\n        if (myInterceptor2Array == null) {\n            myInterceptor2Array = new Object[] { myInterceptor2 };\n        }\n        return myInterceptor2Array;\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    @Override\n    protected Class\u003c? extends Annotation\u003e[] getMethodAnnotations() {\n        if (methodAnnotations == null) {\n            methodAnnotations = new Class[] { MyAnnotation2.class };\n        }\n        return methodAnnotations;\n    }\n\n    @Override\n    protected void methodAnnotationScanned(Class\u003c?\u003e targetClass, Method method, Class\u003c? extends Annotation\u003e methodAnnotation) {\n        System.out.println(\"Method annotation scanned, targetClass=\" + targetClass + \", method=\" + method + \", methodAnnotation=\" + methodAnnotation);\n    }\n}\n```\n\n更复杂的用法请参考com.nepxion.matrix.proxy.complex目录下的代码\n\n## Spring Registrar机制的示例\n\u003e 参考matrix-spring-boot-registrar-example\n\n## Spring Import Selector机制的示例\n\u003e 参考matrix-spring-boot-selector-example\n\n## 请联系我\n微信、钉钉、公众号和文档\n\n![](https://nepxion.github.io/Discovery/docs/contact-doc/wechat-1.jpg)![](https://nepxion.github.io/Discovery/docs/contact-doc/dingding-1.jpg)![](https://nepxion.github.io/Discovery/docs/contact-doc/gongzhonghao-1.jpg)![](https://nepxion.github.io/Discovery/docs/contact-doc/document-1.jpg)\n\n## Star走势图\n[![Stargazers over time](https://starchart.cc/Nepxion/Matrix.svg)](https://starchart.cc/Nepxion/Matrix)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNepxion%2FMatrix","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FNepxion%2FMatrix","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNepxion%2FMatrix/lists"}