增加ResourceInjected功能
This commit is contained in:
@@ -11,7 +11,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
||||
|
||||
/**
|
||||
* @Resource资源被更新时的监听事件, 本注解只能标记在方法参数为ResourceEvent[]上 <br>
|
||||
* 注意: 一个类只能存在一个@ResourceListener的方法, 多余的会被忽略 <br>
|
||||
* 注意: 一个类只能存在一个@ResourceChanged的方法, 多余的会被忽略 <br>
|
||||
* 方法在资源被更新以后调用。
|
||||
*
|
||||
* <blockquote><pre>
|
||||
@@ -23,22 +23,21 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
||||
* @Resource(name = "record.name")
|
||||
* private String name;
|
||||
*
|
||||
* @ResourceListener
|
||||
* @ResourceChanged
|
||||
* private void changeResource(ResourceEvent[] events) {
|
||||
* for(ResourceEvent event : events) {
|
||||
* 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");
|
||||
* }
|
||||
* for(ResourceEvent event : events) {
|
||||
* System.out .println("@Resource = " + event.name() + " 资源变更: newVal = " + event.newValue() + ", oldVal = " + event.oldValue());
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* 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>
|
||||
*
|
||||
@@ -50,12 +49,12 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
||||
@Documented
|
||||
@Target({METHOD})
|
||||
@Retention(RUNTIME)
|
||||
public @interface ResourceListener {
|
||||
public @interface ResourceChanged {
|
||||
|
||||
/**
|
||||
* 新旧值是否不同时才回调方法 <br>
|
||||
* true: 新值与旧值不同时才回调ResourceListener方法
|
||||
* false: 只要执行了ResourceFactory.register 就回调ResourceListener方法
|
||||
* true: 新值与旧值不同时才回调ResourceChanged方法
|
||||
* false: 只要执行了ResourceFactory.register 就回调ResourceChanged方法
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @return boolean
|
||||
63
src/main/java/org/redkale/annotation/ResourceInjected.java
Normal file
63
src/main/java/org/redkale/annotation/ResourceInjected.java
Normal 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;
|
||||
|
||||
/**
|
||||
* @Resource资源被依赖注入时的监听事件。<br>
|
||||
* 本注解只能标记在空参数或者(String、Object、java.lang.reflect.Field)三个参数类型的任意组合方法上 <br>
|
||||
* 方法在资源被依赖注入后调用。
|
||||
*
|
||||
* <blockquote><pre>
|
||||
* public class ResourceService implements Service {
|
||||
*
|
||||
* @Resource(name = "res.id")
|
||||
* private int id;
|
||||
*
|
||||
* @Resource(name = "res.name")
|
||||
* private String name;
|
||||
*
|
||||
* @ResourceInjected
|
||||
* private void onInjected(Object src, String fieldName) {
|
||||
* System.out .println("资源被注入到对象(" + src + ")的字段(" + fieldName + ")上");
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* public class RecordService implements Service {
|
||||
*
|
||||
* @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 {
|
||||
|
||||
}
|
||||
@@ -11,7 +11,6 @@ import java.util.concurrent.*;
|
||||
import java.util.concurrent.atomic.*;
|
||||
import java.util.logging.Level;
|
||||
import org.redkale.annotation.*;
|
||||
import org.redkale.annotation.ResourceListener;
|
||||
import org.redkale.boot.*;
|
||||
import org.redkale.convert.json.JsonConvert;
|
||||
import org.redkale.inject.Resourcable;
|
||||
@@ -19,6 +18,7 @@ import org.redkale.inject.ResourceEvent;
|
||||
import org.redkale.service.Service;
|
||||
import org.redkale.source.CacheSource;
|
||||
import org.redkale.util.*;
|
||||
import org.redkale.annotation.ResourceChanged;
|
||||
|
||||
/**
|
||||
* 使用CacheSource实现的第三方服务发现管理接口cluster
|
||||
@@ -60,7 +60,7 @@ public class CacheClusterAgent extends ClusterAgent implements Resourcable {
|
||||
}
|
||||
|
||||
@Override
|
||||
@ResourceListener
|
||||
@ResourceChanged
|
||||
public void onResourceChange(ResourceEvent[] events) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
int newTtls = this.ttls;
|
||||
|
||||
@@ -13,7 +13,6 @@ import java.util.concurrent.*;
|
||||
import java.util.logging.*;
|
||||
import org.redkale.annotation.*;
|
||||
import org.redkale.annotation.AutoLoad;
|
||||
import org.redkale.annotation.ResourceListener;
|
||||
import org.redkale.boot.*;
|
||||
import static org.redkale.boot.Application.*;
|
||||
import org.redkale.convert.ConvertDisabled;
|
||||
@@ -24,6 +23,7 @@ import org.redkale.net.http.*;
|
||||
import org.redkale.net.sncp.*;
|
||||
import org.redkale.service.*;
|
||||
import org.redkale.util.*;
|
||||
import org.redkale.annotation.ResourceChanged;
|
||||
|
||||
/**
|
||||
* 服务注册中心管理类cluster
|
||||
@@ -103,7 +103,7 @@ public abstract class ClusterAgent {
|
||||
}
|
||||
}
|
||||
|
||||
@ResourceListener
|
||||
@ResourceChanged
|
||||
public abstract void onResourceChange(ResourceEvent[] events);
|
||||
|
||||
public void destroy(AnyValue config) {
|
||||
|
||||
@@ -114,10 +114,16 @@ public final class ResourceFactory {
|
||||
this.store.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* inject时的锁
|
||||
*/
|
||||
public void lock() {
|
||||
lock.lock();
|
||||
}
|
||||
|
||||
/**
|
||||
* inject时的锁
|
||||
*/
|
||||
public void 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) {
|
||||
Class<?> clazz = TypeToken.typeToClass(type);
|
||||
ResourceType rt = clazz.getAnnotation(ResourceType.class);
|
||||
@@ -201,7 +214,7 @@ public final class ResourceFactory {
|
||||
if (rs == 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) {
|
||||
for (ResourceElement element : entry.elements) {
|
||||
Object dest = element.dest.get();
|
||||
if (dest != null && element.listener != null) {
|
||||
envListenMap.put(dest, element.listener);
|
||||
if (dest != null && element.changedMethod != null) {
|
||||
envListenMap.put(dest, element.changedMethod);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -512,7 +525,7 @@ public final class ResourceFactory {
|
||||
if (envListenMap.containsKey(dest)) {
|
||||
return; //跳过含有@Resource Environment字段的对象
|
||||
}
|
||||
Method listener = list.get(0).listener;
|
||||
Method listener = list.get(0).method;
|
||||
try {
|
||||
ResourceEvent[] events = new ResourceEvent[list.size()];
|
||||
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) {
|
||||
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) {
|
||||
field.set(srcObj, rs);
|
||||
onResourceInjected(srcObj, field, rs);
|
||||
}
|
||||
if (rs == null && rc1 != null && rc1.required()) {
|
||||
String t = srcObj.getClass().getName();
|
||||
@@ -1050,6 +1067,11 @@ public final class ResourceFactory {
|
||||
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() {
|
||||
if (parent == null) {
|
||||
return this;
|
||||
@@ -1078,16 +1100,46 @@ public final class ResourceFactory {
|
||||
if (t == ft) {
|
||||
return en.getValue();
|
||||
}
|
||||
if (t instanceof Class && (((Class) t)).isAssignableFrom(c)) {
|
||||
if (t instanceof Class && ((Class) t).isAssignableFrom(c)) {
|
||||
return en.getValue();
|
||||
}
|
||||
}
|
||||
return parent == null ? null : parent.findRegxTypeLoader(ft, field);
|
||||
}
|
||||
|
||||
public ResourceTypeLoader findTypeLoader(Type ft, Field field) {
|
||||
ResourceTypeLoader it = this.findMatchTypeLoader(ft, field);
|
||||
return it == null ? findRegxTypeLoader(ft, field) : it;
|
||||
private void onResourceInjected(Object src, Field field, Object res) {
|
||||
if (res == null || res.getClass().isPrimitive()
|
||||
|| 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> {
|
||||
@@ -1143,7 +1195,7 @@ public final class ResourceFactory {
|
||||
newVal = Array.get(Creator.newArray(classType, 1), 0);
|
||||
}
|
||||
Object oldVal = null;
|
||||
if (element.listener != null) {
|
||||
if (element.changedMethod != null) {
|
||||
try {
|
||||
oldVal = element.field.get(dest);
|
||||
} catch (Throwable e) {
|
||||
@@ -1155,14 +1207,14 @@ public final class ResourceFactory {
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (element.listener != null) {
|
||||
if (element.changedMethod != null) {
|
||||
try {
|
||||
if (!element.different || !Objects.equals(newVal, oldVal)) {
|
||||
if (wrappers == null) {
|
||||
Object[] ps = new Object[]{new ResourceEvent[]{ResourceEvent.create(name, newVal, oldVal)}};
|
||||
element.listener.invoke(dest, ps);
|
||||
element.changedMethod.invoke(dest, ps);
|
||||
} 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) {
|
||||
@@ -1178,7 +1230,7 @@ public final class ResourceFactory {
|
||||
|
||||
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;
|
||||
|
||||
@@ -1186,7 +1238,7 @@ public final class ResourceFactory {
|
||||
|
||||
public final Class fieldType;
|
||||
|
||||
public final Method listener;
|
||||
public final Method changedMethod;
|
||||
|
||||
public final boolean different;
|
||||
|
||||
@@ -1197,22 +1249,22 @@ public final class ResourceFactory {
|
||||
Class t = dest.getClass();
|
||||
String tn = t.getName();
|
||||
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();
|
||||
}
|
||||
|
||||
private static Method findListener(Class clazz, Class fieldType, AtomicBoolean diff) {
|
||||
private static Method findChangedMethod(Class clazz, Class fieldType, AtomicBoolean diff) {
|
||||
syncLock.lock();
|
||||
try {
|
||||
Class loop = clazz;
|
||||
Method m = listenerMethods.get(clazz.getName() + "-" + fieldType.getName());
|
||||
Method m = changedMethods.get(clazz.getName() + "-" + fieldType.getName());
|
||||
if (m != null) {
|
||||
return m;
|
||||
}
|
||||
do {
|
||||
RedkaleClassLoader.putReflectionDeclaredMethods(loop.getName());
|
||||
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);
|
||||
if (rl == null && rl2 == null) {
|
||||
continue;
|
||||
@@ -1224,12 +1276,12 @@ public final class ResourceFactory {
|
||||
RedkaleClassLoader.putReflectionMethod(loop.getName(), method);
|
||||
break;
|
||||
} else {
|
||||
logger.log(Level.SEVERE, "@" + ResourceListener.class.getSimpleName()
|
||||
logger.log(Level.SEVERE, "@" + ResourceChanged.class.getSimpleName()
|
||||
+ " must on method with " + ResourceEvent.class.getSimpleName() + "[] parameter type");
|
||||
}
|
||||
}
|
||||
} while ((loop = loop.getSuperclass()) != Object.class);
|
||||
listenerMethods.put(clazz.getName() + "-" + fieldType.getName(), m);
|
||||
changedMethods.put(clazz.getName() + "-" + fieldType.getName(), m);
|
||||
return m;
|
||||
} finally {
|
||||
syncLock.unlock();
|
||||
@@ -1241,13 +1293,13 @@ public final class ResourceFactory {
|
||||
|
||||
public Object dest;
|
||||
|
||||
public Method listener;
|
||||
public Method method;
|
||||
|
||||
public ResourceEvent event;
|
||||
|
||||
public ResourceChangeWrapper(Object dest, Method listener, ResourceEvent event) {
|
||||
this.dest = dest;
|
||||
this.listener = listener;
|
||||
this.method = listener;
|
||||
this.event = event;
|
||||
}
|
||||
|
||||
@@ -1259,7 +1311,7 @@ public final class ResourceFactory {
|
||||
public int hashCode() {
|
||||
int hash = 7;
|
||||
hash = 97 * hash + Objects.hashCode(this.dest);
|
||||
hash = 97 * hash + Objects.hashCode(this.listener);
|
||||
hash = 97 * hash + Objects.hashCode(this.method);
|
||||
return hash;
|
||||
}
|
||||
|
||||
@@ -1278,7 +1330,7 @@ public final class ResourceFactory {
|
||||
if (!Objects.equals(this.dest, other.dest)) {
|
||||
return false;
|
||||
}
|
||||
return Objects.equals(this.listener, other.listener);
|
||||
return Objects.equals(this.method, other.method);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@ import java.util.concurrent.locks.ReentrantLock;
|
||||
import java.util.logging.*;
|
||||
import org.redkale.annotation.*;
|
||||
import org.redkale.annotation.AutoLoad;
|
||||
import org.redkale.annotation.ResourceListener;
|
||||
import org.redkale.boot.*;
|
||||
import static org.redkale.boot.Application.RESNAME_APP_NAME;
|
||||
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.service.*;
|
||||
import org.redkale.util.*;
|
||||
import org.redkale.annotation.ResourceChanged;
|
||||
|
||||
/**
|
||||
* MQ管理器
|
||||
@@ -392,7 +392,7 @@ public abstract class MessageAgent implements Resourcable {
|
||||
protected abstract MessageClientProducer startMessageClientProducer();
|
||||
|
||||
//---------------------------------------------------
|
||||
@ResourceListener
|
||||
@ResourceChanged
|
||||
public abstract void onResourceChange(ResourceEvent[] events);
|
||||
|
||||
//
|
||||
|
||||
@@ -99,7 +99,7 @@ public abstract class Sncp {
|
||||
if (method.getAnnotation(Local.class) != null) {
|
||||
continue;
|
||||
}
|
||||
if (method.getAnnotation(ResourceListener.class) != null) {
|
||||
if (method.getAnnotation(ResourceChanged.class) != null) {
|
||||
continue;
|
||||
}
|
||||
if (method.getName().equals("getClass") || method.getName().equals("toString")) {
|
||||
|
||||
@@ -4,13 +4,13 @@ package org.redkale.source;
|
||||
|
||||
import java.util.*;
|
||||
import org.redkale.annotation.AutoLoad;
|
||||
import org.redkale.annotation.ResourceListener;
|
||||
import org.redkale.annotation.ResourceType;
|
||||
import org.redkale.inject.Resourcable;
|
||||
import org.redkale.inject.ResourceEvent;
|
||||
import org.redkale.inject.ResourceFactory;
|
||||
import org.redkale.service.*;
|
||||
import org.redkale.util.*;
|
||||
import org.redkale.annotation.ResourceChanged;
|
||||
|
||||
/**
|
||||
* CacheSource的S抽象实现类 <br>
|
||||
@@ -54,7 +54,7 @@ public abstract class AbstractCacheSource extends AbstractService implements Cac
|
||||
//@since 2.7.0
|
||||
public static final String CACHE_SOURCE_PIPELINES = "pipelines";
|
||||
|
||||
@ResourceListener
|
||||
@ResourceChanged
|
||||
public abstract void onResourceChange(ResourceEvent[] events);
|
||||
|
||||
//从Properties配置中创建DataSource
|
||||
|
||||
@@ -15,7 +15,6 @@ import java.util.stream.Stream;
|
||||
import org.redkale.annotation.*;
|
||||
import org.redkale.annotation.AutoLoad;
|
||||
import org.redkale.annotation.Comment;
|
||||
import org.redkale.annotation.ResourceListener;
|
||||
import org.redkale.annotation.ResourceType;
|
||||
import static org.redkale.boot.Application.RESNAME_APP_EXECUTOR;
|
||||
import org.redkale.convert.json.JsonConvert;
|
||||
@@ -26,6 +25,7 @@ import org.redkale.persistence.Entity;
|
||||
import org.redkale.service.*;
|
||||
import static org.redkale.source.DataSources.*;
|
||||
import org.redkale.util.*;
|
||||
import org.redkale.annotation.ResourceChanged;
|
||||
|
||||
/**
|
||||
* DataSource的S抽象实现类 <br>
|
||||
@@ -69,7 +69,7 @@ public abstract class AbstractDataSource extends AbstractService implements Data
|
||||
return name;
|
||||
}
|
||||
|
||||
@ResourceListener
|
||||
@ResourceChanged
|
||||
public abstract void onResourceChange(ResourceEvent[] events);
|
||||
|
||||
protected void setSourceExecutor(ExecutorService executor) {
|
||||
|
||||
@@ -16,7 +16,6 @@ import java.util.logging.*;
|
||||
import java.util.stream.Stream;
|
||||
import org.redkale.annotation.*;
|
||||
import org.redkale.annotation.AutoLoad;
|
||||
import org.redkale.annotation.ResourceListener;
|
||||
import org.redkale.annotation.ResourceType;
|
||||
import static org.redkale.boot.Application.*;
|
||||
import org.redkale.inject.ResourceEvent;
|
||||
@@ -27,6 +26,7 @@ import static org.redkale.source.DataSources.*;
|
||||
import org.redkale.source.EntityInfo.EntityColumn;
|
||||
import org.redkale.util.*;
|
||||
import static org.redkale.util.Utility.isEmpty;
|
||||
import org.redkale.annotation.ResourceChanged;
|
||||
|
||||
/**
|
||||
* DataSource的SQL抽象实现类 <br>
|
||||
@@ -148,7 +148,7 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource implement
|
||||
}
|
||||
|
||||
@Override
|
||||
@ResourceListener
|
||||
@ResourceChanged
|
||||
public void onResourceChange(ResourceEvent[] events) {
|
||||
if (events == null || events.length < 1) {
|
||||
return;
|
||||
|
||||
@@ -19,13 +19,13 @@ import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import org.redkale.annotation.*;
|
||||
import org.redkale.annotation.AutoLoad;
|
||||
import org.redkale.annotation.ResourceListener;
|
||||
import org.redkale.annotation.ResourceType;
|
||||
import org.redkale.convert.*;
|
||||
import org.redkale.convert.json.*;
|
||||
import org.redkale.inject.ResourceEvent;
|
||||
import org.redkale.service.Local;
|
||||
import org.redkale.util.*;
|
||||
import org.redkale.annotation.ResourceChanged;
|
||||
|
||||
/**
|
||||
* CacheSource的默认实现--内存缓存
|
||||
@@ -77,7 +77,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
|
||||
}
|
||||
|
||||
@Override
|
||||
@ResourceListener
|
||||
@ResourceChanged
|
||||
public void onResourceChange(ResourceEvent[] events) {
|
||||
//do nothing
|
||||
}
|
||||
|
||||
@@ -15,12 +15,12 @@ import java.util.logging.Level;
|
||||
import java.util.stream.Stream;
|
||||
import org.redkale.annotation.*;
|
||||
import org.redkale.annotation.AutoLoad;
|
||||
import org.redkale.annotation.ResourceListener;
|
||||
import org.redkale.annotation.ResourceType;
|
||||
import org.redkale.inject.ResourceEvent;
|
||||
import org.redkale.service.Local;
|
||||
import static org.redkale.source.DataSources.*;
|
||||
import org.redkale.util.*;
|
||||
import org.redkale.annotation.ResourceChanged;
|
||||
|
||||
/**
|
||||
* DataSource的JDBC实现类
|
||||
@@ -2902,7 +2902,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
|
||||
resetMaxConnection();
|
||||
}
|
||||
|
||||
@ResourceListener
|
||||
@ResourceChanged
|
||||
public void onResourceChange(ResourceEvent[] events) {
|
||||
int newConnectTimeoutSeconds = this.connectTimeoutSeconds;
|
||||
int newMaxconns = this.maxConns;
|
||||
|
||||
@@ -10,11 +10,11 @@ import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.stream.Stream;
|
||||
import org.redkale.annotation.AutoLoad;
|
||||
import org.redkale.annotation.ResourceListener;
|
||||
import org.redkale.annotation.ResourceType;
|
||||
import org.redkale.inject.ResourceEvent;
|
||||
import org.redkale.service.Local;
|
||||
import org.redkale.util.*;
|
||||
import org.redkale.annotation.ResourceChanged;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -47,7 +47,7 @@ public class DataMemorySource extends AbstractDataSource {
|
||||
}
|
||||
|
||||
@Override
|
||||
@ResourceListener
|
||||
@ResourceChanged
|
||||
public void onResourceChange(ResourceEvent[] events) {
|
||||
//do nothing
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import java.util.function.*;
|
||||
/**
|
||||
* 环境变量, 只读版Properties
|
||||
* 只存放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
|
||||
*
|
||||
|
||||
@@ -31,7 +31,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
||||
* }
|
||||
*
|
||||
* public static void main(String[] args) throws Exception {
|
||||
* ResourceFactory factory = ResourceFactory.root();
|
||||
* ResourceFactory factory = ResourceFactory.create();
|
||||
* factory.register("record.id", "2345");
|
||||
* factory.register("record.name", "my old name");
|
||||
* Record record = new Record();
|
||||
@@ -45,10 +45,10 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
||||
* <p>
|
||||
* 详情见: https://redkale.org
|
||||
*
|
||||
* @see org.redkale.annotation.ResourceListener
|
||||
* @see org.redkale.annotation.ResourceChanged
|
||||
*
|
||||
* @author zhangjx
|
||||
* @deprecated replaced by org.redkale.annotation.ResourceListener
|
||||
* @deprecated replaced by org.redkale.annotation.ResourceChanged
|
||||
*/
|
||||
@Deprecated(since = "2.8.0")
|
||||
@Documented
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
package org.redkale.test.util;
|
||||
package org.redkale.test.inject;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.annotation.*;
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,15 +1,15 @@
|
||||
/*
|
||||
*/
|
||||
package org.redkale.test.util;
|
||||
package org.redkale.test.inject;
|
||||
|
||||
import java.util.Properties;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import org.junit.jupiter.api.*;
|
||||
import org.redkale.annotation.Resource;
|
||||
import org.redkale.annotation.ResourceListener;
|
||||
import org.redkale.inject.ResourceEvent;
|
||||
import org.redkale.inject.ResourceFactory;
|
||||
import org.redkale.util.*;
|
||||
import org.redkale.annotation.ResourceChanged;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -71,7 +71,7 @@ public class ResourceListenerTest {
|
||||
@Resource(name = "property.desc", required = false)
|
||||
private String desc;
|
||||
|
||||
@ResourceListener
|
||||
@ResourceChanged
|
||||
private void changeResource(ResourceEvent[] events) {
|
||||
for (ResourceEvent event : events) {
|
||||
counter.incrementAndGet();
|
||||
@@ -92,7 +92,7 @@ public class ResourceListenerTest {
|
||||
@Resource
|
||||
private Environment env;
|
||||
|
||||
@ResourceListener
|
||||
@ResourceChanged
|
||||
private void changeResource(ResourceEvent[] events) {
|
||||
for (ResourceEvent event : events) {
|
||||
counter.incrementAndGet();
|
||||
@@ -116,7 +116,7 @@ public class ResourceListenerTest {
|
||||
@Resource
|
||||
private Environment env;
|
||||
|
||||
@ResourceListener
|
||||
@ResourceChanged
|
||||
private void changeResource(ResourceEvent[] events) {
|
||||
for (ResourceEvent event : events) {
|
||||
counter.incrementAndGet();
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
*/
|
||||
package org.redkale.test.util;
|
||||
package org.redkale.test.inject;
|
||||
|
||||
import org.junit.jupiter.api.*;
|
||||
import org.redkale.annotation.Resource;
|
||||
@@ -3,7 +3,7 @@
|
||||
* To change this template bigint, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
package org.redkale.test.util;
|
||||
package org.redkale.test.inject;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.Properties;
|
||||
@@ -77,7 +77,7 @@ class BService {
|
||||
|
||||
private String name = "";
|
||||
|
||||
@ResourceListener
|
||||
@ResourceChanged
|
||||
private void changeResource(ResourceEvent[] events) {
|
||||
for (ResourceEvent event : events) {
|
||||
System.out.println(getClass().getSimpleName() + " @Resource = " + event.name() + " 资源变更: newVal = " + event.newValue() + ", oldVal = " + event.oldValue());
|
||||
Reference in New Issue
Block a user