Skip to content

linsir-core 封装架构设计方案

一、设计目标

基于 Spring Framework 的 spring-core 模块,设计 linsir-core 的封装架构,实现以下目标:

  1. 简化使用 - 提供更简洁的 API 接口,降低学习成本
  2. 隔离依赖 - 业务层不直接依赖 Spring 接口,便于未来替换或升级
  3. 增强功能 - 在 Spring 基础上增加实用功能
  4. 统一规范 - 建立团队内部的开发规范

二、Spring Core 核心能力分析

2.1 核心包结构

org.springframework.core
├── annotation/          # 注解处理工具
├── codec/              # 编码解码抽象
├── convert/            # 类型转换系统
├── env/                # 环境抽象(Profile、PropertySource)
├── io/                 # 资源加载(Resource、ResourceLoader)
├── task/               # 任务执行抽象
└── util/               # 通用工具类

2.2 核心能力矩阵

能力核心类用途
类型系统ResolvableType泛型解析、类型推断
资源加载ResourceLoader统一资源访问(文件、URL、classpath)
类型转换ConversionService类型转换(String → Integer 等)
工具类ClassUtils, ReflectionUtils反射、类操作工具
断言工具Assert参数校验
环境抽象Environment配置管理、Profile 切换

三、封装架构设计

3.1 整体架构

┌─────────────────────────────────────────────────────────────┐
│                      API 层 (Public)                         │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────┐  │
│  │   Types     │  │  Resources  │  │      Utils          │  │
│  │  类型系统    │  │  资源加载    │  │    工具类            │  │
│  └─────────────┘  └─────────────┘  └─────────────────────┘  │
├─────────────────────────────────────────────────────────────┤
│                      SPI 层 (Extension)                      │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────┐  │
│  │TypeConverter│  │ResourceLoader│  │   Environment      │  │
│  │ 类型转换器   │  │  资源加载器   │  │    环境抽象          │  │
│  └─────────────┘  └─────────────┘  └─────────────────────┘  │
├─────────────────────────────────────────────────────────────┤
│                   Internal 层 (Implementation)               │
│              Spring Core 原生实现包装                         │
└─────────────────────────────────────────────────────────────┘

3.2 包结构设计

com.linsir.core
├── api/                    # API 层 - 对外暴露的接口
│   ├── types/             # 类型系统 API
│   ├── resource/          # 资源加载 API
│   └── util/              # 工具类 API
├── spi/                   # SPI 层 - 扩展点接口
│   ├── converter/         # 类型转换 SPI
│   ├── resource/          # 资源加载 SPI
│   └── env/               # 环境抽象 SPI
├── internal/              # 内部实现层
│   ├── spring/            # Spring 实现包装
│   └── util/              # 内部工具
└── support/               # 支持类
    └── util/              # 工具类支持

四、核心组件设计

4.1 类型系统封装 (Types)

设计思路

ResolvableType 进行封装,提供更友好的 API。

接口定义

java
/**
 * 类型解析器 - API 层
 */
public interface TypeResolver {
    
    /**
     * 解析类的泛型参数
     */
    <T> Class<T> resolveGeneric(Class<?> targetClass, Class<?> genericBase, int index);
    
    /**
     * 获取类的所有泛型参数
     */
    Class<?>[] resolveGenerics(Class<?> targetClass, Class<?> genericBase);
    
    /**
     * 检查类型是否匹配
     */
    boolean isAssignable(Class<?> source, Class<?> target);
    
    /**
     * 获取数组元素类型
     */
    Class<?> getComponentType(Class<?> arrayType);
}

使用示例

java
// 原始 Spring API
ResolvableType type = ResolvableType.forClass(UserService.class);
ResolvableType generic = type.as(BaseService.class).getGeneric(0);
Class<?> userClass = generic.resolve();

// 封装后的 API
Class<?> userClass = typeResolver.resolveGeneric(
    UserService.class, 
    BaseService.class, 
    0
);

4.2 资源加载封装 (Resources)

设计思路

ResourceLoader 进行封装,统一资源访问方式。

接口定义

java
/**
 * 资源加载器 - API 层
 */
public interface ResourceLoader {
    
    /**
     * 加载资源
     * @param location 资源路径(支持 classpath:, file:, http: 等前缀)
     */
    Resource load(String location);
    
    /**
     * 加载多个资源(支持通配符)
     */
    Resource[] loadAll(String locationPattern);
    
    /**
     * 检查资源是否存在
     */
    boolean exists(String location);
}

/**
 * 资源抽象
 */
public interface Resource {
    
    /**
     * 获取输入流
     */
    InputStream getInputStream() throws IOException;
    
    /**
     * 获取资源内容(文本)
     */
    String getContentAsString() throws IOException;
    
    /**
     * 获取文件
     */
    File getFile() throws IOException;
    
    /**
     * 获取资源名称
     */
    String getName();
    
    /**
     * 检查资源是否存在
     */
    boolean exists();
}

使用示例

java
// 加载配置文件
Resource resource = resourceLoader.load("classpath:application.properties");
String content = resource.getContentAsString();

// 加载多个资源
Resource[] resources = resourceLoader.loadAll("classpath*:mapper/*.xml");

4.3 工具类封装 (Utils)

设计思路

对 Spring 的 ClassUtils, ReflectionUtils, Assert 等进行封装。

接口定义

java
/**
 * 类工具 - API 层
 */
public final class Classes {
    
    private Classes() {}
    
    /**
     * 获取默认类加载器
     */
    public static ClassLoader getDefaultClassLoader();
    
    /**
     * 加载类
     */
    public static Class<?> forName(String className);
    
    /**
     * 获取所有接口
     */
    public static List<Class<?>> getAllInterfaces(Class<?> clazz);
    
    /**
     * 判断是否为简单值类型
     */
    public static boolean isSimpleValueType(Class<?> clazz);
}

/**
 * 反射工具 - API 层
 */
public final class Reflections {
    
    private Reflections() {}
    
    /**
     * 获取字段值
     */
    public static Object getFieldValue(Object target, String fieldName);
    
    /**
     * 设置字段值
     */
    public static void setFieldValue(Object target, String fieldName, Object value);
    
    /**
     * 调用方法
     */
    public static Object invokeMethod(Object target, String methodName, Object... args);
    
    /**
     * 查找方法
     */
    public static Method findMethod(Class<?> clazz, String methodName, Class<?>... paramTypes);
}

/**
 * 断言工具 - API 层
 */
public final class Asserts {
    
    private Asserts() {}
    
    /**
     * 断言对象不为 null
     */
    public static void notNull(Object object, String message);
    
    /**
     * 断言字符串不为空
     */
    public static void hasText(String text, String message);
    
    /**
     * 断言条件为 true
     */
    public static void isTrue(boolean condition, String message);
    
    /**
     * 断言集合不为空
     */
    public static void notEmpty(Collection<?> collection, String message);
}

使用示例

java
// 类操作
Class<?> clazz = Classes.forName("com.example.UserService");
List<Class<?>> interfaces = Classes.getAllInterfaces(clazz);

// 反射操作
Object value = Reflections.getFieldValue(user, "name");
Reflections.setFieldValue(user, "age", 25);

// 断言
Asserts.notNull(user, "User must not be null");
Asserts.hasText(username, "Username must not be empty");

五、实现方案

5.1 实现类设计

java
/**
 * TypeResolver 实现
 */
public class DefaultTypeResolver implements TypeResolver {
    
    @Override
    public <T> Class<T> resolveGeneric(Class<?> targetClass, Class<?> genericBase, int index) {
        ResolvableType type = ResolvableType.forClass(targetClass);
        ResolvableType generic = type.as(genericBase).getGeneric(index);
        return (Class<T>) generic.resolve();
    }
    
    // ... 其他方法实现
}

/**
 * ResourceLoader 实现
 */
public class DefaultResourceLoader implements ResourceLoader {
    
    private final org.springframework.core.io.ResourceLoader delegate;
    
    public DefaultResourceLoader() {
        this.delegate = new PathMatchingResourcePatternResolver();
    }
    
    @Override
    public Resource load(String location) {
        org.springframework.core.io.Resource resource = delegate.getResource(location);
        return new SpringResourceAdapter(resource);
    }
    
    // ... 其他方法实现
}

/**
 * Resource 适配器
 */
public class SpringResourceAdapter implements Resource {
    
    private final org.springframework.core.io.Resource delegate;
    
    public SpringResourceAdapter(org.springframework.core.io.Resource delegate) {
        this.delegate = delegate;
    }
    
    @Override
    public InputStream getInputStream() throws IOException {
        return delegate.getInputStream();
    }
    
    @Override
    public String getContentAsString() throws IOException {
        try (Reader reader = new InputStreamReader(getInputStream())) {
            return FileCopyUtils.copyToString(reader);
        }
    }
    
    // ... 其他方法实现
}

5.2 工厂类设计

java
/**
 * Core 模块入口
 */
public final class LinsirCore {
    
    private static final TypeResolver typeResolver = new DefaultTypeResolver();
    private static final ResourceLoader resourceLoader = new DefaultResourceLoader();
    
    private LinsirCore() {}
    
    /**
     * 获取类型解析器
     */
    public static TypeResolver types() {
        return typeResolver;
    }
    
    /**
     * 获取资源加载器
     */
    public static ResourceLoader resources() {
        return resourceLoader;
    }
}

使用示例

java
// 类型解析
Class<?> genericType = LinsirCore.types()
    .resolveGeneric(UserService.class, BaseService.class, 0);

// 资源加载
Resource resource = LinsirCore.resources().load("classpath:config.properties");
String content = resource.getContentAsString();

六、扩展机制

6.1 SPI 扩展点

java
/**
 * 类型转换器 SPI
 */
public interface TypeConverter<S, T> {
    
    /**
     * 获取源类型
     */
    Class<S> getSourceType();
    
    /**
     * 获取目标类型
     */
    Class<T> getTargetType();
    
    /**
     * 执行转换
     */
    T convert(S source);
}

/**
 * 资源加载器 SPI
 */
public interface ResourceLoaderStrategy {
    
    /**
     * 是否支持该协议
     */
    boolean supports(String protocol);
    
    /**
     * 加载资源
     */
    Resource load(String location);
}

6.2 扩展注册

java
/**
 * 扩展注册器
 */
public interface ExtensionRegistry {
    
    /**
     * 注册类型转换器
     */
    <S, T> void registerConverter(TypeConverter<S, T> converter);
    
    /**
     * 注册资源加载策略
     */
    void registerResourceLoader(ResourceLoaderStrategy strategy);
}

七、与 Spring 的关系

7.1 依赖关系

linsir-core
    ├── spring-core (compile)      # 核心依赖
    ├── spring-jcl (compile)       # 日志抽象
    └── spring-util (optional)     # 可选工具

7.2 版本兼容

linsir-core 版本Spring Framework 版本JDK 版本
1.0.x6.1.x17+
1.1.x6.2.x17+

八、下一步工作

  1. 接口细化 - 完善各 API 接口的定义
  2. 实现开发 - 开发具体的实现类
  3. 单元测试 - 编写全面的单元测试
  4. 文档完善 - 编写详细的使用文档
  5. 性能优化 - 针对高频操作进行性能优化

基于 Apache 2.0 许可发布