{"id":21803038,"url":"https://github.com/litongjava/jfinal-aop","last_synced_at":"2025-09-23T15:56:55.452Z","repository":{"id":197415248,"uuid":"698605032","full_name":"litongjava/jfinal-aop","owner":"litongjava","description":null,"archived":false,"fork":false,"pushed_at":"2025-01-10T03:40:32.000Z","size":205,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-10T04:28:09.006Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/litongjava.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":"2023-09-30T12:16:10.000Z","updated_at":"2025-01-10T03:40:36.000Z","dependencies_parsed_at":null,"dependency_job_id":"ecd9761e-3d8a-409b-b005-4c28bc2dad26","html_url":"https://github.com/litongjava/jfinal-aop","commit_stats":null,"previous_names":["litongjava/jfinal-aop"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litongjava%2Fjfinal-aop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litongjava%2Fjfinal-aop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litongjava%2Fjfinal-aop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litongjava%2Fjfinal-aop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/litongjava","download_url":"https://codeload.github.com/litongjava/jfinal-aop/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":235661856,"owners_count":19025609,"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":[],"created_at":"2024-11-27T11:37:37.679Z","updated_at":"2025-09-23T15:56:50.416Z","avatar_url":"https://github.com/litongjava.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# jfinal-aop\n\nfrom jfinal, based on jvm's native high-performance aop framework\n\nThe package is distributed through Maven Central.\n[jfinal-aop](https://central.sonatype.com/artifact/com.litongjava/jfinal-aop),\n```\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.litongjava\u003c/groupId\u003e\n  \u003cartifactId\u003ejfinal-aop\u003c/artifactId\u003e\n  \u003cversion\u003e1.1.7\u003c/version\u003e\n\u003c/dependency\u003e\n```\n## usage\n### 创建类实例并调用\n```\npackage com.litongjava.jfinal.aop;\n\nimport org.junit.Test;\n\npublic class AopTest {\n\n  @Test\n  public void test() {\n    TestServices testServices = Aop.get(TestServices.class);\n    testServices.print();\n  }\n}\n```\n### 切面使用\n1. `Cat` 类：\n这是一个简单的类，包含一个名为 `eat` 的方法。这个方法被 `@Before(Aspect1.class)` 注解修饰，表示在调用 `eat` 方法之前，会先执行 `Aspect1` 类的 `intercept` 方法。\n\n```\npackage com.issues01;\n\nimport com.litongjava.jfinal.aop.Before;\n\npublic class Cat {\n  @Before(Aspect1.class)\n  public String eat() {\n    return \"eat chat\";\n  }\n}\n```\n2. `Aspect1` 类：\n这是一个拦截器类，实现了 `Interceptor` 接口。在 `intercept` 方法中，它首先打印出 \"Before Aspect1 invoking\"，然后获取被拦截方法的相关信息，包括方法对象、方法名、参数和目标对象，并打印出这些信息。然后，它调用 `invocation.invoke()` 执行被拦截的方法，并将返回值设置为 \"set new value\"。最后，打印出 \"After Aspect1 invoking\"。\n\n```\npackage com.issues01;\n\nimport com.litongjava.jfinal.aop.Interceptor;\nimport com.litongjava.jfinal.aop.Invocation;\nimport lombok.extern.slf4j.Slf4j;\n\nimport java.lang.reflect.Method;\nimport java.util.Arrays;\n\n\n@Slf4j\npublic class Aspect1 implements Interceptor {\n\n  @Override\n  public void intercept(Invocation invocation) {\n    System.out.println(\"Before Aspect1 invoking\");\n    Method method = invocation.getMethod();\n    String methodName = invocation.getMethodName();\n    Object[] args = invocation.getArgs();\n    Object target = invocation.getTarget();\n    log.info(\"method:{}\", method);\n    log.info(\"methodName:{}\", methodName);\n    log.info(\"args:{}\", Arrays.toString(args));\n    log.info(\"target:{}\", target);\n    Object invoke = invocation.invoke();\n    invocation.setReturnValue(\"set new value\");\n    log.info(\"invoke:{}\", invoke);\n\n    System.out.println(\"After Aspect1 invoking\");\n  }\n}\n```\n\n3. `CatMainTest` 类：\n这是主类，包含 `main` 方法和 `index` 方法。在 `main` 方法中运行 `index` 方法。在 `index` 方法中，它首先打印出 Java 版本，然后获取 `Cat` 类的实例，并调用 `eat` 方法，最后打印出 `eat` 方法的返回值。\n\n```\npackage com.issues01;\n\nimport com.litongjava.jfinal.aop.Aop;\n\n\npublic class CatMainTest {\n\n  public static void main(String[] args) {\n    new CatMainTest().index();\n    //SimpleApp.run(CatMainTest.class.getName(), \"index\");\n  }\n\n  public void index() {\n    String javaVersion = System.getProperty(\"java.version\");\n    System.out.println(\"java-version:\" + javaVersion);\n    // ProxyManager.me().setProxyFactory(new CglibProxyFactory());\n    Cat cat = Aop.get(Cat.class);\n    String eat = cat.eat();\n    System.out.println(\"result:\" + eat);\n  }\n}\n\n```\noutput\n```\njava-version:1.8.0_121\n22:34:33.877 [main] DEBUG com.litongjava.jfinal.proxy.ProxyGenerator - \nGenerate proxy class \"com.issues01.Cat$$EnhancerByJFinal\":\npackage com.issues01;\nimport com.litongjava.jfinal.aop.Invocation;\npublic class Cat$$EnhancerByJFinal extends Cat {\n\t\n\tpublic  java.lang.String eat() {\n\t\tInvocation inv = new Invocation(this, 1L,\n\t\t\targs -\u003e {\n\t\t\t\treturn  Cat$$EnhancerByJFinal.super.eat(\n\t\t\t\t\t);\n\t\t\t\t\n\t\t\t}\n\t\t\t);\n\t\t\n\t\tinv.invoke();\n\t\t\n\t\treturn inv.getReturnValue();\n\t}\n}\n\n\nBefore Aspect1 invoking\n22:34:34.250 [main] INFO com.issues01.Aspect1 - method:public java.lang.String com.issues01.Cat.eat()\n22:34:34.251 [main] INFO com.issues01.Aspect1 - methodName:eat\n22:34:34.251 [main] INFO com.issues01.Aspect1 - args:[]\n22:34:34.251 [main] INFO com.issues01.Aspect1 - target:com.issues01.Cat$$EnhancerByJFinal@55a561cf\n22:34:34.251 [main] INFO com.issues01.Aspect1 - invoke:eat chat\nAfter Aspect1 invoking\nresult:set new value\n```\n\n### 扫描类并初始化\n这段代码主要包含四个部分：`DemoService` 接口，`DemoServiceImpl` 类，`DemoController` 类和 `DemoApp` 类。\n\n1. `DemoService` 接口：\n这是一个简单的接口，定义了一个 `Hello` 方法。\n\n```java\npackage com.issues02;\n\npublic interface DemoService {\n  public String Hello();\n}\n```\n\n2. `DemoServiceImpl` 类：\n这是 `DemoService` 接口的实现类，它被 `@Service` 注解修饰，表示它是一个服务类。在 `Hello` 方法中，它返回了一个字符串 \"Hello\"。\n\n```java\npackage com.issues02;\n\nimport com.litongjava.jfinal.aop.annotation.Service;\n\n@Service\npublic class DemoServiceImpl implements DemoService {\n\n  public String Hello(){\n    return \"Hello\";\n  }\n}\n```\n\n3. `DemoController` 类：\n这是一个控制器类，被 `@Controller` 注解修饰。它包含一个 `DemoService` 类型的成员变量 `demoService`，并使用 `@Autowired` 注解进行自动注入。在 `hello` 方法中，它调用了 `demoService` 的 `Hello` 方法，并返回了其结果。\n\n```java\npackage com.issues02;\n\nimport com.litongjava.jfinal.aop.Autowired;\nimport com.litongjava.jfinal.aop.Inject;\nimport com.litongjava.jfinal.aop.annotation.Controller;\n\nimport java.lang.annotation.Inherited;\n\n\n@Controller\npublic class DemoController {\n\n//  @Inject\n//  private DemoService demoService;\n\n  @Autowired\n  private DemoService demoService;\n\n  public String hello() {\n    return demoService.Hello();\n  }\n}\n```\n\n4. `DemoApp` 类：\n这是主类，包含 `main` 方法。在 `main` 方法中，它首先扫描 `DemoApp` 类所在的包，然后初始化注解。接着，它获取 `DemoController` 类的实例，并调用 `hello` 方法，最后打印出 `hello` 方法的返回值。\n\n```java\npackage com.issues02;\n\nimport com.litongjava.jfinal.aop.Aop;\nimport com.litongjava.jfinal.aop.annotation.ComponentScan;\nimport com.litongjava.jfinal.aop.process.BeanProcess;\nimport com.litongjava.jfinal.aop.scaner.ComponentScanner;\n\nimport java.util.List;\n\n@ComponentScan\npublic class DemoApp {\n  public static void main(String[] args) throws Exception {\n    List\u003cClass\u003c?\u003e\u003e scannedClasses = Aop.scan(DemoApp.class);\n    Aop.initAnnotation(scannedClasses);\n\n    DemoController demoController = Aop.get(DemoController.class);\n    String hello = demoController.hello();\n    System.out.println(hello);\n    Aop.close();\n  }\n}\n\n```\n\noutput\n```\nHello\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flitongjava%2Fjfinal-aop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flitongjava%2Fjfinal-aop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flitongjava%2Fjfinal-aop/lists"}