注释优化
This commit is contained in:
@@ -5,13 +5,14 @@
|
|||||||
*/
|
*/
|
||||||
package org.redkale.annotation;
|
package org.redkale.annotation;
|
||||||
|
|
||||||
|
import java.lang.annotation.*;
|
||||||
import static java.lang.annotation.ElementType.TYPE;
|
import static java.lang.annotation.ElementType.TYPE;
|
||||||
import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
||||||
|
|
||||||
import java.lang.annotation.*;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 自动加载。 使用场景: 1、被标记为@AutoLoad(false)的Service类不会被自动加载, 当被依赖时才会被加载 2、被标记为@AutoLoad(false)的Servlet类不会被自动加载
|
* 自动加载。 使用场景: <br>
|
||||||
|
* 1、被标记为@AutoLoad(false)的Service类不会被自动加载, 当被依赖时才会被加载 <br>
|
||||||
|
* 2、被标记为@AutoLoad(false)的Servlet类不会被自动加载 <br>
|
||||||
*
|
*
|
||||||
* <p>详情见: https://redkale.org
|
* <p>详情见: https://redkale.org
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -9,6 +9,52 @@ import java.lang.reflect.Field;
|
|||||||
/**
|
/**
|
||||||
* 自定义注入加载器
|
* 自定义注入加载器
|
||||||
*
|
*
|
||||||
|
* <blockquote>
|
||||||
|
* <pre>
|
||||||
|
*
|
||||||
|
* @Documented
|
||||||
|
* @Target({FIELD})
|
||||||
|
* @Retention(RUNTIME)
|
||||||
|
* public @interface CustomConf {
|
||||||
|
* String path();
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* public class CustomConfProvider implements ResourceAnnotationLoader<CustomConf> {
|
||||||
|
*
|
||||||
|
* @Override
|
||||||
|
* public void load(
|
||||||
|
* ResourceFactory factory,
|
||||||
|
* String srcResourceName,
|
||||||
|
* Object srcObj,
|
||||||
|
* CustomConf annotation,
|
||||||
|
* Field field,
|
||||||
|
* Object attachment) {
|
||||||
|
* try {
|
||||||
|
* field.set(srcObj, new File(annotation.path()));
|
||||||
|
* } catch (Exception e) {
|
||||||
|
* e.printStackTrace();
|
||||||
|
* }
|
||||||
|
* System.out.println("对象是 src =" + srcObj + ", path=" + annotation.path());
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* @Override
|
||||||
|
* public Class<CustomConf> annotationType() {
|
||||||
|
* return CustomConf.class;
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* public class InjectBean {
|
||||||
|
*
|
||||||
|
* @CustomConf(path = "conf/test.xml")
|
||||||
|
* public File conf;
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* </pre>
|
||||||
|
* </blockquote>
|
||||||
|
*
|
||||||
* <p>详情见: https://redkale.org
|
* <p>详情见: https://redkale.org
|
||||||
*
|
*
|
||||||
* @since 2.8.0
|
* @since 2.8.0
|
||||||
|
|||||||
@@ -106,17 +106,23 @@ public final class ResourceFactory {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 清空当前已注入资源的缓存 */
|
/**
|
||||||
|
* 清空当前已注入资源的缓存
|
||||||
|
*/
|
||||||
public void release() {
|
public void release() {
|
||||||
this.entryStore.clear();
|
this.entryStore.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** inject时的锁 */
|
/**
|
||||||
|
* inject时的锁
|
||||||
|
*/
|
||||||
public void lock() {
|
public void lock() {
|
||||||
lock.lock();
|
lock.lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** inject时的锁 */
|
/**
|
||||||
|
* inject时的锁
|
||||||
|
*/
|
||||||
public void unlock() {
|
public void unlock() {
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
}
|
}
|
||||||
@@ -279,10 +285,7 @@ public final class ResourceFactory {
|
|||||||
* @return 旧资源对象
|
* @return 旧资源对象
|
||||||
*/
|
*/
|
||||||
public <A> A register(final boolean autoSync, final A rs) {
|
public <A> A register(final boolean autoSync, final A rs) {
|
||||||
if (rs == null) {
|
return rs == null ? null : register(autoSync, "", rs);
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return register(autoSync, "", rs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -623,6 +626,7 @@ public final class ResourceFactory {
|
|||||||
* 注册Configuration配置类
|
* 注册Configuration配置类
|
||||||
*
|
*
|
||||||
* @param configuareClass 标记Configuration的类
|
* @param configuareClass 标记Configuration的类
|
||||||
|
* @return 方法数
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public int registerConfiguration(final Class configuareClass) {
|
public int registerConfiguration(final Class configuareClass) {
|
||||||
@@ -871,20 +875,62 @@ public final class ResourceFactory {
|
|||||||
return parent == null ? null : parent.findSuperTypeLoader(ft, field);
|
return parent == null ? null : parent.findSuperTypeLoader(ft, field);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 找指定类型对应的资源对象
|
||||||
|
*
|
||||||
|
* @param <A> 泛型
|
||||||
|
* @param clazz 资源类型
|
||||||
|
* @return 资源对象
|
||||||
|
*/
|
||||||
public <A> A find(Class<? extends A> clazz) {
|
public <A> A find(Class<? extends A> clazz) {
|
||||||
return find("", clazz);
|
return find("", clazz);
|
||||||
}
|
}
|
||||||
|
|
||||||
public <A> A find(String name, Type clazz) {
|
/**
|
||||||
ResourceEntry re = findEntry(name, clazz);
|
* 找指定类型和资源名对应的资源对象
|
||||||
return re == null ? null : (A) re.value;
|
*
|
||||||
}
|
* @param <A> 泛型
|
||||||
|
* @param name 资源名
|
||||||
|
* @param clazz 资源类型
|
||||||
|
* @return 资源对象
|
||||||
|
*/
|
||||||
public <A> A find(String name, Class<? extends A> clazz) {
|
public <A> A find(String name, Class<? extends A> clazz) {
|
||||||
ResourceEntry<A> re = findEntry(name, clazz);
|
ResourceEntry<A> re = findEntry(name, clazz);
|
||||||
return re == null ? null : re.value;
|
return re == null ? null : re.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 找指定类型对应的资源对象
|
||||||
|
*
|
||||||
|
* @param <A> 泛型
|
||||||
|
* @param clazz 资源类型
|
||||||
|
* @return 资源对象
|
||||||
|
*/
|
||||||
|
public <A> A find(Type clazz) {
|
||||||
|
return find("", clazz);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 找指定类型和资源名对应的资源对象
|
||||||
|
*
|
||||||
|
* @param <A> 泛型
|
||||||
|
* @param name 资源名
|
||||||
|
* @param clazz 资源类型
|
||||||
|
* @return 资源对象
|
||||||
|
*/
|
||||||
|
public <A> A find(String name, Type clazz) {
|
||||||
|
ResourceEntry re = findEntry(name, clazz);
|
||||||
|
return re == null ? null : (A) re.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 找指定类型或子类型和资源名对应的资源对象
|
||||||
|
*
|
||||||
|
* @param <A> 泛型
|
||||||
|
* @param name 资源名
|
||||||
|
* @param clazz 资源类型
|
||||||
|
* @return 资源对象
|
||||||
|
*/
|
||||||
public <A> A findChild(final String name, final Class<? extends A> clazz) {
|
public <A> A findChild(final String name, final Class<? extends A> clazz) {
|
||||||
A rs = find(name, clazz);
|
A rs = find(name, clazz);
|
||||||
if (rs != null) {
|
if (rs != null) {
|
||||||
@@ -905,6 +951,13 @@ public final class ResourceFactory {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 找指定类型和资源名对应的资源对象
|
||||||
|
* @param <A> 泛型
|
||||||
|
* @param name 资源名
|
||||||
|
* @param clazz 资源类型
|
||||||
|
* @return 资源对象
|
||||||
|
*/
|
||||||
private <A> ResourceEntry<A> findEntry(String name, Type clazz) {
|
private <A> ResourceEntry<A> findEntry(String name, Type clazz) {
|
||||||
Map<String, ResourceEntry> map = this.entryStore.get(clazz);
|
Map<String, ResourceEntry> map = this.entryStore.get(clazz);
|
||||||
if (map != null) {
|
if (map != null) {
|
||||||
@@ -919,6 +972,33 @@ public final class ResourceFactory {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加载资源对象, 没有返回null
|
||||||
|
*
|
||||||
|
* @param <A> 泛型
|
||||||
|
* @param clazz 资源类型
|
||||||
|
* @return 资源对象
|
||||||
|
*
|
||||||
|
* @since 2.8.0
|
||||||
|
*/
|
||||||
|
public <A> A load(Class<A> clazz) {
|
||||||
|
return load("", (Type) clazz);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加载资源对象, 没有返回null
|
||||||
|
*
|
||||||
|
* @param <A> 泛型
|
||||||
|
* @param name 资源名
|
||||||
|
* @param clazz 资源类型
|
||||||
|
* @return 资源对象
|
||||||
|
*
|
||||||
|
* @since 2.8.0
|
||||||
|
*/
|
||||||
|
public <A> A load(String name, Class<A> clazz) {
|
||||||
|
return load(name, (Type) clazz);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 加载资源对象, 没有返回null
|
* 加载资源对象, 没有返回null
|
||||||
*
|
*
|
||||||
@@ -962,14 +1042,36 @@ public final class ResourceFactory {
|
|||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取指定类型的资源对象
|
||||||
|
*
|
||||||
|
* @param <A> 泛型
|
||||||
|
* @param clazz 资源类型
|
||||||
|
* @return 资源集合
|
||||||
|
*/
|
||||||
public <A> List<A> query(Class<? extends A> clazz) {
|
public <A> List<A> query(Class<? extends A> clazz) {
|
||||||
return query(new ArrayList<>(), clazz);
|
return query(new ArrayList<>(), clazz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取指定类型的资源对象
|
||||||
|
*
|
||||||
|
* @param <A> 泛型
|
||||||
|
* @param clazz 资源类型
|
||||||
|
* @return 资源集合
|
||||||
|
*/
|
||||||
public <A> List<A> query(Type clazz) {
|
public <A> List<A> query(Type clazz) {
|
||||||
return query(new ArrayList<>(), clazz);
|
return query(new ArrayList<>(), clazz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取指定类型的资源对象
|
||||||
|
*
|
||||||
|
* @param <A> 泛型
|
||||||
|
* @param list 资源集合
|
||||||
|
* @param clazz 资源类型
|
||||||
|
* @return 资源集合
|
||||||
|
*/
|
||||||
private <A> List<A> query(final List<A> list, Type clazz) {
|
private <A> List<A> query(final List<A> list, Type clazz) {
|
||||||
Map<String, ResourceEntry> map = this.entryStore.get(clazz);
|
Map<String, ResourceEntry> map = this.entryStore.get(clazz);
|
||||||
if (map != null) {
|
if (map != null) {
|
||||||
@@ -985,10 +1087,25 @@ public final class ResourceFactory {
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取符合过滤条件的资源对象
|
||||||
|
*
|
||||||
|
* @param <A> 泛型
|
||||||
|
* @param predicate 资源过滤条件
|
||||||
|
* @return 资源集合
|
||||||
|
*/
|
||||||
public <A> List<A> query(final BiPredicate<String, Object> predicate) {
|
public <A> List<A> query(final BiPredicate<String, Object> predicate) {
|
||||||
return query(new ArrayList<>(), predicate);
|
return query(new ArrayList<>(), predicate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取符合过滤条件的资源对象
|
||||||
|
*
|
||||||
|
* @param <A> 泛型
|
||||||
|
* @param list 资源集合
|
||||||
|
* @param predicate 资源过滤条件
|
||||||
|
* @return 资源集合
|
||||||
|
*/
|
||||||
private <A> List<A> query(final List<A> list, final BiPredicate<String, Object> predicate) {
|
private <A> List<A> query(final List<A> list, final BiPredicate<String, Object> predicate) {
|
||||||
if (predicate == null) {
|
if (predicate == null) {
|
||||||
return list;
|
return list;
|
||||||
@@ -1452,11 +1569,11 @@ public final class ResourceFactory {
|
|||||||
this.name = name;
|
this.name = name;
|
||||||
this.value = value;
|
this.value = value;
|
||||||
this.elements = elements == null ? new CopyOnWriteArrayList<>() : elements;
|
this.elements = elements == null ? new CopyOnWriteArrayList<>() : elements;
|
||||||
if (sync && Utility.isNotEmpty(elements)) {
|
if (sync && elements != null && !elements.isEmpty()) {
|
||||||
for (ResourceElement element : elements) {
|
for (ResourceElement element : elements) {
|
||||||
Object dest = element.dest.get();
|
Object dest = element.dest.get();
|
||||||
if (dest == null) {
|
if (dest == null) { // 依赖对象可能被销毁了
|
||||||
continue; // 依赖对象可能被销毁了
|
continue;
|
||||||
}
|
}
|
||||||
Object newVal = Utility.convertValue(element.fieldType, value);
|
Object newVal = Utility.convertValue(element.fieldType, value);
|
||||||
Object oldVal = null;
|
Object oldVal = null;
|
||||||
|
|||||||
@@ -9,6 +9,54 @@ import org.redkale.annotation.Nullable;
|
|||||||
/**
|
/**
|
||||||
* 自定义注入加载器
|
* 自定义注入加载器
|
||||||
*
|
*
|
||||||
|
* <blockquote>
|
||||||
|
* <pre>
|
||||||
|
*
|
||||||
|
* public class CustomConfProvider implements ResourceAnnotationLoader<CustomConf> {
|
||||||
|
*
|
||||||
|
* @Override
|
||||||
|
* public Object load(
|
||||||
|
* ResourceFactory factory,
|
||||||
|
* String srcResourceName,
|
||||||
|
* Object srcObj,
|
||||||
|
* CustomConf annotation,
|
||||||
|
* Field field,
|
||||||
|
* Object attachment) {
|
||||||
|
* DataSource source = new DataMemorySource(resourceName);
|
||||||
|
* factory.register(resourceName, DataSource.class, source);
|
||||||
|
* if (field != null) {
|
||||||
|
* try {
|
||||||
|
* field.set(srcObj, source);
|
||||||
|
* } catch (Exception e) {
|
||||||
|
* e.printStackTrace();
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* return source;
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* @Override
|
||||||
|
* public Type resourceType() {
|
||||||
|
* return DataSource.class;
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* public class InjectBean {
|
||||||
|
*
|
||||||
|
* @Resource(name = "platf")
|
||||||
|
* public DataSource source;
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* ResourceFactory factory = ResourceFactory.create();
|
||||||
|
* factory.register(new DataSourceProvider());
|
||||||
|
* InjectBean bean = new InjectBean();
|
||||||
|
* factory.inject(bean);
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* </pre>
|
||||||
|
* </blockquote>
|
||||||
|
*
|
||||||
* <p>详情见: https://redkale.org
|
* <p>详情见: https://redkale.org
|
||||||
*
|
*
|
||||||
* @author zhangjx
|
* @author zhangjx
|
||||||
|
|||||||
68
src/test/java/org/redkale/test/inject/ResourceTypeTest.java
Normal file
68
src/test/java/org/redkale/test/inject/ResourceTypeTest.java
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.redkale.test.inject;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.redkale.annotation.Resource;
|
||||||
|
import org.redkale.inject.ResourceFactory;
|
||||||
|
import org.redkale.inject.ResourceTypeLoader;
|
||||||
|
import org.redkale.source.DataMemorySource;
|
||||||
|
import org.redkale.source.DataSource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author zhangjx
|
||||||
|
*/
|
||||||
|
public class ResourceTypeTest {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Throwable {
|
||||||
|
ResourceTypeTest test = new ResourceTypeTest();
|
||||||
|
test.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void run() throws Exception {
|
||||||
|
ResourceFactory factory = ResourceFactory.create();
|
||||||
|
factory.register(new DataSourceProvider());
|
||||||
|
InjectBean bean = new InjectBean();
|
||||||
|
factory.inject(bean);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class DataSourceProvider implements ResourceTypeLoader {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object load(
|
||||||
|
ResourceFactory factory,
|
||||||
|
String srcResourceName,
|
||||||
|
Object srcObj,
|
||||||
|
String resourceName,
|
||||||
|
Field field,
|
||||||
|
Object attachment) {
|
||||||
|
DataSource source = new DataMemorySource(resourceName);
|
||||||
|
factory.register(resourceName, DataSource.class, source);
|
||||||
|
if (field != null) {
|
||||||
|
try {
|
||||||
|
field.set(srcObj, source);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Type resourceType() {
|
||||||
|
return DataSource.class;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class InjectBean {
|
||||||
|
|
||||||
|
@Resource(name = "platf")
|
||||||
|
public DataSource source;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user