From 70db0fad5d34ae090245b14a56c2f8f2ab96d215 Mon Sep 17 00:00:00 2001 From: aoshiguchen <1052045476@qq.com> Date: Fri, 8 Jul 2022 20:11:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E@Singleton=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=EF=BC=8C=E4=BD=BF=E5=BE=97=E6=99=AE=E9=80=9A=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E4=B9=9F=E8=83=BD=E6=96=B9=E4=BE=BF=E7=9A=84=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E5=8D=95=E4=BE=8B=E5=8A=9F=E8=83=BD=EF=BC=8C@Bean=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3=E7=BB=A7=E6=89=BF@@Singleton=E6=B3=A8=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../asgc/neutrino/core/annotation/Bean.java | 1 + .../neutrino/core/annotation/Singleton.java | 37 +++++++++++++++++++ .../{bean => aop}/SingletonInterceptor.java | 3 +- .../aop/interceptor/InterceptorFactory.java | 7 ++++ .../neutrino/core/bean/SimpleBeanFactory.java | 3 +- .../asgc/neutrino/core/util/ClassUtil.java | 32 ++++++++++++++++ .../fun/asgc/neutrino/core/aop/Giraffe.java | 4 ++ .../fun/asgc/neutrino/core/aop/Test5.java | 10 +++++ 8 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 neutrino-core/src/main/java/fun/asgc/neutrino/core/annotation/Singleton.java rename neutrino-core/src/main/java/fun/asgc/neutrino/core/{bean => aop}/SingletonInterceptor.java (95%) diff --git a/neutrino-core/src/main/java/fun/asgc/neutrino/core/annotation/Bean.java b/neutrino-core/src/main/java/fun/asgc/neutrino/core/annotation/Bean.java index d1e9f796..efc4607a 100644 --- a/neutrino-core/src/main/java/fun/asgc/neutrino/core/annotation/Bean.java +++ b/neutrino-core/src/main/java/fun/asgc/neutrino/core/annotation/Bean.java @@ -34,6 +34,7 @@ import java.lang.annotation.Target; */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) +@Singleton public @interface Bean { String value() default ""; } diff --git a/neutrino-core/src/main/java/fun/asgc/neutrino/core/annotation/Singleton.java b/neutrino-core/src/main/java/fun/asgc/neutrino/core/annotation/Singleton.java new file mode 100644 index 00000000..05a284f5 --- /dev/null +++ b/neutrino-core/src/main/java/fun/asgc/neutrino/core/annotation/Singleton.java @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2022 aoshiguchen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package fun.asgc.neutrino.core.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author: aoshiguchen + * @date: 2022/7/8 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) +public @interface Singleton { + boolean value() default true; +} diff --git a/neutrino-core/src/main/java/fun/asgc/neutrino/core/bean/SingletonInterceptor.java b/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/SingletonInterceptor.java similarity index 95% rename from neutrino-core/src/main/java/fun/asgc/neutrino/core/bean/SingletonInterceptor.java rename to neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/SingletonInterceptor.java index 7469535f..bac4f209 100644 --- a/neutrino-core/src/main/java/fun/asgc/neutrino/core/bean/SingletonInterceptor.java +++ b/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/SingletonInterceptor.java @@ -19,9 +19,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package fun.asgc.neutrino.core.bean; +package fun.asgc.neutrino.core.aop; -import fun.asgc.neutrino.core.aop.Invocation; import fun.asgc.neutrino.core.aop.interceptor.Interceptor; import fun.asgc.neutrino.core.util.LockUtil; diff --git a/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/interceptor/InterceptorFactory.java b/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/interceptor/InterceptorFactory.java index 79053b5c..537396ad 100644 --- a/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/interceptor/InterceptorFactory.java +++ b/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/interceptor/InterceptorFactory.java @@ -21,7 +21,9 @@ */ package fun.asgc.neutrino.core.aop.interceptor; +import fun.asgc.neutrino.core.annotation.Singleton; import fun.asgc.neutrino.core.aop.Intercept; +import fun.asgc.neutrino.core.aop.SingletonInterceptor; import fun.asgc.neutrino.core.base.GlobalConfig; import fun.asgc.neutrino.core.cache.Cache; import fun.asgc.neutrino.core.cache.MemoryCache; @@ -262,6 +264,11 @@ public class InterceptorFactory { } } } + Singleton singleton = ClassUtil.getAnnotation(targetMethod, Singleton.class); + if (null != singleton && singleton.value()) { + SingletonInterceptor interceptor = getOrNew(SingletonInterceptor.class); + interceptors.add(interceptor); + } return interceptors; } diff --git a/neutrino-core/src/main/java/fun/asgc/neutrino/core/bean/SimpleBeanFactory.java b/neutrino-core/src/main/java/fun/asgc/neutrino/core/bean/SimpleBeanFactory.java index 41c92f69..6efe9e4b 100644 --- a/neutrino-core/src/main/java/fun/asgc/neutrino/core/bean/SimpleBeanFactory.java +++ b/neutrino-core/src/main/java/fun/asgc/neutrino/core/bean/SimpleBeanFactory.java @@ -24,6 +24,7 @@ package fun.asgc.neutrino.core.bean; import com.google.common.collect.Lists; import fun.asgc.neutrino.core.annotation.*; import fun.asgc.neutrino.core.aop.Aop; +import fun.asgc.neutrino.core.aop.SingletonInterceptor; import fun.asgc.neutrino.core.aop.interceptor.ExceptionHandler; import fun.asgc.neutrino.core.aop.interceptor.Filter; import fun.asgc.neutrino.core.aop.interceptor.Interceptor; @@ -117,8 +118,6 @@ public class SimpleBeanFactory extends AbstractBeanFactory { if (null == bean) { continue; } - Aop.intercept(method, SingletonInterceptor.class); - String beanName = bean.value(); if (StringUtil.isEmpty(beanName)) { beanName = method.getName(); diff --git a/neutrino-core/src/main/java/fun/asgc/neutrino/core/util/ClassUtil.java b/neutrino-core/src/main/java/fun/asgc/neutrino/core/util/ClassUtil.java index c469e0bf..93f4fa34 100644 --- a/neutrino-core/src/main/java/fun/asgc/neutrino/core/util/ClassUtil.java +++ b/neutrino-core/src/main/java/fun/asgc/neutrino/core/util/ClassUtil.java @@ -31,6 +31,7 @@ import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.lang.annotation.Annotation; +import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.net.JarURLConnection; import java.net.URL; @@ -213,6 +214,37 @@ public class ClassUtil { return annotation; } + public static T getAnnotation(Method method, Class annotationType) { + T annotation = method.getAnnotation(annotationType); + if (null == annotation) { + Annotation[] annotations = method.getAnnotations(); + for (Annotation item : annotations) { + Class aClass = item.annotationType(); + if (aClass.isAnnotationPresent(annotationType)) { + return aClass.getAnnotation(annotationType); + } + } + } + return annotation; + } + + public static boolean isAnnotationPresent(Method method, Class annotationType) { + Annotation annotation = method.getAnnotation(annotationType); + if (null != annotation) { + return true; + } + if (null == annotation) { + Annotation[] annotations = method.getAnnotations(); + for (Annotation item : annotations) { + Class aClass = item.annotationType(); + if (aClass.isAnnotationPresent(annotationType)) { + return true; + } + } + } + return false; + } + public static boolean isPublic(Class clazz) { return Modifier.isPublic(clazz.getModifiers()); } diff --git a/neutrino-core/src/test/java/fun/asgc/neutrino/core/aop/Giraffe.java b/neutrino-core/src/test/java/fun/asgc/neutrino/core/aop/Giraffe.java index 6afb98e7..b869d9d1 100644 --- a/neutrino-core/src/test/java/fun/asgc/neutrino/core/aop/Giraffe.java +++ b/neutrino-core/src/test/java/fun/asgc/neutrino/core/aop/Giraffe.java @@ -22,6 +22,8 @@ package fun.asgc.neutrino.core.aop; +import fun.asgc.neutrino.core.annotation.Singleton; + import java.util.Arrays; /** @@ -34,7 +36,9 @@ public class Giraffe { System.out.println("运行:" + Arrays.toString(args)); } + @Singleton public Dog getDog() { + System.out.println("new Dog"); return new Dog(); } } diff --git a/neutrino-core/src/test/java/fun/asgc/neutrino/core/aop/Test5.java b/neutrino-core/src/test/java/fun/asgc/neutrino/core/aop/Test5.java index 44a88286..5710b5c5 100644 --- a/neutrino-core/src/test/java/fun/asgc/neutrino/core/aop/Test5.java +++ b/neutrino-core/src/test/java/fun/asgc/neutrino/core/aop/Test5.java @@ -52,4 +52,14 @@ public class Test5 { panda.say("hello"); } + + /** + * 单例测试 + * @throws Exception + */ + @Test + public void test3() throws Exception{ + Giraffe giraffe = Aop.get(Giraffe.class); + System.out.println(giraffe.getDog() == giraffe.getDog()); + } }