增加ResourceInjected功能

This commit is contained in:
redkale
2023-12-19 09:53:46 +08:00
parent d3a6f46c6c
commit 24a043195a
20 changed files with 257 additions and 75 deletions

View File

@@ -11,7 +11,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
/** /**
* &#64;Resource资源被更新时的监听事件, 本注解只能标记在方法参数为ResourceEvent[] <br> * &#64;Resource资源被更新时的监听事件, 本注解只能标记在方法参数为ResourceEvent[] <br>
* 注意: 一个类只能存在一个&#64;ResourceListener的方法 多余的会被忽略 <br> * 注意: 一个类只能存在一个&#64;ResourceChanged的方法 多余的会被忽略 <br>
* 方法在资源被更新以后调用 * 方法在资源被更新以后调用
* *
* <blockquote><pre> * <blockquote><pre>
@@ -23,22 +23,21 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
* &#64;Resource(name = "record.name") * &#64;Resource(name = "record.name")
* private String name; * private String name;
* *
* &#64;ResourceListener * &#64;ResourceChanged
* private void changeResource(ResourceEvent[] events) { * private void changeResource(ResourceEvent[] events) {
* for(ResourceEvent event : events) { * for(ResourceEvent event : events) {
* System.out .println("@Resource = " + event.name() + " 资源变更: newVal = " + event.newValue() + ", oldVal = " + event.oldValue()); * System.out .println("@Resource = " + event.name() + " 资源变更: newVal = " + event.newValue() + ", oldVal = " + event.oldValue());
* } * }
* } * }
*
* public static void main(String[] args) throws Exception {
* ResourceFactory factory = ResourceFactory.root();
* factory.register("record.id", "2345");
* factory.register("record.name", "my old name");
* Record record = new Record();
* factory.inject(record);
* factory.register("record.name", "my new name");
* }
* *
* public static void main(String[] args) throws Exception {
* ResourceFactory factory = ResourceFactory.create();
* factory.register("record.id", "2345");
* factory.register("record.name", "my old name");
* Record record = new Record();
* factory.inject(record);
* factory.register("record.name", "my new name");
* }
* } * }
* </pre></blockquote> * </pre></blockquote>
* *
@@ -50,12 +49,12 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Documented @Documented
@Target({METHOD}) @Target({METHOD})
@Retention(RUNTIME) @Retention(RUNTIME)
public @interface ResourceListener { public @interface ResourceChanged {
/** /**
* 新旧值是否不同时才回调方法 <br> * 新旧值是否不同时才回调方法 <br>
* true: 新值与旧值不同时才回调ResourceListener方法 * true: 新值与旧值不同时才回调ResourceChanged方法
* false: 只要执行了ResourceFactory.register 就回调ResourceListener方法 * false: 只要执行了ResourceFactory.register 就回调ResourceChanged方法
* *
* @since 2.7.0 * @since 2.7.0
* @return boolean * @return boolean

View File

@@ -0,0 +1,63 @@
/*
* 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.annotation;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* &#64;Resource资源被依赖注入时的监听事件。<br>
* 本注解只能标记在空参数或者(String、Object、java.lang.reflect.Field)三个参数类型的任意组合方法上 <br>
* 方法在资源被依赖注入后调用。
*
* <blockquote><pre>
* public class ResourceService implements Service {
*
* &#64;Resource(name = "res.id")
* private int id;
*
* &#64;Resource(name = "res.name")
* private String name;
*
* &#64;ResourceInjected
* private void onInjected(Object src, String fieldName) {
* System.out .println("资源被注入到对象(" + src + ")的字段(" + fieldName + ")上");
* }
* }
*
* public class RecordService implements Service {
*
* &#64;Resource
* private ResourceService resService;
*
* public void test() {
* }
*
* public static void main(String[] args) throws Exception {
* ResourceFactory factory = ResourceFactory.create();
* factory.register("res.id", "2345");
* factory.register("res.name", "my old name");
* ResourceService res = new ResourceService();
* factory.inject(res);
* factory.register("", res);
* RecordService serice = new RecordService();
* factory.inject(record);
* }
* }
* </pre></blockquote>
*
* <p>
* 详情见: https://redkale.org
*
* @author zhangjx
*/
@Documented
@Target({METHOD})
@Retention(RUNTIME)
public @interface ResourceInjected {
}

View File

@@ -11,7 +11,6 @@ import java.util.concurrent.*;
import java.util.concurrent.atomic.*; import java.util.concurrent.atomic.*;
import java.util.logging.Level; import java.util.logging.Level;
import org.redkale.annotation.*; import org.redkale.annotation.*;
import org.redkale.annotation.ResourceListener;
import org.redkale.boot.*; import org.redkale.boot.*;
import org.redkale.convert.json.JsonConvert; import org.redkale.convert.json.JsonConvert;
import org.redkale.inject.Resourcable; import org.redkale.inject.Resourcable;
@@ -19,6 +18,7 @@ import org.redkale.inject.ResourceEvent;
import org.redkale.service.Service; import org.redkale.service.Service;
import org.redkale.source.CacheSource; import org.redkale.source.CacheSource;
import org.redkale.util.*; import org.redkale.util.*;
import org.redkale.annotation.ResourceChanged;
/** /**
* 使用CacheSource实现的第三方服务发现管理接口cluster * 使用CacheSource实现的第三方服务发现管理接口cluster
@@ -60,7 +60,7 @@ public class CacheClusterAgent extends ClusterAgent implements Resourcable {
} }
@Override @Override
@ResourceListener @ResourceChanged
public void onResourceChange(ResourceEvent[] events) { public void onResourceChange(ResourceEvent[] events) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
int newTtls = this.ttls; int newTtls = this.ttls;

View File

@@ -13,7 +13,6 @@ import java.util.concurrent.*;
import java.util.logging.*; import java.util.logging.*;
import org.redkale.annotation.*; import org.redkale.annotation.*;
import org.redkale.annotation.AutoLoad; import org.redkale.annotation.AutoLoad;
import org.redkale.annotation.ResourceListener;
import org.redkale.boot.*; import org.redkale.boot.*;
import static org.redkale.boot.Application.*; import static org.redkale.boot.Application.*;
import org.redkale.convert.ConvertDisabled; import org.redkale.convert.ConvertDisabled;
@@ -24,6 +23,7 @@ import org.redkale.net.http.*;
import org.redkale.net.sncp.*; import org.redkale.net.sncp.*;
import org.redkale.service.*; import org.redkale.service.*;
import org.redkale.util.*; import org.redkale.util.*;
import org.redkale.annotation.ResourceChanged;
/** /**
* 服务注册中心管理类cluster * 服务注册中心管理类cluster
@@ -103,7 +103,7 @@ public abstract class ClusterAgent {
} }
} }
@ResourceListener @ResourceChanged
public abstract void onResourceChange(ResourceEvent[] events); public abstract void onResourceChange(ResourceEvent[] events);
public void destroy(AnyValue config) { public void destroy(AnyValue config) {

View File

@@ -114,10 +114,16 @@ public final class ResourceFactory {
this.store.clear(); this.store.clear();
} }
/**
* inject时的锁
*/
public void lock() { public void lock() {
lock.lock(); lock.lock();
} }
/**
* inject时的锁
*/
public void unlock() { public void unlock() {
lock.unlock(); lock.unlock();
} }
@@ -139,6 +145,13 @@ public final class ResourceFactory {
} }
} }
/**
* 获取资源的注入类型class存在ResourceType注解的优先用ResourceType.value, 没有则使用type本身的class
*
* @param type 资源类型
*
* @return 注入的Type
*/
public static Class getResourceType(Type type) { public static Class getResourceType(Type type) {
Class<?> clazz = TypeToken.typeToClass(type); Class<?> clazz = TypeToken.typeToClass(type);
ResourceType rt = clazz.getAnnotation(ResourceType.class); ResourceType rt = clazz.getAnnotation(ResourceType.class);
@@ -201,7 +214,7 @@ public final class ResourceFactory {
if (rs == null) { if (rs == null) {
return null; return null;
} }
return (A) register(autoSync, "", rs); return register(autoSync, "", rs);
} }
/** /**
@@ -494,8 +507,8 @@ public final class ResourceFactory {
if (entry != null && entry.elements != null) { if (entry != null && entry.elements != null) {
for (ResourceElement element : entry.elements) { for (ResourceElement element : entry.elements) {
Object dest = element.dest.get(); Object dest = element.dest.get();
if (dest != null && element.listener != null) { if (dest != null && element.changedMethod != null) {
envListenMap.put(dest, element.listener); envListenMap.put(dest, element.changedMethod);
} }
} }
} }
@@ -512,7 +525,7 @@ public final class ResourceFactory {
if (envListenMap.containsKey(dest)) { if (envListenMap.containsKey(dest)) {
return; //跳过含有@Resource Environment字段的对象 return; //跳过含有@Resource Environment字段的对象
} }
Method listener = list.get(0).listener; Method listener = list.get(0).method;
try { try {
ResourceEvent[] events = new ResourceEvent[list.size()]; ResourceEvent[] events = new ResourceEvent[list.size()];
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
@@ -618,7 +631,10 @@ public final class ResourceFactory {
*/ */
public <A> boolean contains(boolean recursive, String name, Class<? extends A> clazz) { public <A> boolean contains(boolean recursive, String name, Class<? extends A> clazz) {
Map<String, ResourceEntry> map = this.store.get(clazz); Map<String, ResourceEntry> map = this.store.get(clazz);
return map == null ? ((recursive && parent != null) ? parent.contains(recursive, name, clazz) : false) : map.containsKey(name); if (map != null) {
return map.containsKey(name);
}
return recursive && parent != null && parent.contains(recursive, name, clazz);
} }
/** /**
@@ -1009,6 +1025,7 @@ public final class ResourceFactory {
} }
if (rs != null) { if (rs != null) {
field.set(srcObj, rs); field.set(srcObj, rs);
onResourceInjected(srcObj, field, rs);
} }
if (rs == null && rc1 != null && rc1.required()) { if (rs == null && rc1 != null && rc1.required()) {
String t = srcObj.getClass().getName(); String t = srcObj.getClass().getName();
@@ -1050,6 +1067,11 @@ public final class ResourceFactory {
return parent == null ? null : parent.findResourceTypeLoader(clazz); return parent == null ? null : parent.findResourceTypeLoader(clazz);
} }
public ResourceTypeLoader findTypeLoader(Type ft, Field field) {
ResourceTypeLoader it = this.findMatchTypeLoader(ft, field);
return it == null ? findRegxTypeLoader(ft, field) : it;
}
private ResourceFactory parentRoot() { private ResourceFactory parentRoot() {
if (parent == null) { if (parent == null) {
return this; return this;
@@ -1078,16 +1100,46 @@ public final class ResourceFactory {
if (t == ft) { if (t == ft) {
return en.getValue(); return en.getValue();
} }
if (t instanceof Class && (((Class) t)).isAssignableFrom(c)) { if (t instanceof Class && ((Class) t).isAssignableFrom(c)) {
return en.getValue(); return en.getValue();
} }
} }
return parent == null ? null : parent.findRegxTypeLoader(ft, field); return parent == null ? null : parent.findRegxTypeLoader(ft, field);
} }
public ResourceTypeLoader findTypeLoader(Type ft, Field field) { private void onResourceInjected(Object src, Field field, Object res) {
ResourceTypeLoader it = this.findMatchTypeLoader(ft, field); if (res == null || res.getClass().isPrimitive()
return it == null ? findRegxTypeLoader(ft, field) : it; || res.getClass().getName().startsWith("java.")
|| res.getClass().getName().startsWith("javax.")) {
return;
}
for (Method method : res.getClass().getDeclaredMethods()) {
ResourceInjected inj = method.getAnnotation(ResourceInjected.class);
if (inj == null) {
continue;
}
Class[] paramTypes = method.getParameterTypes();
Object[] params = new Object[paramTypes.length];
for (int i = 0; i < params.length; i++) {
if (paramTypes[i] == Object.class) {
params[i] = src;
} else if (paramTypes[i] == String.class) {
params[i] = field.getName();
} else if (paramTypes[i] == Field.class) {
params[i] = field;
} else {
throw new RedkaleException("illegal @" + ResourceInjected.class.getSimpleName() + " on method(" + method.getName() + ")");
}
}
try {
if (!Modifier.isPublic(method.getModifiers())) {
method.setAccessible(true);
}
method.invoke(res, params);
} catch (Exception e) {
throw new RedkaleException(e);
}
}
} }
private static class ResourceEntry<T> { private static class ResourceEntry<T> {
@@ -1143,7 +1195,7 @@ public final class ResourceFactory {
newVal = Array.get(Creator.newArray(classType, 1), 0); newVal = Array.get(Creator.newArray(classType, 1), 0);
} }
Object oldVal = null; Object oldVal = null;
if (element.listener != null) { if (element.changedMethod != null) {
try { try {
oldVal = element.field.get(dest); oldVal = element.field.get(dest);
} catch (Throwable e) { } catch (Throwable e) {
@@ -1155,14 +1207,14 @@ public final class ResourceFactory {
} catch (Throwable e) { } catch (Throwable e) {
e.printStackTrace(); e.printStackTrace();
} }
if (element.listener != null) { if (element.changedMethod != null) {
try { try {
if (!element.different || !Objects.equals(newVal, oldVal)) { if (!element.different || !Objects.equals(newVal, oldVal)) {
if (wrappers == null) { if (wrappers == null) {
Object[] ps = new Object[]{new ResourceEvent[]{ResourceEvent.create(name, newVal, oldVal)}}; Object[] ps = new Object[]{new ResourceEvent[]{ResourceEvent.create(name, newVal, oldVal)}};
element.listener.invoke(dest, ps); element.changedMethod.invoke(dest, ps);
} else { } else {
wrappers.add(new ResourceChangeWrapper(dest, element.listener, ResourceEvent.create(name, newVal, oldVal))); wrappers.add(new ResourceChangeWrapper(dest, element.changedMethod, ResourceEvent.create(name, newVal, oldVal)));
} }
} }
} catch (Throwable e) { } catch (Throwable e) {
@@ -1178,7 +1230,7 @@ public final class ResourceFactory {
private static final ReentrantLock syncLock = new ReentrantLock(); private static final ReentrantLock syncLock = new ReentrantLock();
private static final HashMap<String, Method> listenerMethods = new HashMap<>(); //不使用ConcurrentHashMap是因为value不能存null private static final HashMap<String, Method> changedMethods = new HashMap<>(); //不使用ConcurrentHashMap是因为value不能存null
public final WeakReference<T> dest; public final WeakReference<T> dest;
@@ -1186,7 +1238,7 @@ public final class ResourceFactory {
public final Class fieldType; public final Class fieldType;
public final Method listener; public final Method changedMethod;
public final boolean different; public final boolean different;
@@ -1197,22 +1249,22 @@ public final class ResourceFactory {
Class t = dest.getClass(); Class t = dest.getClass();
String tn = t.getName(); String tn = t.getName();
AtomicBoolean diff = new AtomicBoolean(); AtomicBoolean diff = new AtomicBoolean();
this.listener = tn.startsWith("java.") || tn.startsWith("javax.") ? null : findListener(t, field.getType(), diff); this.changedMethod = tn.startsWith("java.") || tn.startsWith("javax.") ? null : findChangedMethod(t, field.getType(), diff);
this.different = diff.get(); this.different = diff.get();
} }
private static Method findListener(Class clazz, Class fieldType, AtomicBoolean diff) { private static Method findChangedMethod(Class clazz, Class fieldType, AtomicBoolean diff) {
syncLock.lock(); syncLock.lock();
try { try {
Class loop = clazz; Class loop = clazz;
Method m = listenerMethods.get(clazz.getName() + "-" + fieldType.getName()); Method m = changedMethods.get(clazz.getName() + "-" + fieldType.getName());
if (m != null) { if (m != null) {
return m; return m;
} }
do { do {
RedkaleClassLoader.putReflectionDeclaredMethods(loop.getName()); RedkaleClassLoader.putReflectionDeclaredMethods(loop.getName());
for (Method method : loop.getDeclaredMethods()) { for (Method method : loop.getDeclaredMethods()) {
ResourceListener rl = method.getAnnotation(ResourceListener.class); ResourceChanged rl = method.getAnnotation(ResourceChanged.class);
org.redkale.util.ResourceListener rl2 = method.getAnnotation(org.redkale.util.ResourceListener.class); org.redkale.util.ResourceListener rl2 = method.getAnnotation(org.redkale.util.ResourceListener.class);
if (rl == null && rl2 == null) { if (rl == null && rl2 == null) {
continue; continue;
@@ -1224,12 +1276,12 @@ public final class ResourceFactory {
RedkaleClassLoader.putReflectionMethod(loop.getName(), method); RedkaleClassLoader.putReflectionMethod(loop.getName(), method);
break; break;
} else { } else {
logger.log(Level.SEVERE, "@" + ResourceListener.class.getSimpleName() logger.log(Level.SEVERE, "@" + ResourceChanged.class.getSimpleName()
+ " must on method with " + ResourceEvent.class.getSimpleName() + "[] parameter type"); + " must on method with " + ResourceEvent.class.getSimpleName() + "[] parameter type");
} }
} }
} while ((loop = loop.getSuperclass()) != Object.class); } while ((loop = loop.getSuperclass()) != Object.class);
listenerMethods.put(clazz.getName() + "-" + fieldType.getName(), m); changedMethods.put(clazz.getName() + "-" + fieldType.getName(), m);
return m; return m;
} finally { } finally {
syncLock.unlock(); syncLock.unlock();
@@ -1241,13 +1293,13 @@ public final class ResourceFactory {
public Object dest; public Object dest;
public Method listener; public Method method;
public ResourceEvent event; public ResourceEvent event;
public ResourceChangeWrapper(Object dest, Method listener, ResourceEvent event) { public ResourceChangeWrapper(Object dest, Method listener, ResourceEvent event) {
this.dest = dest; this.dest = dest;
this.listener = listener; this.method = listener;
this.event = event; this.event = event;
} }
@@ -1259,7 +1311,7 @@ public final class ResourceFactory {
public int hashCode() { public int hashCode() {
int hash = 7; int hash = 7;
hash = 97 * hash + Objects.hashCode(this.dest); hash = 97 * hash + Objects.hashCode(this.dest);
hash = 97 * hash + Objects.hashCode(this.listener); hash = 97 * hash + Objects.hashCode(this.method);
return hash; return hash;
} }
@@ -1278,7 +1330,7 @@ public final class ResourceFactory {
if (!Objects.equals(this.dest, other.dest)) { if (!Objects.equals(this.dest, other.dest)) {
return false; return false;
} }
return Objects.equals(this.listener, other.listener); return Objects.equals(this.method, other.method);
} }
} }

View File

@@ -16,7 +16,6 @@ import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.*; import java.util.logging.*;
import org.redkale.annotation.*; import org.redkale.annotation.*;
import org.redkale.annotation.AutoLoad; import org.redkale.annotation.AutoLoad;
import org.redkale.annotation.ResourceListener;
import org.redkale.boot.*; import org.redkale.boot.*;
import static org.redkale.boot.Application.RESNAME_APP_NAME; import static org.redkale.boot.Application.RESNAME_APP_NAME;
import static org.redkale.boot.Application.RESNAME_APP_NODEID; import static org.redkale.boot.Application.RESNAME_APP_NODEID;
@@ -32,6 +31,7 @@ import org.redkale.net.http.*;
import org.redkale.net.sncp.*; import org.redkale.net.sncp.*;
import org.redkale.service.*; import org.redkale.service.*;
import org.redkale.util.*; import org.redkale.util.*;
import org.redkale.annotation.ResourceChanged;
/** /**
* MQ管理器 * MQ管理器
@@ -392,7 +392,7 @@ public abstract class MessageAgent implements Resourcable {
protected abstract MessageClientProducer startMessageClientProducer(); protected abstract MessageClientProducer startMessageClientProducer();
//--------------------------------------------------- //---------------------------------------------------
@ResourceListener @ResourceChanged
public abstract void onResourceChange(ResourceEvent[] events); public abstract void onResourceChange(ResourceEvent[] events);
// //

View File

@@ -99,7 +99,7 @@ public abstract class Sncp {
if (method.getAnnotation(Local.class) != null) { if (method.getAnnotation(Local.class) != null) {
continue; continue;
} }
if (method.getAnnotation(ResourceListener.class) != null) { if (method.getAnnotation(ResourceChanged.class) != null) {
continue; continue;
} }
if (method.getName().equals("getClass") || method.getName().equals("toString")) { if (method.getName().equals("getClass") || method.getName().equals("toString")) {

View File

@@ -4,13 +4,13 @@ package org.redkale.source;
import java.util.*; import java.util.*;
import org.redkale.annotation.AutoLoad; import org.redkale.annotation.AutoLoad;
import org.redkale.annotation.ResourceListener;
import org.redkale.annotation.ResourceType; import org.redkale.annotation.ResourceType;
import org.redkale.inject.Resourcable; import org.redkale.inject.Resourcable;
import org.redkale.inject.ResourceEvent; import org.redkale.inject.ResourceEvent;
import org.redkale.inject.ResourceFactory; import org.redkale.inject.ResourceFactory;
import org.redkale.service.*; import org.redkale.service.*;
import org.redkale.util.*; import org.redkale.util.*;
import org.redkale.annotation.ResourceChanged;
/** /**
* CacheSource的S抽象实现类 <br> * CacheSource的S抽象实现类 <br>
@@ -54,7 +54,7 @@ public abstract class AbstractCacheSource extends AbstractService implements Cac
//@since 2.7.0 //@since 2.7.0
public static final String CACHE_SOURCE_PIPELINES = "pipelines"; public static final String CACHE_SOURCE_PIPELINES = "pipelines";
@ResourceListener @ResourceChanged
public abstract void onResourceChange(ResourceEvent[] events); public abstract void onResourceChange(ResourceEvent[] events);
//从Properties配置中创建DataSource //从Properties配置中创建DataSource

View File

@@ -15,7 +15,6 @@ import java.util.stream.Stream;
import org.redkale.annotation.*; import org.redkale.annotation.*;
import org.redkale.annotation.AutoLoad; import org.redkale.annotation.AutoLoad;
import org.redkale.annotation.Comment; import org.redkale.annotation.Comment;
import org.redkale.annotation.ResourceListener;
import org.redkale.annotation.ResourceType; import org.redkale.annotation.ResourceType;
import static org.redkale.boot.Application.RESNAME_APP_EXECUTOR; import static org.redkale.boot.Application.RESNAME_APP_EXECUTOR;
import org.redkale.convert.json.JsonConvert; import org.redkale.convert.json.JsonConvert;
@@ -26,6 +25,7 @@ import org.redkale.persistence.Entity;
import org.redkale.service.*; import org.redkale.service.*;
import static org.redkale.source.DataSources.*; import static org.redkale.source.DataSources.*;
import org.redkale.util.*; import org.redkale.util.*;
import org.redkale.annotation.ResourceChanged;
/** /**
* DataSource的S抽象实现类 <br> * DataSource的S抽象实现类 <br>
@@ -69,7 +69,7 @@ public abstract class AbstractDataSource extends AbstractService implements Data
return name; return name;
} }
@ResourceListener @ResourceChanged
public abstract void onResourceChange(ResourceEvent[] events); public abstract void onResourceChange(ResourceEvent[] events);
protected void setSourceExecutor(ExecutorService executor) { protected void setSourceExecutor(ExecutorService executor) {

View File

@@ -16,7 +16,6 @@ import java.util.logging.*;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.redkale.annotation.*; import org.redkale.annotation.*;
import org.redkale.annotation.AutoLoad; import org.redkale.annotation.AutoLoad;
import org.redkale.annotation.ResourceListener;
import org.redkale.annotation.ResourceType; import org.redkale.annotation.ResourceType;
import static org.redkale.boot.Application.*; import static org.redkale.boot.Application.*;
import org.redkale.inject.ResourceEvent; import org.redkale.inject.ResourceEvent;
@@ -27,6 +26,7 @@ import static org.redkale.source.DataSources.*;
import org.redkale.source.EntityInfo.EntityColumn; import org.redkale.source.EntityInfo.EntityColumn;
import org.redkale.util.*; import org.redkale.util.*;
import static org.redkale.util.Utility.isEmpty; import static org.redkale.util.Utility.isEmpty;
import org.redkale.annotation.ResourceChanged;
/** /**
* DataSource的SQL抽象实现类 <br> * DataSource的SQL抽象实现类 <br>
@@ -148,7 +148,7 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource implement
} }
@Override @Override
@ResourceListener @ResourceChanged
public void onResourceChange(ResourceEvent[] events) { public void onResourceChange(ResourceEvent[] events) {
if (events == null || events.length < 1) { if (events == null || events.length < 1) {
return; return;

View File

@@ -19,13 +19,13 @@ import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.redkale.annotation.*; import org.redkale.annotation.*;
import org.redkale.annotation.AutoLoad; import org.redkale.annotation.AutoLoad;
import org.redkale.annotation.ResourceListener;
import org.redkale.annotation.ResourceType; import org.redkale.annotation.ResourceType;
import org.redkale.convert.*; import org.redkale.convert.*;
import org.redkale.convert.json.*; import org.redkale.convert.json.*;
import org.redkale.inject.ResourceEvent; import org.redkale.inject.ResourceEvent;
import org.redkale.service.Local; import org.redkale.service.Local;
import org.redkale.util.*; import org.redkale.util.*;
import org.redkale.annotation.ResourceChanged;
/** /**
* CacheSource的默认实现--内存缓存 * CacheSource的默认实现--内存缓存
@@ -77,7 +77,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
} }
@Override @Override
@ResourceListener @ResourceChanged
public void onResourceChange(ResourceEvent[] events) { public void onResourceChange(ResourceEvent[] events) {
//do nothing //do nothing
} }

View File

@@ -15,12 +15,12 @@ import java.util.logging.Level;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.redkale.annotation.*; import org.redkale.annotation.*;
import org.redkale.annotation.AutoLoad; import org.redkale.annotation.AutoLoad;
import org.redkale.annotation.ResourceListener;
import org.redkale.annotation.ResourceType; import org.redkale.annotation.ResourceType;
import org.redkale.inject.ResourceEvent; import org.redkale.inject.ResourceEvent;
import org.redkale.service.Local; import org.redkale.service.Local;
import static org.redkale.source.DataSources.*; import static org.redkale.source.DataSources.*;
import org.redkale.util.*; import org.redkale.util.*;
import org.redkale.annotation.ResourceChanged;
/** /**
* DataSource的JDBC实现类 * DataSource的JDBC实现类
@@ -2902,7 +2902,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
resetMaxConnection(); resetMaxConnection();
} }
@ResourceListener @ResourceChanged
public void onResourceChange(ResourceEvent[] events) { public void onResourceChange(ResourceEvent[] events) {
int newConnectTimeoutSeconds = this.connectTimeoutSeconds; int newConnectTimeoutSeconds = this.connectTimeoutSeconds;
int newMaxconns = this.maxConns; int newMaxconns = this.maxConns;

View File

@@ -10,11 +10,11 @@ import java.util.*;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.redkale.annotation.AutoLoad; import org.redkale.annotation.AutoLoad;
import org.redkale.annotation.ResourceListener;
import org.redkale.annotation.ResourceType; import org.redkale.annotation.ResourceType;
import org.redkale.inject.ResourceEvent; import org.redkale.inject.ResourceEvent;
import org.redkale.service.Local; import org.redkale.service.Local;
import org.redkale.util.*; import org.redkale.util.*;
import org.redkale.annotation.ResourceChanged;
/** /**
* *
@@ -47,7 +47,7 @@ public class DataMemorySource extends AbstractDataSource {
} }
@Override @Override
@ResourceListener @ResourceChanged
public void onResourceChange(ResourceEvent[] events) { public void onResourceChange(ResourceEvent[] events) {
//do nothing //do nothing
} }

View File

@@ -8,7 +8,7 @@ import java.util.function.*;
/** /**
* 环境变量, 只读版Properties * 环境变量, 只读版Properties
* 只存放system.property.、mimetype.property.、redkale.cachesource(.|[)、redkale.datasource(.|[)和其他非redkale.开头的配置项 * 只存放system.property.、mimetype.property.、redkale.cachesource(.|[)、redkale.datasource(.|[)和其他非redkale.开头的配置项
* 只有ResourceFactory.register(Properties properties, String environmentName, Class environmentType) 方法才能是Environment的ResourceListener起作用 * 只有ResourceFactory.register(Properties properties, String environmentName, Class environmentType) 方法才能是Environment的ResourceChanged起作用
* *
* 详情见: https://redkale.org * 详情见: https://redkale.org
* *

View File

@@ -31,7 +31,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
* } * }
* *
* public static void main(String[] args) throws Exception { * public static void main(String[] args) throws Exception {
* ResourceFactory factory = ResourceFactory.root(); * ResourceFactory factory = ResourceFactory.create();
* factory.register("record.id", "2345"); * factory.register("record.id", "2345");
* factory.register("record.name", "my old name"); * factory.register("record.name", "my old name");
* Record record = new Record(); * Record record = new Record();
@@ -45,10 +45,10 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
* <p> * <p>
* 详情见: https://redkale.org * 详情见: https://redkale.org
* *
* @see org.redkale.annotation.ResourceListener * @see org.redkale.annotation.ResourceChanged
* *
* @author zhangjx * @author zhangjx
* @deprecated replaced by org.redkale.annotation.ResourceListener * @deprecated replaced by org.redkale.annotation.ResourceChanged
*/ */
@Deprecated(since = "2.8.0") @Deprecated(since = "2.8.0")
@Documented @Documented

View File

@@ -3,7 +3,7 @@
* To change this template file, choose Tools | Templates * To change this template file, choose Tools | Templates
* and open the template in the editor. * and open the template in the editor.
*/ */
package org.redkale.test.util; package org.redkale.test.inject;
import java.io.File; import java.io.File;
import java.lang.annotation.*; import java.lang.annotation.*;

View File

@@ -0,0 +1,68 @@
/*
*
*/
package org.redkale.test.inject;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.redkale.annotation.Resource;
import org.redkale.annotation.ResourceInjected;
import org.redkale.inject.ResourceFactory;
import org.redkale.service.Service;
/**
*
* @author zhangjx
*/
public class ResourceInjectedTest {
public static void main(String[] args) throws Throwable {
ResourceInjectedTest test = new ResourceInjectedTest();
test.run();
}
@Test
public void run() throws Exception {
ResourceFactory factory = ResourceFactory.create();
factory.register("res.id", "2345");
factory.register("res.name", "my old name");
ResourceService res = new ResourceService();
factory.inject(res);
factory.register("", res);
RoomService serice = new RoomService();
factory.inject(serice);
Assertions.assertEquals(1, ResourceService.counter.get());
}
public static class RoomService implements Service {
@Resource
private ResourceService resService;
public void test() {
resService.doing();
}
}
public static class ResourceService implements Service {
private static final AtomicInteger counter = new AtomicInteger();
@Resource(name = "res.id")
private int id;
@Resource(name = "res.name")
private String name;
@ResourceInjected
private void onInjected(Object src, String fieldName) {
counter.incrementAndGet();
System.out.println("资源被注入到对象(" + src + ")的字段(" + fieldName + ")上");
}
public void doing() {
System.out.println("id = " + id + ", name = " + name);
}
}
}

View File

@@ -1,15 +1,15 @@
/* /*
*/ */
package org.redkale.test.util; package org.redkale.test.inject;
import java.util.Properties; import java.util.Properties;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import org.junit.jupiter.api.*; import org.junit.jupiter.api.*;
import org.redkale.annotation.Resource; import org.redkale.annotation.Resource;
import org.redkale.annotation.ResourceListener;
import org.redkale.inject.ResourceEvent; import org.redkale.inject.ResourceEvent;
import org.redkale.inject.ResourceFactory; import org.redkale.inject.ResourceFactory;
import org.redkale.util.*; import org.redkale.util.*;
import org.redkale.annotation.ResourceChanged;
/** /**
* *
@@ -71,7 +71,7 @@ public class ResourceListenerTest {
@Resource(name = "property.desc", required = false) @Resource(name = "property.desc", required = false)
private String desc; private String desc;
@ResourceListener @ResourceChanged
private void changeResource(ResourceEvent[] events) { private void changeResource(ResourceEvent[] events) {
for (ResourceEvent event : events) { for (ResourceEvent event : events) {
counter.incrementAndGet(); counter.incrementAndGet();
@@ -92,7 +92,7 @@ public class ResourceListenerTest {
@Resource @Resource
private Environment env; private Environment env;
@ResourceListener @ResourceChanged
private void changeResource(ResourceEvent[] events) { private void changeResource(ResourceEvent[] events) {
for (ResourceEvent event : events) { for (ResourceEvent event : events) {
counter.incrementAndGet(); counter.incrementAndGet();
@@ -116,7 +116,7 @@ public class ResourceListenerTest {
@Resource @Resource
private Environment env; private Environment env;
@ResourceListener @ResourceChanged
private void changeResource(ResourceEvent[] events) { private void changeResource(ResourceEvent[] events) {
for (ResourceEvent event : events) { for (ResourceEvent event : events) {
counter.incrementAndGet(); counter.incrementAndGet();

View File

@@ -1,6 +1,6 @@
/* /*
*/ */
package org.redkale.test.util; package org.redkale.test.inject;
import org.junit.jupiter.api.*; import org.junit.jupiter.api.*;
import org.redkale.annotation.Resource; import org.redkale.annotation.Resource;

View File

@@ -3,7 +3,7 @@
* To change this template bigint, choose Tools | Templates * To change this template bigint, choose Tools | Templates
* and open the template in the editor. * and open the template in the editor.
*/ */
package org.redkale.test.util; package org.redkale.test.inject;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.Properties; import java.util.Properties;
@@ -77,7 +77,7 @@ class BService {
private String name = ""; private String name = "";
@ResourceListener @ResourceChanged
private void changeResource(ResourceEvent[] events) { private void changeResource(ResourceEvent[] events) {
for (ResourceEvent event : events) { for (ResourceEvent event : events) {
System.out.println(getClass().getSimpleName() + " @Resource = " + event.name() + " 资源变更: newVal = " + event.newValue() + ", oldVal = " + event.oldValue()); System.out.println(getClass().getSimpleName() + " @Resource = " + event.name() + " 资源变更: newVal = " + event.newValue() + ", oldVal = " + event.oldValue());