diff --git a/flyfish-common/src/main/java/com/flyfish/framework/utils/Builder.java b/flyfish-common/src/main/java/com/flyfish/framework/utils/Builder.java new file mode 100644 index 0000000..17ba447 --- /dev/null +++ b/flyfish-common/src/main/java/com/flyfish/framework/utils/Builder.java @@ -0,0 +1,15 @@ +package com.flyfish.framework.utils; + +/** + * 构建器表示 + */ +@FunctionalInterface +public interface Builder { + + /** + * 构建对象 + * + * @return 构建结果 + */ + T build(); +} diff --git a/flyfish-web/src/main/java/com/flyfish/framework/beans/repository/CustomRepositoryBuilder.java b/flyfish-web/src/main/java/com/flyfish/framework/beans/repository/CustomRepositoryBuilder.java index 915c24d..f3759f3 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/beans/repository/CustomRepositoryBuilder.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/beans/repository/CustomRepositoryBuilder.java @@ -1,11 +1,5 @@ package com.flyfish.framework.beans.repository; -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.Stream; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.support.AbstractBeanDefinition; @@ -22,6 +16,10 @@ import org.springframework.data.repository.core.support.RepositoryFragmentsFacto import org.springframework.data.util.Optionals; import org.springframework.util.Assert; +import java.util.Collections; +import java.util.Optional; +import java.util.stream.Stream; + /** * Builder to create {@link BeanDefinitionBuilder} instance to eventually create Spring Data repository instances. * @@ -30,7 +28,7 @@ import org.springframework.util.Assert; * @author Peter Rietzler * @author Mark Paluch */ -public class CustomRepositoryBuilder { +class CustomRepositoryBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(CustomRepositoryBuilder.class); @@ -46,15 +44,13 @@ public class CustomRepositoryBuilder { * Creates a new {@link CustomRepositoryBuilder} from the given {@link BeanDefinitionRegistry}, * {@link RepositoryConfigurationExtension} and {@link ResourceLoader}. * - * @param registry must not be {@literal null}. - * @param extension must not be {@literal null}. + * @param registry must not be {@literal null}. * @param resourceLoader must not be {@literal null}. - * @param environment must not be {@literal null}. + * @param environment must not be {@literal null}. */ - public CustomRepositoryBuilder(BeanDefinitionRegistry registry, RepositoryConfigurationExtension extension, - RepositoryConfigurationSource configurationSource, ResourceLoader resourceLoader, Environment environment) { + CustomRepositoryBuilder(BeanDefinitionRegistry registry, RepositoryConfigurationExtension extension, RepositoryConfigurationSource configurationSource, + ResourceLoader resourceLoader, Environment environment) { - Assert.notNull(extension, "RepositoryConfigurationExtension must not be null!"); Assert.notNull(resourceLoader, "ResourceLoader must not be null!"); Assert.notNull(environment, "Environment must not be null!"); diff --git a/flyfish-web/src/main/java/com/flyfish/framework/beans/repository/RepositoryRegistrar.java b/flyfish-web/src/main/java/com/flyfish/framework/beans/repository/RepositoryRegistrar.java new file mode 100644 index 0000000..10aaed6 --- /dev/null +++ b/flyfish-web/src/main/java/com/flyfish/framework/beans/repository/RepositoryRegistrar.java @@ -0,0 +1,44 @@ +package com.flyfish.framework.beans.repository; + +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.support.BeanNameGenerator; +import org.springframework.core.env.Environment; +import org.springframework.core.io.ResourceLoader; +import org.springframework.core.type.AnnotationMetadata; + +/** + * 仓库注册器 + * + * @author wangyu + */ +public interface RepositoryRegistrar { + + /** + * 初始化注册器,不初始化无法使用 + * + * @param metadata 元数据 + * @param resourceLoader 资源加载器 + * @param environment 环境变量 + * @param registry bean注册器 + * @param generator 生成器 + * @return 结果 + */ + RepositoryRegistrar init(AnnotationMetadata metadata, ResourceLoader resourceLoader, Environment environment, + BeanDefinitionRegistry registry, BeanNameGenerator generator); + + /** + * 根据class直接注册bean + * + * @param clazz 编译后的class + */ + void register(Class clazz); + + /** + * 创建新的注册器 + * + * @return 注册器 + */ + static RepositoryRegistrar newInstance(AnnotationMetadata metadata) { + return new RepositoryRegistrarComposite(metadata); + } +} diff --git a/flyfish-web/src/main/java/com/flyfish/framework/beans/repository/RepositoryRegistrarComposite.java b/flyfish-web/src/main/java/com/flyfish/framework/beans/repository/RepositoryRegistrarComposite.java new file mode 100644 index 0000000..2ed7a31 --- /dev/null +++ b/flyfish-web/src/main/java/com/flyfish/framework/beans/repository/RepositoryRegistrarComposite.java @@ -0,0 +1,51 @@ +package com.flyfish.framework.beans.repository; + +import com.flyfish.framework.repository.DefaultReactiveRepository; +import com.flyfish.framework.repository.DefaultRepository; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.support.BeanNameGenerator; +import org.springframework.core.env.Environment; +import org.springframework.core.io.ResourceLoader; +import org.springframework.core.type.AnnotationMetadata; +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; +import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories; +import org.springframework.data.mongodb.repository.config.MongoRepositoryConfigurationExtension; +import org.springframework.data.mongodb.repository.config.ReactiveMongoRepositoryConfigurationExtension; + +import java.util.ArrayList; +import java.util.List; + +/** + * 注册器组合对象 + * + * @author wangyu + */ +class RepositoryRegistrarComposite implements RepositoryRegistrar { + + private final List registrars; + + RepositoryRegistrarComposite(AnnotationMetadata metadata) { + List list = new ArrayList<>(); + if (metadata.hasMetaAnnotation(EnableMongoRepositories.class.getName())) { + list.add(new SimpleRepositoryRegistrar(EnableMongoRepositories.class, new MongoRepositoryConfigurationExtension(), + DefaultRepository.class)); + } + if (metadata.hasMetaAnnotation(EnableReactiveMongoRepositories.class.getName())) { + list.add(new SimpleRepositoryRegistrar(EnableReactiveMongoRepositories.class, new ReactiveMongoRepositoryConfigurationExtension(), + DefaultReactiveRepository.class)); + } + this.registrars = list; + } + + @Override + public RepositoryRegistrar init(AnnotationMetadata metadata, ResourceLoader resourceLoader, Environment environment, + BeanDefinitionRegistry registry, BeanNameGenerator generator) { + registrars.forEach(registrar -> registrar.init(metadata, resourceLoader, environment, registry, generator)); + return this; + } + + @Override + public void register(Class clazz) { + registrars.forEach(registrar -> registrar.register(clazz)); + } +} diff --git a/flyfish-web/src/main/java/com/flyfish/framework/beans/repository/CustomRepositoryRegistrar.java b/flyfish-web/src/main/java/com/flyfish/framework/beans/repository/SimpleRepositoryRegistrar.java similarity index 51% rename from flyfish-web/src/main/java/com/flyfish/framework/beans/repository/CustomRepositoryRegistrar.java rename to flyfish-web/src/main/java/com/flyfish/framework/beans/repository/SimpleRepositoryRegistrar.java index 4ca52e0..c7b33d7 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/beans/repository/CustomRepositoryRegistrar.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/beans/repository/SimpleRepositoryRegistrar.java @@ -1,7 +1,5 @@ package com.flyfish.framework.beans.repository; -import com.flyfish.framework.repository.DefaultReactiveRepository; -import com.flyfish.framework.repository.DefaultRepository; import org.apache.commons.lang3.ClassUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.FactoryBean; @@ -13,54 +11,65 @@ import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.core.env.Environment; import org.springframework.core.io.ResourceLoader; import org.springframework.core.type.AnnotationMetadata; -import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; -import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories; -import org.springframework.data.mongodb.repository.config.MongoRepositoryConfigurationExtension; -import org.springframework.data.mongodb.repository.config.ReactiveMongoRepositoryConfigurationExtension; import org.springframework.data.repository.config.*; +import java.lang.annotation.Annotation; +import java.util.Arrays; +import java.util.List; + /** - * 自定义的仓库注册器 + * 简单的仓库注册器 * * @author wangyu + * 封装大部分逻辑 */ -public class CustomRepositoryRegistrar { +class SimpleRepositoryRegistrar implements RepositoryRegistrar { - // repo生成的extension - private final RepositoryConfigurationExtension extension = new MongoRepositoryConfigurationExtension(); - private final RepositoryConfigurationSource configurationSource; - private final CustomRepositoryBuilder builder; - // 异步的extension - private final RepositoryConfigurationExtension reactiveExtension = new ReactiveMongoRepositoryConfigurationExtension(); - private final RepositoryConfigurationSource reactiveConfigurationSource; - private final CustomRepositoryBuilder reactiveBuilder; + private final RepositoryConfigurationExtension extension; + private RepositoryConfigurationSource configurationSource; + private CustomRepositoryBuilder builder; + // 支持的注解类型 + private final Class annotationType; + // 支持的仓库类型 + private final List> supportedTypes; - public CustomRepositoryRegistrar(AnnotationMetadata metadata, ResourceLoader resourceLoader, Environment environment, - BeanDefinitionRegistry registry, BeanNameGenerator generator) { - // repo生成的构建器 - this.configurationSource = new AnnotationRepositoryConfigurationSource(metadata, - EnableMongoRepositories.class, resourceLoader, environment, registry, generator); - // 异步的repo生成的构建器 - this.reactiveConfigurationSource = new AnnotationRepositoryConfigurationSource(metadata, - EnableReactiveMongoRepositories.class, resourceLoader, environment, registry, generator); - // 构建器 - this.builder = new CustomRepositoryBuilder(registry, extension, - configurationSource, resourceLoader, environment); - // 异步的构造器 - this.reactiveBuilder = new CustomRepositoryBuilder(registry, reactiveExtension, reactiveConfigurationSource, - resourceLoader, environment); + SimpleRepositoryRegistrar(Class annotationType, RepositoryConfigurationExtension extension, + Class... supportedTypes) { + this.annotationType = annotationType; + this.extension = extension; + this.supportedTypes = Arrays.asList(supportedTypes); } /** - * 根据class直接注册bean + * 初始化注册器,不初始化无法使用 * + * @param metadata 元数据 + * @param resourceLoader 资源加载器 + * @param environment 环境变量 + * @param registry bean注册器 + * @param generator 生成器 + * @return 结果 + */ + @Override + public RepositoryRegistrar init( + AnnotationMetadata metadata, ResourceLoader resourceLoader, Environment environment, + BeanDefinitionRegistry registry, BeanNameGenerator generator) { + // repo生成的构建器 + this.configurationSource = new AnnotationRepositoryConfigurationSource(metadata, + annotationType, resourceLoader, environment, registry, generator); + // 构建器 + this.builder = new CustomRepositoryBuilder(registry, extension, + configurationSource, resourceLoader, environment); + return this; + } + + /** * @param clazz 编译后的class */ + @Override public void register(Class clazz) { - if (ClassUtils.isAssignable(clazz, DefaultRepository.class)) { - register(clazz, configurationSource, extension, builder); - } else if (ClassUtils.isAssignable(clazz, DefaultReactiveRepository.class)) { - register(clazz, reactiveConfigurationSource, reactiveExtension, reactiveBuilder); + if (supportedTypes.stream().anyMatch(type -> ClassUtils.isAssignable(clazz, type))) { + register(clazz, configurationSource, builder); } } @@ -69,10 +78,10 @@ public class CustomRepositoryRegistrar { * * @param clazz 类型 * @param configurationSource 配置源 - * @param extension 扩展 * @param builder 构建器 */ - private void register(Class clazz, RepositoryConfigurationSource configurationSource, RepositoryConfigurationExtension extension, CustomRepositoryBuilder builder) { + private void register(Class clazz, RepositoryConfigurationSource configurationSource, + CustomRepositoryBuilder builder) { //生成BeanDefinition并注册到容器中 BeanDefinition origin = BeanDefinitionBuilder.genericBeanDefinition(clazz).getRawBeanDefinition(); //设置当前bean定义对象是单例的 @@ -89,9 +98,4 @@ public class CustomRepositoryRegistrar { beanDefinition.setAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE, configuration.getRepositoryInterface()); builder.getRegistry().registerBeanDefinition(beanName, beanDefinition); } - - - public RepositoryConfigurationExtension getExtension() { - return extension; - } } diff --git a/flyfish-web/src/main/java/com/flyfish/framework/config/RestBeanAutoConfigure.java b/flyfish-web/src/main/java/com/flyfish/framework/config/RestBeanAutoConfigure.java index 1d98478..db90e5a 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/config/RestBeanAutoConfigure.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/config/RestBeanAutoConfigure.java @@ -3,7 +3,7 @@ package com.flyfish.framework.config; import com.flyfish.framework.beans.annotations.EnableRestBeanDetect; import com.flyfish.framework.beans.enums.RestBeanCandidate; import com.flyfish.framework.beans.meta.RestBean; -import com.flyfish.framework.beans.repository.CustomRepositoryRegistrar; +import com.flyfish.framework.beans.repository.RepositoryRegistrar; import com.flyfish.framework.beans.resolver.DynamicRestBeanResolver; import com.flyfish.framework.compiler.DynamicJavaCompiler; import com.flyfish.framework.compiler.support.JavaSource; @@ -81,8 +81,8 @@ public class RestBeanAutoConfigure implements ImportBeanDefinitionRegistrar, Res // 扫描包路径,检测RestBean注解的bean Reflections reflections = new Reflections(basePackages); // repo注册器 - CustomRepositoryRegistrar repositoryRegistrar = new CustomRepositoryRegistrar(metadata, resourceLoader, - environment, registry, beanNameGenerator); + RepositoryRegistrar repositoryRegistrar = RepositoryRegistrar.newInstance(metadata) + .init(metadata, resourceLoader, environment, registry, beanNameGenerator); // 准备注册的repo Map>> loadedClasses = new ConcurrentHashMap<>(); // 获取被注解的类,开始编译 diff --git a/flyfish-web/src/main/java/com/flyfish/framework/configuration/boot/FlyfishApplication.java b/flyfish-web/src/main/java/com/flyfish/framework/configuration/boot/FlyfishApplication.java index 9451c49..d355b94 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/configuration/boot/FlyfishApplication.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/configuration/boot/FlyfishApplication.java @@ -1,6 +1,5 @@ package com.flyfish.framework.configuration.boot; -import com.flyfish.framework.annotations.EnableMongoRepo; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.core.annotation.AliasFor; @@ -18,23 +17,11 @@ import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited -@EnableMongoRepo @SpringBootApplication @EnableAsync(proxyTargetClass = true) @EnableAspectJAutoProxy public @interface FlyfishApplication { - /** - * repo扫描的基础包 - * - * @return 结果 - */ - @AliasFor( - annotation = EnableMongoRepo.class, - attribute = "basePackages" - ) - String[] repositoryBasePackages() default {}; - /** * 扫描组件的路径 *