package cn.noexception.container.context.annotation; import cn.hutool.core.util.StrUtil; import cn.noexception.container.factory.config.BeanDefinition; import cn.noexception.container.factory.stereotype.Cube; import cn.noexception.container.factory.support.BeanDefinitionRegistry; import java.util.Set; /** * ClassPathBeanDefinitionScanner * * 扫描包处理 * * @author 吕滔 * @Date 2021/11/8 17:21 */ public class ClassPathBeanDefinitionScanner extends ClassPathScanningCandidateComponentProvider { private BeanDefinitionRegistry registry; public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry) { this.registry = registry; } public void doScan(String... basePackages) { for (String basePackage : basePackages) { Set candidates = findCandidateComponents(basePackage); for (BeanDefinition beanDefinition : candidates) { // 解析 Bean 的作用域 singleton、prototype String beanScope = resolveBeanScope(beanDefinition); if (StrUtil.isNotEmpty(beanScope)) { beanDefinition.setScope(beanScope); } registry.registerBeanDefinition(determineBeanName(beanDefinition), beanDefinition); } } } private String determineBeanName(BeanDefinition beanDefinition) { Class beanClass = beanDefinition.getBeanClass(); Cube cube = beanClass.getAnnotation(Cube.class); String value = cube.value(); if (StrUtil.isEmpty(value)) { value = StrUtil.lowerFirst(beanClass.getSimpleName()); } return value; } private String resolveBeanScope(BeanDefinition beanDefinition) { Class beanClass = beanDefinition.getBeanClass(); Scope scope = beanClass.getAnnotation(Scope.class); if (null != scope) return scope.value(); return StrUtil.EMPTY; } }