# candy **Repository Path**: zongyingfeng/candy ## Basic Information - **Project Name**: candy - **Description**: 简易复刻Spring,学习和开发都是一种收获! - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 0 - **Created**: 2021-03-10 - **Last Updated**: 2021-04-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # candy ## 介绍 ## 简易复刻Spring,学习和开发都是一种收获! ## 路线规划 ## - 1.0.0.RELEASE:实现IOC相关功能; - 2.0.0.RELEASE:实现AOP相关功能; ## IOC ## IOC:**I**nversion **O**f **C**ontrol,即控制反转。控制:对对象的控制权;反转:控制权不再由属于对象使用方,而是交给一个叫IOC容器的东西。 ### 容器 ### 顾名思义,和现实中的容器是一个意思,即用来装东西的,只不过IOC容器装的都是对象。 既然是装对象的,那么我一定可以往里面放(**注册**)对象,也可以从里面取(**注入**)对象。 另外,除了装对象,上文还说了,对象的控制权也在容器手中,因此,容器还应该负责管理对象创建和销毁,即对象的整个生命周期。 所以,容器应该具备以下基本功能: - 对象的注册和注入; - 对象的生命周期管理; ### 生命周期 ### 那么生命周期指的又是什么呢?百度说: >生命周期就是指一个对象的生老病死。 也就是对象从创建到被垃圾回收的整个过程,不难发现,对象的生命周期至少有以下几个阶段: 1. **创建**,即**new**阶段; 2. **初始化**,即为对象的各属性属性赋值的阶段; 3. **服务**,即对象对外提供服务的阶段; 4. **销毁**,即已没有人再需要该对象了,需要被销毁,从此刻到真正被回收的阶段。 同样的,容器也有生命周期,不难发现,容器的生命周期至少有以下几个阶段: 1. **创建**,即新建一个空容器的阶段; 2. **准备**,为后续初始化容器内对象做准备的阶段; 3. **初始化**,初始化容器内的对象的阶段; 4. **服务**,即对象对外提供服务的阶段; 5. **销毁**,已经不需要容器了(大部分时候是应用要停了),需要销毁容器以及容器内的对象,从此刻到完全销毁的阶段。 所以,容器还应该具备以下功能: - 容器自身的生命周期管理; ### 环境 ### 为什么容器的生命周期多了个**准备**阶段?因为对象的初始化可能依赖外部环境,比如数据库连接池的初始化依赖具体的数据库链接配置。 这个阶段就是专门为对象的初始化做准备的,说具体点,就是在准备环境。 所以环境是什么?环境就是容器内对象初始化时需要的一切信息;再往大了说点,环境就是程序运行时所需要的除代码以外的一切信息。 所以,容器还应该具备以下功能: - 环境管理; 程序运行所需要的信息,可以从很多地方获取,如:命令行(就是main方法的参数)、配置文件、环境变量等,那么当某一个信息在多个地方都找到了,以谁为准? 原则就是:谁离程序运行的时机越近越优先,因为越到最后确定的信息越准确,同时也能让我们能在程序运行之前改变程序的行为。 ### 模块划分 ### 1. 容器的实现(**龚静**) 1. 对象生命周期介入(**程晓玲**) 1. 上下文支持 (**田宇**) 1. 容器生命周期介入(**穆成宇**) ### 详细设计 ### #### 容器的实现 #### - 通过@Component实现bean的注入(其他:通过配置类中@Bean进行注入,调用方法context.regist注入); - 扫描指定路径下的文件和jar包; - 通过属性上添加@Autowired注解实现bean注入;(其他:在构造函数、set方法上加上@Autowired注解进行注入) - 根据名字自动注入bean(其他:根据类型注入) - 只支持单例; - 暂不实现懒加载: #### 上下文支持 #### Environment profile和propereties 代码以外的内容,简单来说就是Map 定义接口:获取属性的值(指定返回类型,返回自定义类),不提供修改,是否包含属性 Converter - Converter - Converters - ConversionService (扩展实现:自动转化为list,map,或绑定到类上) PropertySource - commandLineSource (数组) 命令数组解析,指定格式 - propertiesFile格式:以candy开头 - JVM system properties - System environment variable Environment:实现标准上下文环境 (扩展实现:自动转化为list、map或绑定到类上;支持自定义配置属性类ConfigruationProperties,初始化ioc时,做特殊处理) #### 对象生命周期介入 #### #### 容器生命周期介入 ####