
com.nntk.restplus.config.RestPlusRegistrar Maven / Gradle / Ivy
package com.nntk.restplus.config;
import com.nntk.restplus.annotation.RestPlus;
import com.nntk.restplus.aop.RestPlusAopProxyFactory;
import com.nntk.restplus.util.ResourceUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
public class RestPlusRegistrar implements ImportBeanDefinitionRegistrar,
ResourceLoaderAware, EnvironmentAware {
private static final Logger log = LoggerFactory.getLogger(RestPlusRegistrar.class);
/**
* 资源加载器
*/
private ResourceLoader resourceLoader;
/**
* 环境
*/
private Environment environment;
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
// 创建scanner
ClassPathScanningCandidateComponentProvider scanner = getScanner();
scanner.setResourceLoader(resourceLoader);
// 设置扫描器scanner扫描的过滤条件
AnnotationTypeFilter annotationTypeFilter = new AnnotationTypeFilter(RestPlus.class);
scanner.addIncludeFilter(annotationTypeFilter);
// 获取指定要扫描的basePackages
Set basePackages = getBasePackages(metadata);
// 遍历每一个basePackages
for (String basePackage : basePackages) {
Set extends Class>> scanPackage = scanner.findCandidateComponents(basePackage)
.stream().map(BeanDefinition::getBeanClassName)
.map(e -> {
try {
return Class.forName(e);
} catch (ClassNotFoundException aE) {
throw new RuntimeException(aE);
}
}).collect(Collectors.toSet());
for (Class> cls : scanPackage) {
log.info("register:{}", cls);
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(cls);
GenericBeanDefinition definition = (GenericBeanDefinition) builder.getRawBeanDefinition();
definition.getPropertyValues().add("interfaceClass", definition.getBeanClassName());
definition.setBeanClass(RestPlusAopProxyFactory.class);
definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE);
String beanName = cls.getSimpleName() + "RestPlusClient";
registry.registerBeanDefinition(beanName, definition);
}
}
printLogo();
}
private void printLogo() {
String logo = ResourceUtil.readStr("restplus.txt");
System.out.println(logo);
System.out.println(getColoredString(32, 2, "(v1.0.0)"));
}
public static String getColoredString(int color, int fontType, String content) {
return String.format("\033[%d;%dm%s\033[0m", color, fontType, content);
}
/**
* 创建扫描器
*/
protected ClassPathScanningCandidateComponentProvider getScanner() {
return new ClassPathScanningCandidateComponentProvider(false, environment) {
@Override
protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
boolean isCandidate = false;
if (beanDefinition.getMetadata().isIndependent()) {
if (!beanDefinition.getMetadata().isAnnotation()) {
isCandidate = true;
}
}
return isCandidate;
}
};
}
/**
* 获取base packages
*/
protected static Set getBasePackages(AnnotationMetadata importingClassMetadata) {
// 获取到@EnableSimpleRpcClients注解所有属性
Map attributes = importingClassMetadata.getAnnotationAttributes(EnableRestPlus.class.getCanonicalName());
Set basePackages = new HashSet<>();
assert attributes != null;
// value 属性是否有配置值,如果有则添加
for (String pkg : (String[]) attributes.get("value")) {
if (StringUtils.hasText(pkg)) {
basePackages.add(pkg);
}
}
// basePackages 属性是否有配置值,如果有则添加
for (String pkg : (String[]) attributes.get("basePackages")) {
if (StringUtils.hasText(pkg)) {
basePackages.add(pkg);
}
}
// 如果上面两步都没有获取到basePackages,那么这里就默认使用当前项目启动类所在的包为basePackages
if (basePackages.isEmpty()) {
basePackages.add(ClassUtils.getPackageName(importingClassMetadata.getClassName()));
}
return basePackages;
}
/**
* 获取name
*/
protected static String getName(Map attributes) {
String name = (String) attributes.get("name");
if (!StringUtils.hasText(name)) {
name = (String) attributes.get("value");
}
return name;
}
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy