spring源码之IOC - 加载bean定义 2

    这一章开始真正解析xml的标签,逻辑不复杂,但是内容比较多,所有单独放一篇文章。继续上一章的BeanDefinitionDocumentReader.registerBeanDefinitions(),该接口只有一个实现类就是:DefaultBeanDefinitionDocumentReader。以下面xml为例

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">

</beans>

阅读全文

spring源码之IOC - 加载bean定义 1

    上一章讲到refreshBeanFactory做了两件事情,一件是创建容器,一件是加载BeanDefinition,即loadBeanDefinitions()。加载BeanDefinition包含两个过程。本章讲第一点。

  1. 加载bean配置文件

阅读全文

spring源码之IOC - 创建容器

    IOC初始化可归纳为两个步骤,创建容器、加载bean定义。本文以ApplicationContext为例讲解创建容器过程,其实现类为ClassPathXmlApplicationContext。

    ApplicationContext允许嵌套上下文,可以将父上下文维护在一个上下文中,其原理很类似双亲委托加载。对于使用的话,加载一个bean,会先检查当前上下文,然后检索父上下文,逐级向上。这样为spring应用提供一个共享的bean环境,而不用在多个上下文之间来回切换。

阅读全文

spring源码之IOC - 源码预读

    spring作为粘合剂,其中IOC是它的基础,即控制反转,将项目中对对象的创建、依赖,交给IOC容器来完成。而每一个对象创建方式都各不相同,那么IOC要集中管理这一切,肯定不是一件简单的工作。本篇将介绍IOC容器整体启动的过程。

BeanFactory

    IOC容器,是一个典型的工厂模式实现,BeanFactory是IOC最顶层的接口,规范了IOC最基础的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public interface BeanFactory {

/**
* 用于配合FactoryBean的使用,当需要取得FactoryBean本身的对象时,需要加上该字符
*/
String FACTORY_BEAN_PREFIX = "&";


/**
* 从IOC容器中获取bean
*/
Object getBean(String name) throws BeansException;
<T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

/**
* 检索bean,是否存在于IOC容器中
*/
boolean containsBean(String name);
/**
* 是否为单例bean
*/
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

/**
* 根据bean名字,返回bean的class对象
*/
@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;

String[] getAliases(String name);
}

阅读全文

spring源码解析

    本系列博客为看书留下的笔记,记录整个spring运行过程。主要分为四个模块,如下

  1. IOC
  2. DI
  3. AOP

阅读全文

mock下游的dubbo服务

    系统生态化后,最头疼的事请就是强依赖下游系统提供的服务。当服务链路太长,开发过程要求部署整套服务,这个需要的资源是巨大的。最近着手解决这个问题,今天记录下来。

    在解决这个问题的过程中,得到三种解决方案。如下:

阅读全文

手写dubbo 12-基于tomcat实现RPC(番外篇)

    博客中代码地址:https://github.com/farliu/farpc.git

阅读全文

手写dubbo 11-动态代理的应用

    博客中代码地址:https://github.com/farliu/farpc.git

阅读全文

手写dubbo 10-基于netty实现RPC

    博客中代码地址:https://github.com/farliu/farpc.git

阅读全文

手写dubbo 9-SPI实现

    博客中代码地址:https://github.com/farliu/farpc.git

阅读全文