diff --git a/dorive-api/pom.xml b/dorive-api/pom.xml
index 690528bbf1ca278957f766edf02d09f6d16e210f..9ab13060240994ebcd6ea4a0ed5c04228a2d69dc 100644
--- a/dorive-api/pom.xml
+++ b/dorive-api/pom.xml
@@ -6,7 +6,7 @@
com.gitee.digital-engine
dorive
- 3.5.0.5
+ 3.5.0.6
dorive-api
diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/query/Query.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/query/Query.java
index 18f7bdecb53fd0dabf47730f70ac0cdb29f89c92..e0130ccced1bc34ee4c17e17ad2fa9a6424b43de 100644
--- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/query/Query.java
+++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/query/Query.java
@@ -25,6 +25,8 @@ import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
public @interface Query {
+ String method() default "";
+
String[] ignoreFields() default {};
String sortByField() default "sortBy";
diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/query/QueryDefinition.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/query/QueryDefinition.java
index 7a98b703f9ab62db1ee814b6409f54995e51d6ee..43fc31f6744828dc295192ca2abd76f8d2201a24 100644
--- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/query/QueryDefinition.java
+++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/query/QueryDefinition.java
@@ -18,12 +18,14 @@
package com.gitee.dorive.api.entity.query;
import com.gitee.dorive.api.entity.core.Field;
+import com.gitee.dorive.api.entity.query.def.QueryDef;
import lombok.Data;
import java.util.List;
@Data
public class QueryDefinition {
+ private QueryDef queryDef;
private Class> genericType;
private List queryFieldDefinitions;
private List ignoreFields;
diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/query/def/QueryDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/query/def/QueryDef.java
index bd6a37c31b3512271a5aa85fe1f05e033ec9f424..7596ee6197dfb9ef08d7672e952af7cc5087c3f9 100644
--- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/query/def/QueryDef.java
+++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/query/def/QueryDef.java
@@ -25,6 +25,7 @@ import java.lang.reflect.AnnotatedElement;
@Data
public class QueryDef {
+ private String method;
private String[] ignoreFields;
private String sortByField;
private String orderField;
@@ -35,6 +36,7 @@ public class QueryDef {
Query query = AnnotatedElementUtils.getMergedAnnotation(element, Query.class);
if (query != null) {
QueryDef queryDef = new QueryDef();
+ queryDef.setMethod(query.method());
queryDef.setIgnoreFields(query.ignoreFields());
queryDef.setSortByField(query.sortByField());
queryDef.setOrderField(query.orderField());
diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/query/QueryDefinitionResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/query/QueryDefinitionResolver.java
index f147c77188fb2d213d3712a3b59e95c169e2d777..d47641b0447e0bd0f090990635c0d9d94e13c4ac 100644
--- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/query/QueryDefinitionResolver.java
+++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/query/QueryDefinitionResolver.java
@@ -36,16 +36,18 @@ import java.util.Map;
public class QueryDefinitionResolver {
public QueryDefinition resolve(Class> queryType) {
+ QueryDef queryDef = QueryDef.fromElement(queryType);
+ Assert.notNull(queryDef, "The @Query does not exist!");
+ assert queryDef != null;
+
QueryDefinition queryDefinition = new QueryDefinition();
+ queryDefinition.setQueryDef(queryDef);
queryDefinition.setGenericType(queryType);
- readFields(queryType, queryDefinition);
+ readFields(queryType, queryDef, queryDefinition);
return queryDefinition;
}
- private void readFields(Class> queryType, QueryDefinition queryDefinition) {
- QueryDef queryDef = QueryDef.fromElement(queryType);
- Assert.notNull(queryDef, "The @Query does not exist!");
- assert queryDef != null;
+ private void readFields(Class> queryType, QueryDef queryDef, QueryDefinition queryDefinition) {
String[] ignoreFieldNames = queryDef.getIgnoreFields();
String sortByField = queryDef.getSortByField();
String orderField = queryDef.getOrderField();
diff --git a/dorive-core/pom.xml b/dorive-core/pom.xml
index 0d72afd776d0190ee6b6ccaadb816e0f67a89fd5..b693efee801e2bb963404dba3433e506a4f8f0c6 100644
--- a/dorive-core/pom.xml
+++ b/dorive-core/pom.xml
@@ -6,7 +6,7 @@
com.gitee.digital-engine
dorive
- 3.5.0.5
+ 3.5.0.6
dorive-core
diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java
index 4942b0ab607e2b3403dbdf005f4cabfdf3ea7b1c..0311af50e62ccfd9472a7e5847e83200ca0141e7 100644
--- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java
+++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java
@@ -20,6 +20,7 @@ package com.gitee.dorive.core.entity.common;
import lombok.AllArgsConstructor;
import lombok.Data;
+import java.lang.reflect.Method;
import java.util.Map;
@Data
@@ -35,4 +36,5 @@ public class EntityStoreInfo {
private Map propAliasMapping;
private Map aliasPropMapping;
private String selectColumns;
+ private Map selectMethodMap;
}
diff --git a/dorive-env/pom.xml b/dorive-env/pom.xml
index d31d3c83b0cdddde96ca49d25346aab74480fe6e..af7c9372b9e1ce7360cb44baa35034e1b07a6e6a 100644
--- a/dorive-env/pom.xml
+++ b/dorive-env/pom.xml
@@ -6,7 +6,7 @@
com.gitee.digital-engine
dorive
- 3.5.0.5
+ 3.5.0.6
dorive-env
diff --git a/dorive-event/pom.xml b/dorive-event/pom.xml
index db06c50c7cd9e61e8ee0ef52201376ad65adc77e..fb344b3ecf84f20718a7ddb89b8159863da66dab 100644
--- a/dorive-event/pom.xml
+++ b/dorive-event/pom.xml
@@ -6,7 +6,7 @@
com.gitee.digital-engine
dorive
- 3.5.0.5
+ 3.5.0.6
dorive-event
diff --git a/dorive-inject/pom.xml b/dorive-inject/pom.xml
index 1366595f6f7d8e46bf185dfffef109354a3dbe92..5dea9ba47f48145a5789dc8504a1b8b110d90e49 100644
--- a/dorive-inject/pom.xml
+++ b/dorive-inject/pom.xml
@@ -6,7 +6,7 @@
com.gitee.digital-engine
dorive
- 3.5.0.5
+ 3.5.0.6
dorive-inject
diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/annotation/Root.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/api/ModuleChecker.java
similarity index 81%
rename from dorive-inject/src/main/java/com/gitee/dorive/inject/annotation/Root.java
rename to dorive-inject/src/main/java/com/gitee/dorive/inject/api/ModuleChecker.java
index 00531fef57d8bc9aefb682bca91192199d40ed24..718f52d0d9ef6edb9d1f1c731b9648b9e36cdebb 100644
--- a/dorive-inject/src/main/java/com/gitee/dorive/inject/annotation/Root.java
+++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/api/ModuleChecker.java
@@ -15,13 +15,12 @@
* limitations under the License.
*/
-package com.gitee.dorive.inject.annotation;
+package com.gitee.dorive.inject.api;
-import java.lang.annotation.*;
+public interface ModuleChecker {
+
+ boolean isUnderScanPackage(Class> typeToMatch);
+
+ void checkInjection(Class> type, Class> injectedType);
-@Inherited
-@Documented
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface Root {
}
diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java
index 3fd6e0b823b7458d1b5a11db9795764f5d96590d..a382ec493c38034250417866cfadd429e8dac2b1 100644
--- a/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java
+++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java
@@ -18,12 +18,11 @@
package com.gitee.dorive.inject.config;
import cn.hutool.core.lang.Assert;
-import com.gitee.dorive.inject.impl.DefaultTypeDomainResolver;
+import com.gitee.dorive.inject.api.ModuleChecker;
+import com.gitee.dorive.inject.entity.ModuleDefinition;
+import com.gitee.dorive.inject.impl.DefaultModuleChecker;
import com.gitee.dorive.inject.spring.LimitedAutowiredBeanPostProcessor;
import com.gitee.dorive.inject.spring.LimitedCglibSubclassingInstantiationStrategy;
-import com.gitee.dorive.inject.spring.LimitedRootInitializingBean;
-import com.gitee.dorive.inject.api.TypeDomainResolver;
-import com.gitee.dorive.inject.entity.DomainDefinition;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
@@ -32,49 +31,45 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClas
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.bind.Bindable;
import org.springframework.boot.context.properties.bind.Binder;
+import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.core.env.Environment;
+import java.util.Comparator;
import java.util.List;
@Order(-100)
@Configuration
@ConditionalOnProperty(prefix = "dorive", name = "enable", havingValue = "true")
-public class DoriveInjectionConfiguration implements BeanFactoryPostProcessor {
+public class DoriveInjectionConfiguration implements EnvironmentAware, BeanFactoryPostProcessor {
- public static final String SCAN_KEY = "dorive.scan";
- public static final String DOMAINS_KEY = "dorive.domains";
+ public static final String DORIVE_SCAN_KEY = "dorive.scan";
+ public static final String DORIVE_MODULES_KEY = "dorive.modules";
+ public static ModuleChecker moduleChecker;
@Override
- public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
- if (beanFactory instanceof AbstractAutowireCapableBeanFactory) {
- AbstractAutowireCapableBeanFactory abstractAutowireCapableBeanFactory = (AbstractAutowireCapableBeanFactory) beanFactory;
- abstractAutowireCapableBeanFactory.setInstantiationStrategy(new LimitedCglibSubclassingInstantiationStrategy());
- }
+ public void setEnvironment(Environment environment) {
+ String scanPackage = environment.getProperty(DORIVE_SCAN_KEY);
+ Assert.notBlank(scanPackage, "The configuration item could not be found! name: {}", DORIVE_SCAN_KEY);
+ List moduleDefinitions = Binder.get(environment).bind(DORIVE_MODULES_KEY, Bindable.listOf(ModuleDefinition.class)).get();
+ moduleDefinitions.sort(Comparator.comparing(ModuleDefinition::getName));
+ moduleChecker = new DefaultModuleChecker(scanPackage, moduleDefinitions);
}
- @Bean("typeDomainResolverV3")
- @ConditionalOnMissingClass
- public TypeDomainResolver typeDomainResolver(Environment environment) {
- String scanPackage = environment.getProperty(SCAN_KEY);
- Assert.notBlank(scanPackage, "The configuration item could not be found! name: [spring.domain.scan]");
- List domainDefinitions = Binder.get(environment).bind(DOMAINS_KEY, Bindable.listOf(DomainDefinition.class)).get();
- domainDefinitions.sort((o1, o2) -> o2.getName().compareTo(o1.getName()));
- return new DefaultTypeDomainResolver(scanPackage, domainDefinitions);
+ @Override
+ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
+ if (moduleChecker != null && beanFactory instanceof AbstractAutowireCapableBeanFactory) {
+ AbstractAutowireCapableBeanFactory abstractBeanFactory = (AbstractAutowireCapableBeanFactory) beanFactory;
+ abstractBeanFactory.setInstantiationStrategy(new LimitedCglibSubclassingInstantiationStrategy(moduleChecker));
+ }
}
@Bean("limitedAnnotationBeanPostProcessorV3")
@ConditionalOnMissingClass
- public LimitedAutowiredBeanPostProcessor limitedAnnotationBeanPostProcessor(TypeDomainResolver typeDomainResolver) {
- return new LimitedAutowiredBeanPostProcessor(typeDomainResolver);
- }
-
- @Bean("limitedRootInitializingBeanV3")
- @ConditionalOnMissingClass
- public LimitedRootInitializingBean limitedRootInitializingBean(TypeDomainResolver typeDomainResolver) {
- return new LimitedRootInitializingBean(typeDomainResolver);
+ public LimitedAutowiredBeanPostProcessor limitedAnnotationBeanPostProcessor() {
+ return new LimitedAutowiredBeanPostProcessor(moduleChecker);
}
}
diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/entity/DomainDefinition.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/entity/ExportDefinition.java
similarity index 89%
rename from dorive-inject/src/main/java/com/gitee/dorive/inject/entity/DomainDefinition.java
rename to dorive-inject/src/main/java/com/gitee/dorive/inject/entity/ExportDefinition.java
index afc5e0d17040e2d79e984bd65e0ca9c81fbe6819..702e14cebdc3367c57777bcee459f5f2d7766b3a 100644
--- a/dorive-inject/src/main/java/com/gitee/dorive/inject/entity/DomainDefinition.java
+++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/entity/ExportDefinition.java
@@ -22,8 +22,6 @@ import lombok.Data;
@Data
@AllArgsConstructor
-public class DomainDefinition {
- private String name;
- private String pattern;
- private String protect;
+public class ExportDefinition {
+ private String path;
}
diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/api/TypeDomainResolver.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/entity/ModuleDefinition.java
similarity index 69%
rename from dorive-inject/src/main/java/com/gitee/dorive/inject/api/TypeDomainResolver.java
rename to dorive-inject/src/main/java/com/gitee/dorive/inject/entity/ModuleDefinition.java
index 1ea67118bd84d97c3dc4b380fbf794c5dff5f469..38c7561af17c978c4805ae67ad6a28ab4aebb4cd 100644
--- a/dorive-inject/src/main/java/com/gitee/dorive/inject/api/TypeDomainResolver.java
+++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/entity/ModuleDefinition.java
@@ -15,18 +15,17 @@
* limitations under the License.
*/
-package com.gitee.dorive.inject.api;
+package com.gitee.dorive.inject.entity;
-import com.gitee.dorive.inject.entity.DomainDefinition;
+import lombok.AllArgsConstructor;
+import lombok.Data;
-public interface TypeDomainResolver {
-
- boolean isUnderScanPackage(Class> typeToMatch);
-
- DomainDefinition getDomainDefinition(Class> typeToMatch);
-
- void checkDomain(Class> type, Class> injectedType);
-
- void checkProtection(Class> type);
+import java.util.List;
+@Data
+@AllArgsConstructor
+public class ModuleDefinition {
+ private String name;
+ private String path;
+ private List exports;
}
diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultTypeDomainResolver.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleChecker.java
similarity index 35%
rename from dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultTypeDomainResolver.java
rename to dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleChecker.java
index 39015df173f3260573d39343c0c64a6ba1e9aaad..6d4ee49bda0ec6f63b9a149974ff861789cb1858 100644
--- a/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultTypeDomainResolver.java
+++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleChecker.java
@@ -18,26 +18,23 @@
package com.gitee.dorive.inject.impl;
import cn.hutool.core.collection.CollUtil;
-import com.gitee.dorive.inject.annotation.Root;
-import com.gitee.dorive.inject.api.TypeDomainResolver;
-import com.gitee.dorive.inject.entity.DomainDefinition;
-import org.apache.commons.lang3.StringUtils;
+import com.gitee.dorive.inject.api.ModuleChecker;
+import com.gitee.dorive.inject.entity.ExportDefinition;
+import com.gitee.dorive.inject.entity.ModuleDefinition;
import org.springframework.beans.factory.BeanCreationException;
-import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.util.AntPathMatcher;
import java.util.List;
-import java.util.Objects;
-public class DefaultTypeDomainResolver implements TypeDomainResolver {
+public class DefaultModuleChecker implements ModuleChecker {
private final AntPathMatcher antPathMatcher = new AntPathMatcher(".");
private final String scanPackage;
- private final List domainDefinitions;
+ private final List moduleDefinitions;
- public DefaultTypeDomainResolver(String scanPackage, List domainDefinitions) {
+ public DefaultModuleChecker(String scanPackage, List moduleDefinitions) {
this.scanPackage = scanPackage;
- this.domainDefinitions = domainDefinitions;
+ this.moduleDefinitions = moduleDefinitions;
}
@Override
@@ -46,59 +43,50 @@ public class DefaultTypeDomainResolver implements TypeDomainResolver {
}
@Override
- public DomainDefinition getDomainDefinition(Class> typeToMatch) {
- return CollUtil.findOne(domainDefinitions, item -> antPathMatcher.match(item.getPattern(), typeToMatch.getName()));
- }
-
- @Override
- public void checkDomain(Class> type, Class> injectedType) {
- Root rootAnnotation = AnnotationUtils.getAnnotation(injectedType, Root.class);
- if (rootAnnotation != null) {
- return;
- }
-
- DomainDefinition injectedDomainDefinition = getDomainDefinition(injectedType);
- if (injectedDomainDefinition == null) {
- return;
- }
-
- DomainDefinition domainDefinition = getDomainDefinition(type);
- if (domainDefinition == null) {
- throwInjectionException(type, null, injectedType, injectedDomainDefinition.getName());
- return;
- }
-
- String domainName = domainDefinition.getName();
- String injectedDomainName = injectedDomainDefinition.getName();
-
- boolean isSameDomain = Objects.equals(domainName, injectedDomainName);
- boolean isSubdomain = domainName.startsWith(injectedDomainName + "-");
-
- if (!isSameDomain && !isSubdomain) {
- throwInjectionException(type, domainName, injectedType, injectedDomainName);
+ public void checkInjection(Class> type, Class> injectedType) {
+ if (isUnderScanPackage(injectedType)) {
+ // 模块定义不存在,则判定为通过
+ ModuleDefinition moduleDefinition = findModuleDefinition(injectedType);
+ if (moduleDefinition == null) {
+ return;
+ }
+ // 在公开的包路径下,则判定为通过
+ ExportDefinition exportDefinition = findExportDefinition(injectedType, moduleDefinition);
+ if (exportDefinition != null) {
+ return;
+ }
+ // 模块
+ if (isUnderScanPackage(type)) {
+ ModuleDefinition thisModuleDefinition = findModuleDefinition(type);
+ if (thisModuleDefinition != null) {
+ String thisModuleName = thisModuleDefinition.getName();
+ String moduleName = moduleDefinition.getName();
+ // 相同模块
+ if (thisModuleName.equals(moduleName)) {
+ return;
+ }
+ // 子模块允许引用父模块
+ if (thisModuleName.startsWith(moduleName + "-") || thisModuleName.startsWith(moduleName + "_")) {
+ return;
+ }
+ }
+ }
+ // 抛出异常
+ throwInjectionException(type, injectedType);
}
}
- private void throwInjectionException(Class> type, String domainName, Class> injectedType, String injectedDomainName) {
- String message = String.format("Injection of autowired dependencies failed! type: [%s], domain: [%s], injectedType: [%s], injectedDomain: [%s]",
- type.getName(), domainName, injectedType.getName(), injectedDomainName);
- throw new BeanCreationException(message);
+ private ModuleDefinition findModuleDefinition(Class> typeToMatch) {
+ return CollUtil.findOne(moduleDefinitions, item -> antPathMatcher.match(item.getPath(), typeToMatch.getName()));
}
- @Override
- public void checkProtection(Class> type) {
- DomainDefinition domainDefinition = getDomainDefinition(type);
- if (domainDefinition == null) {
- return;
- }
-
- String protect = domainDefinition.getProtect();
- String typeName = type.getName();
+ private ExportDefinition findExportDefinition(Class> typeToMatch, ModuleDefinition moduleDefinition) {
+ return CollUtil.findOne(moduleDefinition.getExports(), item -> antPathMatcher.match(item.getPath(), typeToMatch.getName()));
+ }
- if (StringUtils.isNotBlank(protect) && antPathMatcher.match(protect, typeName)) {
- String message = String.format("The type with @Root annotation is protected! protect: [%s], type: [%s]", protect, typeName);
- throw new BeanCreationException(message);
- }
+ private void throwInjectionException(Class> type, Class> injectedType) {
+ String message = String.format("Injection of autowired dependencies failed! type: %s, injectedType: %s", type.getName(), injectedType.getName());
+ throw new BeanCreationException(message);
}
}
diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedAutowiredBeanPostProcessor.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedAutowiredBeanPostProcessor.java
index d28be76eed1cd4ad0bf6614bedca532f2b8d8731..c2c9953f9ca919416d9040c7246e2fa7431d1b0c 100644
--- a/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedAutowiredBeanPostProcessor.java
+++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedAutowiredBeanPostProcessor.java
@@ -17,7 +17,7 @@
package com.gitee.dorive.inject.spring;
-import com.gitee.dorive.inject.api.TypeDomainResolver;
+import com.gitee.dorive.inject.api.ModuleChecker;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -39,12 +39,12 @@ import java.util.*;
public class LimitedAutowiredBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter implements MergedBeanDefinitionPostProcessor {
protected final Log logger = LogFactory.getLog(getClass());
- private final TypeDomainResolver typeDomainResolver;
+ private final ModuleChecker moduleChecker;
private final Set> autowiredAnnotationTypes = new LinkedHashSet<>(4);
@SuppressWarnings("unchecked")
- public LimitedAutowiredBeanPostProcessor(TypeDomainResolver typeDomainResolver) {
- this.typeDomainResolver = typeDomainResolver;
+ public LimitedAutowiredBeanPostProcessor(ModuleChecker moduleChecker) {
+ this.moduleChecker = moduleChecker;
this.autowiredAnnotationTypes.add(Autowired.class);
try {
this.autowiredAnnotationTypes.add((Class extends Annotation>)
@@ -57,7 +57,7 @@ public class LimitedAutowiredBeanPostProcessor extends InstantiationAwareBeanPos
@Override
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class> beanType, String beanName) {
- checkAutowiredFieldDomain(beanType);
+ checkAutowiredFieldModule(beanType);
}
@Override
@@ -65,7 +65,7 @@ public class LimitedAutowiredBeanPostProcessor extends InstantiationAwareBeanPos
// ignore
}
- private void checkAutowiredFieldDomain(final Class> clazz) {
+ private void checkAutowiredFieldModule(final Class> clazz) {
ReflectionUtils.doWithLocalFields(clazz, field -> {
AnnotationAttributes ann = findAutowiredAnnotation(field);
if (ann != null) {
@@ -75,7 +75,7 @@ public class LimitedAutowiredBeanPostProcessor extends InstantiationAwareBeanPos
}
return;
}
- doCheckAutowiredFieldDomain(clazz, field);
+ doCheckAutowiredFieldModule(clazz, field);
}
});
}
@@ -93,10 +93,8 @@ public class LimitedAutowiredBeanPostProcessor extends InstantiationAwareBeanPos
return null;
}
- private void doCheckAutowiredFieldDomain(Class> clazz, Field field) {
- if (typeDomainResolver.isUnderScanPackage(clazz) && typeDomainResolver.isUnderScanPackage(field.getType())) {
- typeDomainResolver.checkDomain(clazz, field.getType());
- }
+ private void doCheckAutowiredFieldModule(Class> clazz, Field field) {
+ moduleChecker.checkInjection(clazz, field.getType());
}
}
diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java
index 50bb20ec9b38f9018a13de72c192ca7b2ac70625..a15501e0d861963703f13d3990da204515a368cb 100644
--- a/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java
+++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java
@@ -17,43 +17,32 @@
package com.gitee.dorive.inject.spring;
-import com.gitee.dorive.inject.api.TypeDomainResolver;
+import com.gitee.dorive.inject.api.ModuleChecker;
+import lombok.AllArgsConstructor;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.support.CglibSubclassingInstantiationStrategy;
import org.springframework.beans.factory.support.RootBeanDefinition;
import java.lang.reflect.Constructor;
+@AllArgsConstructor
public class LimitedCglibSubclassingInstantiationStrategy extends CglibSubclassingInstantiationStrategy {
- private TypeDomainResolver typeDomainResolver;
+ private final ModuleChecker moduleChecker;
@Override
public Object instantiate(RootBeanDefinition bd, String beanName, BeanFactory owner, Constructor> ctor, Object... args) {
- tryGetResolverFromContext(owner);
- if (typeDomainResolver != null) {
- Class> resolvableType = (Class>) bd.getResolvableType().getType();
- if (isNotSpringInternalType(resolvableType) && typeDomainResolver.isUnderScanPackage(resolvableType)) {
- for (Class> parameterType : ctor.getParameterTypes()) {
- if (isNotSpringInternalType(parameterType) && typeDomainResolver.isUnderScanPackage(parameterType)) {
- typeDomainResolver.checkDomain(resolvableType, parameterType);
- }
+ Class> resolvableType = (Class>) bd.getResolvableType().getType();
+ if (isNotSpringInternalType(resolvableType) && moduleChecker.isUnderScanPackage(resolvableType)) {
+ for (Class> parameterType : ctor.getParameterTypes()) {
+ if (isNotSpringInternalType(parameterType) && moduleChecker.isUnderScanPackage(parameterType)) {
+ moduleChecker.checkInjection(resolvableType, parameterType);
}
}
}
return super.instantiate(bd, beanName, owner, ctor, args);
}
- private void tryGetResolverFromContext(BeanFactory owner) {
- if (typeDomainResolver == null) {
- synchronized (this) {
- if (typeDomainResolver == null) {
- typeDomainResolver = owner.getBean(TypeDomainResolver.class);
- }
- }
- }
- }
-
private boolean isNotSpringInternalType(Class> typeToMatch) {
return !typeToMatch.getName().startsWith("org.springframework.");
}
diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/util/AopUtils.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/util/AopUtils.java
deleted file mode 100644
index ba2e194beb721d9144fbadeab980e7804873677b..0000000000000000000000000000000000000000
--- a/dorive-inject/src/main/java/com/gitee/dorive/inject/util/AopUtils.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.gitee.dorive.inject.util;
-
-import java.lang.annotation.Annotation;
-
-public class AopUtils {
-
- public static Class> getAnnotatedClass(Object instance, Class extends Annotation> annotationType) {
- Class> targetClass = org.springframework.aop.support.AopUtils.getTargetClass(instance);
- if (targetClass.isAnnotationPresent(annotationType)) {
- return targetClass;
- } else {
- Class> superClass = targetClass.getSuperclass();
- if (superClass.isAnnotationPresent(annotationType)) {
- return superClass;
- }
- Class>[] interfaceClasses = targetClass.getInterfaces();
- for (Class> interfaceClass : interfaceClasses) {
- if (interfaceClass.isAnnotationPresent(annotationType)) {
- return interfaceClass;
- }
- }
- }
- return targetClass;
- }
-
-}
diff --git a/dorive-inject/src/main/resources/META-INF/spring-configuration-metadata.json b/dorive-inject/src/main/resources/META-INF/spring-configuration-metadata.json
index b4633a7447f4b5e68a2f573064e5e67c0274b380..706e46d3727a04e5772108d68b777b69a4af539e 100644
--- a/dorive-inject/src/main/resources/META-INF/spring-configuration-metadata.json
+++ b/dorive-inject/src/main/resources/META-INF/spring-configuration-metadata.json
@@ -11,9 +11,9 @@
"description": "Global scan path."
},
{
- "name": "dorive.domains",
- "type": "com.gitee.dorive.inject.entity.DomainDefinition",
- "description": "Definition of domain."
+ "name": "dorive.modules",
+ "type": "com.gitee.dorive.inject.entity.ModuleDefinition",
+ "description": "Definition of module."
}
]
}
\ No newline at end of file
diff --git a/dorive-mybatis-plus/pom.xml b/dorive-mybatis-plus/pom.xml
index b9e886ec26d7eb2b9fe8ce146ece2759105f57a1..da60b395a627a75878551f227d87895c91582086 100644
--- a/dorive-mybatis-plus/pom.xml
+++ b/dorive-mybatis-plus/pom.xml
@@ -6,7 +6,7 @@
com.gitee.digital-engine
dorive
- 3.5.0.5
+ 3.5.0.6
dorive-mybatis-plus
diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java
index 7c06e7433295b516cf1e0495560a69e1fc83fe5b..19a920e5262fc9b724cbf7df8707fb5e4239afcf 100644
--- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java
+++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java
@@ -19,6 +19,7 @@ package com.gitee.dorive.mybatis.plus.repository;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
@@ -30,6 +31,7 @@ import com.gitee.dorive.core.api.context.Context;
import com.gitee.dorive.core.api.executor.Executor;
import com.gitee.dorive.core.entity.common.EntityStoreInfo;
import com.gitee.dorive.mybatis.plus.executor.MybatisPlusExecutor;
+import com.gitee.dorive.sql.impl.handler.SqlCustomQueryHandler;
import com.gitee.dorive.query.api.QueryHandler;
import com.gitee.dorive.query.entity.enums.QueryMethod;
import com.gitee.dorive.ref.repository.AbstractRefRepository;
@@ -44,18 +46,21 @@ import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
+import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
@Getter
@Setter
public class MybatisPlusRepository extends AbstractRefRepository implements CountQuerier {
private SqlRunner sqlRunner;
+ private EntityStoreInfo entityStoreInfo;
private CountQuerier countQuerier;
@Override
@@ -89,7 +94,8 @@ public class MybatisPlusRepository extends AbstractRefRepository i
TableInfo tableInfo = TableInfoHelper.getTableInfo(pojoClass);
Assert.notNull(tableInfo, "The table info cannot be null! data source: {}", mapperClass);
assert tableInfo != null;
- return newEntityStoreInfo(mapperClass, mapper, pojoClass, tableInfo);
+ this.entityStoreInfo = newEntityStoreInfo(mapperClass, mapper, pojoClass, tableInfo);
+ return entityStoreInfo;
}
private EntityStoreInfo newEntityStoreInfo(Class> mapperClass, Object mapper, Class> pojoClass, TableInfo tableInfo) {
@@ -115,7 +121,14 @@ public class MybatisPlusRepository extends AbstractRefRepository i
List columns = new ArrayList<>(propAliasMapping.values());
String selectColumns = StrUtil.join(",", columns);
- return new EntityStoreInfo(mapperClass, mapper, pojoClass, tableName, keyProperty, keyColumn, propAliasMappingWithoutPk, propAliasMapping, aliasPropMapping, selectColumns);
+ Map selectMethodMap = new ConcurrentHashMap<>(8);
+ for (Method method : ReflectUtil.getMethodsDirectly(mapperClass, false, false)) {
+ String name = method.getName();
+ if (name.startsWith("select") || name.startsWith("query")) {
+ selectMethodMap.putIfAbsent(name, method);
+ }
+ }
+ return new EntityStoreInfo(mapperClass, mapper, pojoClass, tableName, keyProperty, keyColumn, propAliasMappingWithoutPk, propAliasMapping, aliasPropMapping, selectColumns, selectMethodMap);
}
@Override
@@ -127,8 +140,9 @@ public class MybatisPlusRepository extends AbstractRefRepository i
@Override
protected void registryQueryHandlers(Map queryHandlerMap) {
super.registryQueryHandlers(queryHandlerMap);
- queryHandlerMap.put(QueryMethod.SQL_BUILD, new SqlBuildQueryHandler(this, null));
- queryHandlerMap.put(QueryMethod.SQL_EXECUTE, new SqlExecuteQueryHandler(this, null, sqlRunner));
+ queryHandlerMap.put(QueryMethod.SQL_BUILD, new SqlBuildQueryHandler(this));
+ queryHandlerMap.put(QueryMethod.SQL_EXECUTE, new SqlExecuteQueryHandler(this, sqlRunner));
+ queryHandlerMap.put(QueryMethod.SQL_CUSTOM, new SqlCustomQueryHandler(entityStoreInfo));
}
@Override
diff --git a/dorive-query/pom.xml b/dorive-query/pom.xml
index b9d05910ab702913905664a90d837c9cd9e0f0a0..4c8d4e919cc6cbcec87673720b421ce33e012787 100644
--- a/dorive-query/pom.xml
+++ b/dorive-query/pom.xml
@@ -6,7 +6,7 @@
com.gitee.digital-engine
dorive
- 3.5.0.5
+ 3.5.0.6
dorive-query
diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentUnit.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryConfig.java
similarity index 44%
rename from dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentUnit.java
rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryConfig.java
index 549975d834ea5ee4b97c9abde102bc6bdf5f0adc..29aa2276bba92bd2dcc417f0bc3f977b4d31f0b5 100644
--- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentUnit.java
+++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryConfig.java
@@ -15,21 +15,36 @@
* limitations under the License.
*/
-package com.gitee.dorive.sql.entity.common;
+package com.gitee.dorive.query.entity;
-import com.gitee.dorive.query.entity.QueryUnit;
-import com.gitee.dorive.sql.entity.segment.TableSegment;
-import lombok.Getter;
-import lombok.Setter;
+import com.gitee.dorive.api.entity.core.EntityElement;
+import com.gitee.dorive.query.impl.resolver.QueryExampleResolver;
+import com.gitee.dorive.query.repository.AbstractQueryRepository;
+import lombok.Data;
-@Getter
-@Setter
-public class SegmentUnit extends QueryUnit {
+import java.util.List;
- private TableSegment tableSegment;
+@Data
+public class QueryConfig {
+ private AbstractQueryRepository, ?> repository;
+ private QueryExampleResolver queryExampleResolver;
+ private List mergedRepositories;
+ private List reversedMergedRepositories;
- public String getTableAlias() {
- return tableSegment.getTableAlias();
+ public EntityElement getEntityElement() {
+ return repository.getEntityElement();
}
+ public String getPrimaryKey() {
+ return getEntityElement().getPrimaryKey();
+ }
+
+ public String getPrimaryKeyAlias() {
+ EntityElement entityElement = getEntityElement();
+ return entityElement.toAlias(entityElement.getPrimaryKey());
+ }
+
+ public String getMethod() {
+ return queryExampleResolver.getQueryDefinition().getQueryDef().getMethod();
+ }
}
diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java
index 8e83efd2b4d4d6e4c9f64a5a6d0c63b54969b749..a19b3c361b0f23c6d6974fdd1c048f8264e1284b 100644
--- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java
+++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java
@@ -18,11 +18,9 @@
package com.gitee.dorive.query.entity;
import com.gitee.dorive.core.api.context.Context;
-import com.gitee.dorive.core.entity.context.AbstractProxyContext;
import com.gitee.dorive.core.entity.executor.Example;
import com.gitee.dorive.core.entity.executor.Result;
import com.gitee.dorive.query.entity.enums.ResultType;
-import com.gitee.dorive.query.impl.resolver.QueryExampleResolver;
import lombok.Getter;
import lombok.Setter;
@@ -32,16 +30,20 @@ import java.util.Map;
@Getter
@Setter
-public class QueryContext extends AbstractProxyContext {
+public class QueryContext {
+ private Context context;
private Class> queryType;
private ResultType resultType;
private boolean abandoned;
- private QueryExampleResolver queryExampleResolver;
+ private QueryConfig queryConfig;
+ private String primaryKey;
+ private String primaryKeyAlias;
+ private String method;
+
private Map exampleMap;
private Example example;
- private List mergedRepositories;
private Map queryUnitMap;
private QueryUnit queryUnit;
@@ -49,7 +51,7 @@ public class QueryContext extends AbstractProxyContext {
private Result