# Yi-Spring **Repository Path**: Azzurro2000/yi-spring ## Basic Information - **Project Name**: Yi-Spring - **Description**: 易Spring-极简Spring工程 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-08-16 - **Last Updated**: 2024-09-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ![demo](./img/projectDemo.png) # 项目整体结构 其中: - service包模拟业务场景 - AppConfig:配置类,负责扫描service包中的Bean - OrderService:订单业务 - Test:测试Spring的功能 - UserInterface:用户接口,用来测试JDK动态代理 - UserService:用户业务 - YiBeanPostProcessor:实现了BeanPostProcessor接口的类(扩展点) - spring包:spring核心功能 - Autowired:自动装配注解 - value:设置BeanName - BeanDefinition:Bean的定义 - type:Bean的类型 - scope:Bean的作用域 - BeanNameAware:BeanName的Aware回调接口(扩展点) - setBeanName:设置BeanName - BeanPostProcessor:Bean的后置处理器接口(扩展点) - postProcessBeforeInitialization:初始化前回调 - postProcessAfterInitialization:初始化后回调 - Component:标注Bean的注解 - value:BeanName - ComponentScan:包扫描注解,可配置包扫描路径 - value:包路径 - InitializingBean:Bean的初始化接口(扩展点) - afterPropertiesSet:属性注入后回调 - Scope - value:Bean的作用域,默认是singleton单例 - ApplicationContext:IoC容器 - configClass:解析哪个类 - ConcurrentMap beanDefinitionMap:beanDefinition的集合 - ConcurrentMap singletonObjects:单例池 - ArrayList beanPostProcessors:后置处理器列表 - ApplicationContext(Class configClass):IoC容器的构造方法,主要功能IoC和AOP - Object createBean(String beanName, BeanDefinition beanDefinition):真正创建Bean - Object getBean(String beanName):获取Bean # IOC实现 主要实现了**基于配置类的IOC容器**,一个简单的ApplicationContext类 主要有beanDefinitionMap、singletonObjects和beanPostProcessors这三个字段,它们的功能如下: - **BeanDefinition集合**,封装定义了Bean的信息,包括class类路径,Bean的依赖,属性信息 - **singletonObjects集合** 单例池 - **beanPostProcessors集合:** 后置处理器列表,实现AOP机制 **IOC逻辑:** 1. ApplicationContext的构造函数,基于配置类的IoC容器,构造函数需要一个被@ComponentScan标记的配置类,对配置类进行解析得到具体待扫描文件夹的绝对路径(分隔符转换,拼接classpath路径)。遍历目标文件夹所有的.class字节码文件。 如果是被@Component注解标识这是一个Bean,则走创建BeanDefinition的逻辑(查看注解两个注解,在BeanDefinition设置作用域和BeanName) 2. 文件夹扫描完成,BeanDefinition生成完后,会遍历BeanDefinition集合,根据BeanDefinition进行选择实例化,如果是单例作用域,直接实例化并放入单例池。 # AOP实现 Spring 提供了多个扩展点,允许开发者在 Bean 的生命周期过程中进行自定义处理,AOP 就是利用这些扩展点在合适的时机对目标 Bean 进行增强。AOP的实现主要是**依赖于BeanPostProcessor后置处理器来实现**,可以在**初始化后对创建的对象进行代理**。 1. 首先需要定义了Aware接口和BeanPostProcessor接口,然后在ApplicationContext的构造函数里,扫描目标包路径生成BeanDefinition过程中,我会额外检查到当前类是否实现了后置处理器接口,有则实例化直接注册到后置处理器链条中。 2. 在后续的#createBean函数中,在初始化完成后,遍历执行后置处理器,进行切点匹配(判断当前类是否满足某些条件),如果匹配则进行增强再放入单例池。(这里我做了简化,没有像spring一样再定义@Apsect注解来实现的自动注册后置处理器,而是手动定义了一个后指处理器,进行切点匹配,直接检验类型是否为目标类) 3. 具体的#postProcessAfterInitialization增强函数,简化使用了JDK自带的动态代理,主要拦截对接口方法的调用,并在适当的时候执行通知。