# demo-spring **Repository Path**: fengsoshuai/demo-spring ## Basic Information - **Project Name**: demo-spring - **Description**: 对spring框架的模拟实现,帮助理解、学习spring框架。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-04-09 - **Last Updated**: 2022-04-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 工程简介 手写模拟spring初始化,创建Bean的过程。 帮助学习并理解这个框架 ## 目前已实现 ### 1 简单校验 主要是对 Configuration 注解和 ComponentScan 注解的校验,要求配置类上要有这俩注解。 ### 2 扫描配置 根据启动时传入的配置类,获取配置类上的注解 ComponentScan 中的参数,即包名。 根据包名扫描该包下的所有的 .class 文件,包的深度现在设置的是20,应该是够用了。 将扫描到的 .class 文件名,使用字符串截取的方式,组装出要用的类的全限定名。 ### 3 根据扫描到的配置组装 BeanDefinition 根据第2步获取到的类名,加载到类。得到 Class。 再根据Class解析Class上是否带有 Component注解。 如果带有 Component 注解,将该注解上的属性进行解析,作为 bean 的名称。如果没有指定名称默认使用类名小写第一个字母作为bean的名称。 BeanDefinition 中有 以下属性: ```java private Class beanClass; private String scope; private boolean isLazy; ``` 其中 beanClass 是bean对应的 Class 就是根据第2步获得的类的完整名称加载出来的。 scope 用来表示是单例bean还是多例bean。 isLazy表示当前生成bean是否是懒加载。 最终存储时,使用 beanName 作为 key,BeanDefinition 作为 value存储到一个Map中。 ### 4 根据 BeanDefinition 创建非懒加载、并且是单例的bean,存储到单例池 这一步是根据 BeanDefinition 中的 beanClass,获取到该类的无参数构造器,在根据这个无参数构造器生成一个bean,同时将该bean存储到单例池中。 ### 5 增加 BeanNameAware 接口 BeanNameAware 当类中需要使用 beanName时,实现此接口。 在初始化设置属性之后,对beanName 进行赋值。 ### 6 增加 InitializingBean 接口 当对实例需要做属性设置值之后,再进行操作。 常用于对实例的属性值进行校验。 ### 7 增加 BeanPostProcessor 接口 bean的后置处理器: 常用于扩展,在Bean初始化,设置属性值之后执行。或在刚刚通过构造器创建实例后执行(设置属性之前)。 # 延伸阅读 ## 测试&包文件说明 在org.feng.demo包下,有一个Test类,目前暂时在里边使用 main方法进行测试。 至于 org.feng.framework,就是模拟spring框架的注解,接口,类的定义的位置。