ResourceAnnotationProvider改ResourceAnnotationLoader

This commit is contained in:
redkale
2024-02-29 10:51:18 +08:00
parent 2b6e44015b
commit 94bc2a512d
5 changed files with 33 additions and 48 deletions

View File

@@ -27,7 +27,6 @@ module org.redkale {
exports org.redkale.convert.proto; exports org.redkale.convert.proto;
exports org.redkale.convert.spi; exports org.redkale.convert.spi;
exports org.redkale.inject; exports org.redkale.inject;
exports org.redkale.inject.spi;
exports org.redkale.lock; exports org.redkale.lock;
exports org.redkale.lock.spi; exports org.redkale.lock.spi;
exports org.redkale.mq; exports org.redkale.mq;
@@ -50,7 +49,6 @@ module org.redkale {
uses org.redkale.cache.spi.CacheManagerProvider; uses org.redkale.cache.spi.CacheManagerProvider;
uses org.redkale.cluster.spi.ClusterAgentProvider; uses org.redkale.cluster.spi.ClusterAgentProvider;
uses org.redkale.convert.spi.ConvertProvider; uses org.redkale.convert.spi.ConvertProvider;
uses org.redkale.inject.spi.ResourceAnnotationProvider;
uses org.redkale.mq.spi.MessageAgentProvider; uses org.redkale.mq.spi.MessageAgentProvider;
uses org.redkale.schedule.spi.ScheduleManagerProvider; uses org.redkale.schedule.spi.ScheduleManagerProvider;
uses org.redkale.source.spi.CacheSourceProvider; uses org.redkale.source.spi.CacheSourceProvider;

View File

@@ -1,26 +1,24 @@
/* /*
* To change this license header, choose License Headers in Project Properties. *
* To change this template file, choose Tools | Templates */
* and open the template in the editor. package org.redkale.inject;
*/
package org.redkale.inject.spi; import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field; /**
import org.redkale.inject.ResourceFactory; * 自定义注入加载器
*
/** * <p>
* 自定义注入加载器 * 详情见: https://redkale.org
* *
* <p> * @since 2.8.0
* 详情见: https://redkale.org * @author zhangjx
* * @param <T> Annotation
* @author zhangjx */
* @param <T> Annotation public interface ResourceAnnotationLoader<T extends Annotation> {
*/
public interface ResourceAnnotationProvider<T extends Annotation> { public void load(ResourceFactory factory, String srcResourceName, Object srcObj, T annotation, Field field, Object attachment);
public void load(ResourceFactory factory, String srcResourceName, Object srcObj, T annotation, Field field, Object attachment); public Class<T> annotationType();
}
public Class<T> annotationType();
}

View File

@@ -18,7 +18,6 @@ import java.util.logging.*;
import org.redkale.annotation.*; import org.redkale.annotation.*;
import org.redkale.convert.*; import org.redkale.convert.*;
import org.redkale.convert.json.JsonConvert; import org.redkale.convert.json.JsonConvert;
import org.redkale.inject.spi.ResourceAnnotationProvider;
import org.redkale.util.RedkaleClassLoader; import org.redkale.util.RedkaleClassLoader;
import org.redkale.util.RedkaleException; import org.redkale.util.RedkaleException;
import org.redkale.util.TypeToken; import org.redkale.util.TypeToken;
@@ -52,7 +51,7 @@ public final class ResourceFactory {
private final List<WeakReference<ResourceFactory>> chidren = new CopyOnWriteArrayList<>(); private final List<WeakReference<ResourceFactory>> chidren = new CopyOnWriteArrayList<>();
private final ConcurrentHashMap<Class<? extends Annotation>, ResourceAnnotationProvider> resAnnotationProviderMap = new ConcurrentHashMap(); private final ConcurrentHashMap<Class<? extends Annotation>, ResourceAnnotationLoader> resAnnotationLoaderMap = new ConcurrentHashMap();
private final ConcurrentHashMap<Type, ResourceTypeLoader> resTypeLoaderMap = new ConcurrentHashMap(); private final ConcurrentHashMap<Type, ResourceTypeLoader> resTypeLoaderMap = new ConcurrentHashMap();
@@ -60,16 +59,6 @@ public final class ResourceFactory {
private ResourceFactory(ResourceFactory parent) { private ResourceFactory(ResourceFactory parent) {
this.parent = parent; this.parent = parent;
if (parent == null) {
ServiceLoader<ResourceAnnotationProvider> loaders = ServiceLoader.load(ResourceAnnotationProvider.class);
RedkaleClassLoader.putServiceLoader(ResourceAnnotationProvider.class);
Iterator<ResourceAnnotationProvider> it = loaders.iterator();
while (it.hasNext()) {
ResourceAnnotationProvider ril = it.next();
RedkaleClassLoader.putReflectionPublicConstructors(ril.getClass(), ril.getClass().getName());
this.resAnnotationProviderMap.put(ril.annotationType(), ril);
}
}
} }
/** /**
@@ -857,7 +846,7 @@ public final class ResourceFactory {
try { try {
list.add(srcObj); list.add(srcObj);
Class clazz = srcObj.getClass(); Class clazz = srcObj.getClass();
final boolean diyLoaderFlag = !parentRoot().resAnnotationProviderMap.isEmpty(); final boolean diyLoaderFlag = !parentRoot().resAnnotationLoaderMap.isEmpty();
do { do {
if (java.lang.Enum.class.isAssignableFrom(clazz)) { if (java.lang.Enum.class.isAssignableFrom(clazz)) {
break; break;
@@ -897,7 +886,7 @@ public final class ResourceFactory {
} }
} }
if (flag && diyLoaderFlag) { if (flag && diyLoaderFlag) {
parentRoot().resAnnotationProviderMap.values().stream().forEach(iloader -> { parentRoot().resAnnotationLoaderMap.values().stream().forEach(iloader -> {
Annotation ann = field.getAnnotation(iloader.annotationType()); Annotation ann = field.getAnnotation(iloader.annotationType());
if (ann != null) { if (ann != null) {
iloader.load(this, srcResourceName, srcObj, ann, field, attachment); iloader.load(this, srcResourceName, srcObj, ann, field, attachment);
@@ -1062,9 +1051,9 @@ public final class ResourceFactory {
} }
} }
public <T extends Annotation> void register(final ResourceAnnotationProvider<T> loader) { public <T extends Annotation> void register(final ResourceAnnotationLoader<T> loader) {
Objects.requireNonNull(loader); Objects.requireNonNull(loader);
parentRoot().resAnnotationProviderMap.put(loader.annotationType(), loader); parentRoot().resAnnotationLoaderMap.put(loader.annotationType(), loader);
} }
public void register(final ResourceTypeLoader rs, final Type... clazzs) { public void register(final ResourceTypeLoader rs, final Type... clazzs) {

View File

@@ -23,10 +23,10 @@ import org.redkale.boot.ClassFilter;
import org.redkale.boot.ModuleEngine; import org.redkale.boot.ModuleEngine;
import org.redkale.boot.NodeServer; import org.redkale.boot.NodeServer;
import org.redkale.convert.json.JsonConvert; import org.redkale.convert.json.JsonConvert;
import org.redkale.inject.ResourceAnnotationLoader;
import org.redkale.inject.ResourceEvent; import org.redkale.inject.ResourceEvent;
import org.redkale.inject.ResourceFactory; import org.redkale.inject.ResourceFactory;
import org.redkale.inject.ResourceTypeLoader; import org.redkale.inject.ResourceTypeLoader;
import org.redkale.inject.spi.ResourceAnnotationProvider;
import org.redkale.mq.MessageConsumer; import org.redkale.mq.MessageConsumer;
import org.redkale.mq.MessageManager; import org.redkale.mq.MessageManager;
import org.redkale.mq.MessageProducer; import org.redkale.mq.MessageProducer;
@@ -187,7 +187,7 @@ public class MessageModuleEngine extends ModuleEngine {
} }
this.messageAgents = mqs; this.messageAgents = mqs;
//------------------------------------ 注册 ResourceProducer MessageProducer ------------------------------------ //------------------------------------ 注册 ResourceProducer MessageProducer ------------------------------------
resourceFactory.register(new ResourceAnnotationProvider<ResourceProducer>() { resourceFactory.register(new ResourceAnnotationLoader<ResourceProducer>() {
@Override @Override
public void load(ResourceFactory rf, String srcResourceName, Object srcObj, ResourceProducer annotation, Field field, Object attachment) { public void load(ResourceFactory rf, String srcResourceName, Object srcObj, ResourceProducer annotation, Field field, Object attachment) {
if (field.getType() != MessageProducer.class) { if (field.getType() != MessageProducer.class) {

View File

@@ -12,8 +12,8 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import org.junit.jupiter.api.*; import org.junit.jupiter.api.*;
import org.redkale.convert.json.JsonConvert; import org.redkale.convert.json.JsonConvert;
import org.redkale.inject.ResourceAnnotationLoader;
import org.redkale.inject.ResourceFactory; import org.redkale.inject.ResourceFactory;
import org.redkale.inject.spi.ResourceAnnotationProvider;
/** /**
* *
@@ -38,7 +38,7 @@ public class ResourceAnnotationTest {
if (!main) Assertions.assertEquals(new File("conf/test.xml").toString(), bean.conf.toString()); if (!main) Assertions.assertEquals(new File("conf/test.xml").toString(), bean.conf.toString());
} }
public static class CustomConfProvider implements ResourceAnnotationProvider<CustomConf> { public static class CustomConfProvider implements ResourceAnnotationLoader<CustomConf> {
@Override @Override
public void load(ResourceFactory factory, String srcResourceName, Object srcObj, CustomConf annotation, Field field, Object attachment) { public void load(ResourceFactory factory, String srcResourceName, Object srcObj, CustomConf annotation, Field field, Object attachment) {