目录
码云地址: https://gitee.com/xzc_1033426945/alibabacloud.git
通过仿写spring一方面可以更好体会领悟其设计思想,理解设计模式,另一方面可以更好的理解spring本身的底层原理 先实现主干功能,再完善细节扩展点的顺序编写 持续更新
扩大1.自动扫描bean注入
经典入口重写实现
/**
* @author xzc
*/
public class Test {
public static void main(String[] args) {
XzcApplicationContext applicationContext = new XzcApplicationContext(XzcAppConfig.class);
UserInterface userService = (UserInterface) applicationContext.getBean("userService");
userService.test();
}
}
1.自定义标签的写法 new选择标签
自定义sacn标签
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ComponentXzcScan {
String value() default "";
}
配置标签
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ConfigurationXzc {
}
显然我们需要重写的内容围绕写一个自己的context 和自己config配置类
初步重写context构造方法
private Class configClass;
private Map<String, BeanDefinition> beanDefinitionMap = new HashMap<>();
private Map<String, Object> singletonObjects = new HashMap<>();
private List<BeanPostProcessor> beanPostProcessorList = new ArrayList<>();
/**
* 首先梳理主流程
* 1.构造方法创建context 入参为配置类
* 2.解析配置类信息做bean扫描
* 3.创建单例Bean
* 4.BeanDefinition
* 5.BeanPostPRocess
*/
public XzcApplicationContext(Class configClass) {
this.configClass = configClass;
// 解析配置类信息做bean扫描
scan(configClass);
}
写扫描bean的scan方法 先判断标签是否齐全 有config 和 scan标签
/**
* 解析配置类信息做bean扫描
* 1.扫描判断传入类是否有有我们自定义注解@ComponentXzcScan的类 有进入 没有跳过
*
* @param configClass
*/
private void scan(Class configClass) {
System.out.println("scan configClass" + configClass);
if (configClass.isAnnotationPresent(ConfigurationXzc.class)) {
if (configClass.isAnnotationPresent(ComponentXzcScan.class)) {
ComponentXzcScan componentScanAnnotation = (ComponentXzcScan) configClass.getAnnotation(ComponentXzcScan.class);
scanComponentXzcScan(componentScanAnnotation);
}
}
}