增加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;ResourceListener的方法 多余的会被忽略 <br>
* 注意: 一个类只能存在一个&#64;ResourceChanged的方法 多余的会被忽略 <br>
* 方法在资源被更新以后调用
*
* <blockquote><pre>
@@ -23,22 +23,21 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
* &#64;Resource(name = "record.name")
* private String name;
*
* &#64;ResourceListener
* &#64;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

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.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;

View File

@@ -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) {

View File

@@ -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);
}
}

View File

@@ -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);
//

View File

@@ -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")) {

View File

@@ -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

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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
}

View File

@@ -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;

View File

@@ -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
}

View File

@@ -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
*

View File

@@ -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

View File

@@ -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.*;

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.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();

View File

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

View File

@@ -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());