diff --git a/src/com/wentch/redkale/boot/Application.java b/src/com/wentch/redkale/boot/Application.java index 100458450..443f6bec1 100644 --- a/src/com/wentch/redkale/boot/Application.java +++ b/src/com/wentch/redkale/boot/Application.java @@ -476,7 +476,7 @@ public final class Application { application.servicecdl = new CountDownLatch(1); final NodeServer server = new NodeHttpServer(application, null); server.init(application.config); - server.factory.inject(service); + server.factory.inject(service, server); return service; } diff --git a/src/com/wentch/redkale/boot/NodeHttpServer.java b/src/com/wentch/redkale/boot/NodeHttpServer.java index 5f8992e36..81607dc38 100644 --- a/src/com/wentch/redkale/boot/NodeHttpServer.java +++ b/src/com/wentch/redkale/boot/NodeHttpServer.java @@ -23,7 +23,7 @@ import java.util.logging.*; import javax.annotation.*; /** - * HTTP Server节点的配置Server + * HTTP Server节点的配置Server * * @author zhangjx */ @@ -63,8 +63,9 @@ public final class NodeHttpServer extends NodeServer { } private void initWebSocketService() { + final NodeServer self = this; final ResourceFactory regFactory = application.getResourceFactory(); - factory.add(WebSocketNode.class, (ResourceFactory rf, final Object src, Field field) -> { + factory.add(WebSocketNode.class, (ResourceFactory rf, final Object src, Field field, Object attachment) -> { try { Resource rs = field.getAnnotation(Resource.class); if (rs == null) return; @@ -77,7 +78,7 @@ public final class NodeHttpServer extends NodeServer { nodeService = Sncp.createLocalService(rcname, getExecutor(), (Class) WebSocketNodeService.class, getSncpAddress(), sncpDefaultGroups, sncpSameGroupTransports, sncpDiffGroupTransports); regFactory.register(rcname, WebSocketNode.class, nodeService); - factory.inject(nodeService); + factory.inject(nodeService, self); logger.fine("[" + Thread.currentThread().getName() + "] Load " + nodeService); if (getSncpAddress() != null) { NodeSncpServer sncpServer = null; @@ -108,7 +109,7 @@ public final class NodeHttpServer extends NodeServer { WebServlet ws = clazz.getAnnotation(WebServlet.class); if (ws == null || ws.value().length == 0) continue; final HttpServlet servlet = clazz.newInstance(); - factory.inject(servlet); + factory.inject(servlet, this); String[] mappings = ws.value(); if (ws.fillurl() && !prefix.isEmpty()) { for (int i = 0; i < mappings.length; i++) { diff --git a/src/com/wentch/redkale/boot/NodeServer.java b/src/com/wentch/redkale/boot/NodeServer.java index 361d5800a..78f9fefa9 100644 --- a/src/com/wentch/redkale/boot/NodeServer.java +++ b/src/com/wentch/redkale/boot/NodeServer.java @@ -146,9 +146,10 @@ public abstract class NodeServer { protected abstract void loadServlet(ClassFilter servletFilter) throws Exception; private void initResource() { + final NodeServer self = this; //--------------------------------------------------------------------------------------------- final ResourceFactory regFactory = application.getResourceFactory(); - factory.add(DataSource.class, (ResourceFactory rf, final Object src, Field field) -> { + factory.add(DataSource.class, (ResourceFactory rf, final Object src, Field field, final Object attachment) -> { try { Resource rs = field.getAnnotation(Resource.class); if (rs == null) return; @@ -177,10 +178,10 @@ public abstract class NodeServer { ServiceWrapper wrapper = new ServiceWrapper(DataCacheListenerService.class, cacheListenerService, rs.name(), sncpGroup, sncpDefaultGroups, null); localServiceWrappers.add(wrapper); if (consumer != null) consumer.accept(wrapper); - rf.inject(cacheListenerService); + rf.inject(cacheListenerService, self); } field.set(src, source); - rf.inject(source); // 给 "datasource.nodeid" 赋值 + rf.inject(source, self); // 给 "datasource.nodeid" 赋值 } catch (Exception e) { logger.log(Level.SEVERE, "DataSource inject error", e); } @@ -314,10 +315,10 @@ public abstract class NodeServer { final StringBuilder sb = logger.isLoggable(Level.INFO) ? new StringBuilder() : null; //---------------- inject ---------------- new HashSet<>(localServiceWrappers).forEach(y -> { - factory.inject(y.getService()); + factory.inject(y.getService(), NodeServer.this); }); remoteServiceWrappers.forEach(y -> { - factory.inject(y.getService()); + factory.inject(y.getService(), NodeServer.this); if (sb != null) { sb.append(threadName).append("RemoteService(").append(y.getType()).append(':').append(y.getName()).append(") loaded").append(LINE_SEPARATOR); } @@ -392,12 +393,10 @@ public abstract class NodeServer { String excludes = list.getValue("excludes", ""); filter.setIncludePatterns(includes.split(";")); filter.setExcludePatterns(excludes.split(";")); - } else { - if (ref2 == null || ref2 == Annotation.class) { //service如果是autoload=false则不需要加载 - filter.setRefused(true); - } else if (ref2 != Annotation.class) { - filter.setAnnotationClass(ref2); - } + } else if (ref2 == null || ref2 == Annotation.class) { //service如果是autoload=false则不需要加载 + filter.setRefused(true); + } else if (ref2 != Annotation.class) { + filter.setAnnotationClass(ref2); } cf = (cf == null) ? filter : cf.or(filter); } diff --git a/src/com/wentch/redkale/source/DataSourceFactory.java b/src/com/wentch/redkale/source/DataSourceFactory.java deleted file mode 100644 index 285dfe00f..000000000 --- a/src/com/wentch/redkale/source/DataSourceFactory.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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 com.wentch.redkale.source; - -import java.io.*; -import java.util.logging.*; - -/** - * - * @author zhangjx - */ -public abstract class DataSourceFactory { - - private static final Logger logger = Logger.getLogger(DataSourceFactory.class.getSimpleName()); - - public static DataSource create() { - return create(""); - } - - public static DataSource create(final String unitName) { -// boolean jpa = false; -// if (!"jdbc".equalsIgnoreCase(System.getProperty("source.type", "jpa"))) { -// try { -// jpa = ServiceLoader.load(Class.forName("javax.persistence.spi.PersistenceProvider")).iterator().hasNext(); -// } catch (Exception e) { -// jpa = false; -// } -// } -// if (jpa) return new DataJPASource(unitName); - try { - return new DataDefaultSource(unitName); - } catch (IOException ex) { - logger.log(Level.WARNING, "cannot create DataSource (" + unitName + ")", ex); - return null; - } - } -} diff --git a/src/com/wentch/redkale/util/ResourceFactory.java b/src/com/wentch/redkale/util/ResourceFactory.java index c1f622bb7..7bea3aa84 100644 --- a/src/com/wentch/redkale/util/ResourceFactory.java +++ b/src/com/wentch/redkale/util/ResourceFactory.java @@ -142,11 +142,15 @@ public final class ResourceFactory { if (parent != null) parent.load(reg, clazz, exclude, result); } - public boolean inject(final Object src) { - return inject(src, new ArrayList<>()); + public boolean inject(final Object src) { + return inject(src, null); } - private boolean inject(final Object src, final List list) { + public boolean inject(final Object src, final T attachment) { + return inject(src, attachment, new ArrayList<>()); + } + + private boolean inject(final Object src, final T attachment, final List list) { if (src == null) return false; try { list.add(src); @@ -178,17 +182,15 @@ public final class ResourceFactory { if (rs == null) { if (Map.class.isAssignableFrom(classtype)) { rs = find(Pattern.compile(rcname.isEmpty() ? ".*" : rcname), (Class) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[1], src); + } else if (rcname.startsWith("property.")) { + rs = find(rcname, String.class); } else { - if (rcname.startsWith("property.")) { - rs = find(rcname, String.class); - } else { - rs = find(rcname, classtype); - } + rs = find(rcname, classtype); } } if (rs == null) { Intercepter it = findIntercepter(field.getGenericType(), field); - if (it != null) it.invoke(this, src, field); + if (it != null) it.invoke(this, src, field, attachment); continue; } if (!rs.getClass().isPrimitive() && classtype.isPrimitive()) { @@ -232,7 +234,7 @@ public final class ResourceFactory { public static interface Intercepter { - public void invoke(ResourceFactory factory, Object src, Field field); + public void invoke(ResourceFactory factory, Object src, Field field, Object attachment); } }