Forráskód Böngészése

支持插件获取上下文

AE86 2 éve
szülő
commit
1a83afe29a

+ 9 - 7
dbsyncer-common/src/main/java/org/dbsyncer/common/spi/ConvertService.java

@@ -16,19 +16,21 @@ public interface ConvertService {
     /**
     /**
      * 全量同步
      * 全量同步
      *
      *
-     * @param source 数据源
-     * @param target 目标源
+     * @param context Spring上下文
+     * @param source  数据源
+     * @param target  目标源
      */
      */
-    void convert(List<Map> source, List<Map> target);
+    void convert(ProxyApplicationContext context, List<Map> source, List<Map> target);
 
 
     /**
     /**
      * 增量同步
      * 增量同步
      *
      *
-     * @param event  事件(INSERT/UPDATE/DELETE)
-     * @param source 数据源
-     * @param target 目标源
+     * @param context Spring上下文
+     * @param event   事件(INSERT/UPDATE/DELETE)
+     * @param source  数据源
+     * @param target  目标源
      */
      */
-    void convert(String event, Map source, Map target);
+    void convert(ProxyApplicationContext context, String event, Map source, Map target);
 
 
     /**
     /**
      * 版本号
      * 版本号

+ 13 - 0
dbsyncer-common/src/main/java/org/dbsyncer/common/spi/ProxyApplicationContext.java

@@ -0,0 +1,13 @@
+package org.dbsyncer.common.spi;
+
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Spring上下文代理对象
+ *
+ * @author AE86
+ * @version 1.0.0
+ * @date 2022/6/30 15:13
+ */
+public interface ProxyApplicationContext extends ApplicationContext {
+}

+ 6 - 2
dbsyncer-plugin/src/main/java/org/dbsyncer/plugin/PluginFactory.java

@@ -1,6 +1,7 @@
 package org.dbsyncer.plugin;
 package org.dbsyncer.plugin;
 
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FileUtils;
+import org.dbsyncer.common.spi.ProxyApplicationContext;
 import org.dbsyncer.common.spi.ConvertService;
 import org.dbsyncer.common.spi.ConvertService;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.plugin.config.Plugin;
 import org.dbsyncer.plugin.config.Plugin;
@@ -45,6 +46,9 @@ public class PluginFactory {
     @Autowired
     @Autowired
     private Map<String, ConvertService> service;
     private Map<String, ConvertService> service;
 
 
+    @Autowired
+    private ProxyApplicationContext applicationContextProxy;
+
     @PostConstruct
     @PostConstruct
     private void init() {
     private void init() {
         Map<String, ConvertService> unmodifiable = new LinkedHashMap<>();
         Map<String, ConvertService> unmodifiable = new LinkedHashMap<>();
@@ -92,13 +96,13 @@ public class PluginFactory {
 
 
     public void convert(Plugin plugin, List<Map> source, List<Map> target) {
     public void convert(Plugin plugin, List<Map> source, List<Map> target) {
         if (null != plugin && service.containsKey(plugin.getClassName())) {
         if (null != plugin && service.containsKey(plugin.getClassName())) {
-            service.get(plugin.getClassName()).convert(source, target);
+            service.get(plugin.getClassName()).convert(applicationContextProxy, source, target);
         }
         }
     }
     }
 
 
     public void convert(Plugin plugin, String event, Map<String, Object> source, Map<String, Object> target) {
     public void convert(Plugin plugin, String event, Map<String, Object> source, Map<String, Object> target) {
         if (null != plugin && service.containsKey(plugin.getClassName())) {
         if (null != plugin && service.containsKey(plugin.getClassName())) {
-            service.get(plugin.getClassName()).convert(event, source, target);
+            service.get(plugin.getClassName()).convert(applicationContextProxy, event, source, target);
         }
         }
     }
     }
 
 

+ 250 - 0
dbsyncer-plugin/src/main/java/org/dbsyncer/plugin/proxy/ProxyApplicationContextImpl.java

@@ -0,0 +1,250 @@
+package org.dbsyncer.plugin.proxy;
+
+import org.dbsyncer.common.spi.ProxyApplicationContext;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.MessageSourceResolvable;
+import org.springframework.context.NoSuchMessageException;
+import org.springframework.core.ResolvableType;
+import org.springframework.core.env.Environment;
+import org.springframework.core.io.Resource;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.lang.annotation.Annotation;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * @author AE86
+ * @version 1.0.0
+ * @date 2022/6/30 15:14
+ */
+@Component("proxyApplicationContext")
+public class ProxyApplicationContextImpl implements ProxyApplicationContext {
+
+    @Qualifier("webApplicationContext")
+    @Autowired
+    private ApplicationContext applicationContext;
+
+    @Override
+    public String getId() {
+        return applicationContext.getId();
+    }
+
+    @Override
+    public String getApplicationName() {
+        return applicationContext.getApplicationName();
+    }
+
+    @Override
+    public String getDisplayName() {
+        return applicationContext.getDisplayName();
+    }
+
+    @Override
+    public long getStartupDate() {
+        return applicationContext.getStartupDate();
+    }
+
+    @Override
+    public ApplicationContext getParent() {
+        return applicationContext.getParent();
+    }
+
+    @Override
+    public AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException {
+        return applicationContext.getAutowireCapableBeanFactory();
+    }
+
+    @Override
+    public BeanFactory getParentBeanFactory() {
+        return applicationContext.getParentBeanFactory();
+    }
+
+    @Override
+    public boolean containsLocalBean(String name) {
+        return applicationContext.containsLocalBean(name);
+    }
+
+    @Override
+    public boolean containsBeanDefinition(String beanName) {
+        return applicationContext.containsBeanDefinition(beanName);
+    }
+
+    @Override
+    public int getBeanDefinitionCount() {
+        return applicationContext.getBeanDefinitionCount();
+    }
+
+    @Override
+    public String[] getBeanDefinitionNames() {
+        return applicationContext.getBeanDefinitionNames();
+    }
+
+    @Override
+    public String[] getBeanNamesForType(ResolvableType type) {
+        return applicationContext.getBeanNamesForType(type);
+    }
+
+    @Override
+    public String[] getBeanNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit) {
+        return applicationContext.getBeanNamesForType(type, includeNonSingletons, allowEagerInit);
+    }
+
+    @Override
+    public String[] getBeanNamesForType(Class<?> type) {
+        return applicationContext.getBeanNamesForType(type);
+    }
+
+    @Override
+    public String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit) {
+        return applicationContext.getBeanNamesForType(type, includeNonSingletons, allowEagerInit);
+    }
+
+    @Override
+    public <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException {
+        return applicationContext.getBeansOfType(type);
+    }
+
+    @Override
+    public <T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons, boolean allowEagerInit) throws BeansException {
+        return applicationContext.getBeansOfType(type, includeNonSingletons, allowEagerInit);
+    }
+
+    @Override
+    public String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType) {
+        return applicationContext.getBeanNamesForAnnotation(annotationType);
+    }
+
+    @Override
+    public Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException {
+        return applicationContext.getBeansWithAnnotation(annotationType);
+    }
+
+    @Override
+    public <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType) throws NoSuchBeanDefinitionException {
+        return applicationContext.findAnnotationOnBean(beanName, annotationType);
+    }
+
+    @Override
+    public Object getBean(String name) throws BeansException {
+        return applicationContext.getBean(name);
+    }
+
+    @Override
+    public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
+        return applicationContext.getBean(name, requiredType);
+    }
+
+    @Override
+    public Object getBean(String name, Object... args) throws BeansException {
+        return applicationContext.getBean(name, args);
+    }
+
+    @Override
+    public <T> T getBean(Class<T> requiredType) throws BeansException {
+        return applicationContext.getBean(requiredType);
+    }
+
+    @Override
+    public <T> T getBean(Class<T> requiredType, Object... args) throws BeansException {
+        return applicationContext.getBean(requiredType, args);
+    }
+
+    @Override
+    public <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType) {
+        return applicationContext.getBeanProvider(requiredType);
+    }
+
+    @Override
+    public <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType) {
+        return applicationContext.getBeanProvider(requiredType);
+    }
+
+    @Override
+    public boolean containsBean(String name) {
+        return applicationContext.containsBean(name);
+    }
+
+    @Override
+    public boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
+        return applicationContext.isSingleton(name);
+    }
+
+    @Override
+    public boolean isPrototype(String name) throws NoSuchBeanDefinitionException {
+        return applicationContext.isPrototype(name);
+    }
+
+    @Override
+    public boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException {
+        return applicationContext.isTypeMatch(name, typeToMatch);
+    }
+
+    @Override
+    public boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException {
+        return applicationContext.isTypeMatch(name, typeToMatch);
+    }
+
+    @Override
+    public Class<?> getType(String name) throws NoSuchBeanDefinitionException {
+        return applicationContext.getType(name);
+    }
+
+    @Override
+    public Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException {
+        return applicationContext.getType(name, allowFactoryBeanInit);
+    }
+
+    @Override
+    public String[] getAliases(String name) {
+        return applicationContext.getAliases(name);
+    }
+
+    @Override
+    public void publishEvent(Object event) {
+        applicationContext.publishEvent(event);
+    }
+
+    @Override
+    public String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
+        return applicationContext.getMessage(code, args, defaultMessage, locale);
+    }
+
+    @Override
+    public String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException {
+        return applicationContext.getMessage(code, args, locale);
+    }
+
+    @Override
+    public String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException {
+        return applicationContext.getMessage(resolvable, locale);
+    }
+
+    @Override
+    public Environment getEnvironment() {
+        return applicationContext.getEnvironment();
+    }
+
+    @Override
+    public Resource[] getResources(String locationPattern) throws IOException {
+        return applicationContext.getResources(locationPattern);
+    }
+
+    @Override
+    public Resource getResource(String location) {
+        return applicationContext.getResource(location);
+    }
+
+    @Override
+    public ClassLoader getClassLoader() {
+        return applicationContext.getClassLoader();
+    }
+}

+ 3 - 2
dbsyncer-plugin/src/main/java/org/dbsyncer/plugin/service/DemoConvertServiceImpl.java

@@ -2,6 +2,7 @@ package org.dbsyncer.plugin.service;
 
 
 import org.dbsyncer.common.config.AppConfig;
 import org.dbsyncer.common.config.AppConfig;
 import org.dbsyncer.common.spi.ConvertService;
 import org.dbsyncer.common.spi.ConvertService;
+import org.dbsyncer.common.spi.ProxyApplicationContext;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,11 +20,11 @@ public class DemoConvertServiceImpl implements ConvertService {
     private AppConfig appConfig;
     private AppConfig appConfig;
 
 
     @Override
     @Override
-    public void convert(List<Map> source, List<Map> target) {
+    public void convert(ProxyApplicationContext context, List<Map> source, List<Map> target) {
     }
     }
 
 
     @Override
     @Override
-    public void convert(String event, Map source, Map target) {
+    public void convert(ProxyApplicationContext context, String event, Map source, Map target) {
         logger.info("插件正在处理同步数据,事件:{},数据:{}", event, source);
         logger.info("插件正在处理同步数据,事件:{},数据:{}", event, source);
     }
     }