# spring-kernel **Repository Path**: jilongliang/spring-kernel ## Basic Information - **Project Name**: spring-kernel - **Description**: spring-kernel 为Spring的内核知识点学习demo - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-06-10 - **Last Updated**: 2022-04-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 1、IOC & DI * IOC (Inverse of Control ,控制反转) * DI (Dependency Injection 依赖注入) ### 2、关于Spring容器管理Bean的过程以及加载模式 * 1、需要将Bean的定义信息声明在Spring的配置文件当中 * 2、需要通过Spring抽象出来的各种Resource来指定对应的配置文件 * 3、需要显示声明一个Spring工程,该工厂用来掌握我们在配置文件中所声明的各种bean以及bean之间的依赖关系与注入关系 * 4、需要定义一个配置信息读取器,该读取器用来读取之前所定义的bean配置文件信息 * 5、读取器的作用是读取我们所声明的配置文件信息,并且将读取后的信息装配到之前所声明的工厂当中 * 6、需要将读取器与工厂以及资源对象进行的关联处理, * 7、工厂所管理的全部对象装配完毕,可以供客户端直接调用,获取客户端需要使用的各种Bean对象 ``` //获取资源文件 Resource resource = new ClassPathResource("applicationContext.xml"); DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory(); //读取器 BeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(defaultListableBeanFactory); beanDefinitionReader.loadBeanDefinitions(resource); //方法1、getBean就是xml的id,向下强转 //Student student = (Student)defaultListableBeanFactory.getBean("student"); //方法2 Student student = defaultListableBeanFactory.getBean("student", Student.class); System.out.println(student.getUserName() + "--" + student.getAge()); ``` ### 3、Spring对Bean管理的核心组件 * 1、资源抽象 * 2、工厂 * 3、配置信息读取器 ### 4、BeanFactory是Spring Bean工厂最顶层的抽象 ### 5、循环加载依赖 * XmlBeanDefinitionReader#loadBeanDefinitions方法 ``` Set currentResources = this.resourcesCurrentlyBeingLoaded.get(); if (currentResources == null) { currentResources = new HashSet<>(4); this.resourcesCurrentlyBeingLoaded.set(currentResources); } // 通过set判断是否存在相同的值 // A-->B ,加载了A,然后B包含了A,加载B,本身A已经加载了。 if (!currentResources.add(encodedResource)) { throw new BeanDefinitionStoreException( "Detected cyclic loading of " + encodedResource + " - check your import definitions!"); } //判断currentResources是为空就移除remove,保证内存溢出 if (currentResources.isEmpty()) { this.resourcesCurrentlyBeingLoaded.remove(); } ``` * resourcesCurrentlyBeingLoaded是ThreadLocal ``` private final ThreadLocal> resourcesCurrentlyBeingLoaded = new NamedThreadLocal<>("XML bean definition resources currently being loaded"); ``` ### 6、dom与sax * dom是一次性读取到内存里面,从内存进行读取 * sax是遇到节点就读取,通过文件流的方式进行读取 ### 7、通过doLoadBeanDefinitions方法bena的xml读取 * XmlBeanDefinitionReader#doLoadBeanDefinitions ### 8、BeanDefinitionParserDelegate