From c551c157d1597cbac7605d788435481ce5c1d7a7 Mon Sep 17 00:00:00 2001 From: Redkale <8730487+redkale@users.noreply.github.com> Date: Sat, 19 Dec 2020 19:39:51 +0800 Subject: [PATCH] =?UTF-8?q?@Local=20@AutoLoad(false)=20Service=20=E8=83=BD?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/boot/NodeServer.java | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/org/redkale/boot/NodeServer.java b/src/org/redkale/boot/NodeServer.java index c823e12b2..05ac10005 100644 --- a/src/org/redkale/boot/NodeServer.java +++ b/src/org/redkale/boot/NodeServer.java @@ -271,6 +271,34 @@ public abstract class NodeServer { } }, AnyValue.class, AnyValue[].class); + //------------------------------------- 注册 Local AutoLoad(false) Service -------------------------------------------------------- + resourceFactory.register((ResourceFactory rf, final Object src, String resourceName, Field field, final Object attachment) -> { + Class resServiceType = Service.class; + try { + if (field.getAnnotation(Resource.class) == null) return; + if ((src instanceof Service) && Sncp.isRemote((Service) src)) return; //远程模式不得注入 AutoLoad Service + if (!Service.class.isAssignableFrom(field.getType())) return; + resServiceType = (Class) field.getType(); + if (resServiceType.getAnnotation(Local.class) == null) return; + AutoLoad al = resServiceType.getAnnotation(AutoLoad.class); + if (al == null || al.value()) return; + + //ResourceFactory resfactory = (isSNCP() ? appResFactory : resourceFactory); + SncpClient client = src instanceof Service ? Sncp.getSncpClient((Service) src) : null; + final InetSocketAddress sncpAddr = client == null ? null : client.getClientAddress(); + final Set groups = new HashSet<>(); + Service service = Sncp.createLocalService(serverClassLoader, resourceName, resServiceType, null, appResFactory, appSncpTranFactory, sncpAddr, groups, null); + appResFactory.register(resourceName, resServiceType, service); + + field.set(src, service); + rf.inject(service, self); // 给其可能包含@Resource的字段赋值; + service.init(null); + logger.info("[" + Thread.currentThread().getName() + "] Load Service(@Local @AutoLoad) resourceName = " + resourceName + ", service = " + service); + } catch (Exception e) { + logger.log(Level.SEVERE, "[" + Thread.currentThread().getName() + "] Load @Local @AutoLoad(false) Service inject " + resServiceType + " to " + src + " error", e); + } + }, Service.class); + //------------------------------------- 注册 DataSource -------------------------------------------------------- resourceFactory.register((ResourceFactory rf, final Object src, String resourceName, Field field, final Object attachment) -> { try {