Marchen的博客

分享一切喜欢的事物


  • 首页

  • 标签

  • 分类

  • 归档

  • 关于

  • 日程表

Spring容器的实现

发表于 2019-04-12 | 分类于 技术

1. 概念

        Spring容器有两个重要的概念-IOC(控制反转)和DI(依赖注入)。IOC和DI对学习Spring的人总感觉模糊不清以至于难以理解。因此在进行Spring容器实现的介绍之前,先通俗的了解下IOC和DI的相关知识。

IOC(控制反转)

        IOC(Inversion of Control)-控制反转,即指将原本由开发人员来控制对象的实例化来交给Spring容器来进行实例化,开发人员只需要进行简单的配置即好,Spring容器(这里指BeanFactory和ApplicationContext)会在合适的时机对配置的信息进行实例化。因此此处“控制反转”指的是对象的实例化控制反转给了Spring容器进行处理。

DI(依赖注入)

        DI(Dependency Injection)-依赖注入,即指原本由开发人员选择在某时通过构造参数或setter属性注入的方式向来设置对象的属性改为由Spring容器选择在何时的时机根据配置来进行属性的设置。
这样做的好处便是:提升了组件的重用频率,只需要配置一次,可以设置到多个对象中。

Spring容器的继承关系

BeanFactory继承关系图

BeanFactory继承关系图

        BeanFactory是Spring容器的最顶层接口,提供了Spring容器的最基本方法;XmlBeanFactory是BeanFactory的最终实现,不过在Spring5.x版本中被标记为过时了。上述图片中间的一列和右边的一列,暂时不考虑,他们提供了注册Bean实例和BeanDefinetion信息的相关接口和方法。在上述继承关系图中,我们重点关注BeanFactory、ListableBeanFactory、ConfigurableBeanFactory、AbstractBeanFactory和DefaultListableBeanFactory,接下来会详细讲解上述类的作用以及在后边的章节中会讲到一个Bean从配置到注入到Spring容器中的实现。

BeanFactory详解

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
39
40
public interface BeanFactory {

//该属性针对于FactoryBean
String FACTORY_BEAN_PREFIX = "&";

//通过Bean名称(Id/name/alias)获取Bean的实例信息
Object getBean(String name) throws BeansException;

//通过Bean名称和类型获取Bean的实例信息
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
//根据Bean名称和构造参数的实参获取Bean的实例信息
Object getBean(String name, Object... args) throws BeansException;

//根据类型获取Bean实例信息
<T> T getBean(Class<T> requiredType) throws BeansException;

//根据类型和构造参数的实参获取Bean实例信息
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);

<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
//是不是包含该名称的Bean实例
boolean containsBean(String name);
//判断该Bean是否是单例模式
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

//判断该Bean是否是原型模式
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;

//获取该名称Bean的所有别名
String[] getAliases(String name);
}

ApplicationContext继承关系图

Mybatis之SqlSession源码解析

发表于 2019-03-24 | 分类于 技术

之前写过Mybatis之SqlSessionFactory源码解析,但在写这篇文章的时候,发现之前写不是那么好理解,没有给人一种看了就懂的感觉,所以在写这篇文章的时候,会穿插的介绍之前已经分析过的知识和源码,争取这次能够看完这篇文章能够深入了解其内部是怎么实现以及Mybatis的优势。

阅读全文 »

Spring MVC源码解析(一)-HandleMapping的注册与发现

发表于 2019-02-23 | 分类于 技术

Spring MVC是目前主流的WEB MVC框架,许多公司都在使用Spring MVC或者间接的使用Spring MVC。之前一直都是哟Spring MVC但没有具体了解过其实现原理和它的源码实现。
在开始之前,我们先回顾下SpringMVC处理请求的流程:

阅读全文 »

Rabbitmq解析与应用

发表于 2019-01-06 | 分类于 技术

Rabbitmq

一直在学习和了解Rabbitmq相关的内容,但是之前的项目年代比较久远和其它一些原因,因此在项目没有使用到过Rabbitmq相关的技术。最近,趁着项目要大刀阔斧的重构,经过对项目的实际实际分析与考虑,发现针对业务中的某些场景可以使用Rabbitmq技术,使得项目变得更易于扩展和使用,并且可以是项目的影响可以更加迅速。

Rabbitmq的实现采用AMQP协议的标准。AMQP(Advanced Message Queuing Protocol),即高级消息队列协议,本身属于应用层协议,主要是为了满足消息发送者与消费者实现解耦,消息发送者无需知道消息消费者是否存在或着是谁,只需要将消息发送到特定的地点,而消息消费者也无需知道该条消息来源于什么地方,只需要否则消费该消息做相应的操作。Rabbitmq本身采用erlang语言编写,支持多种客户端,而且本身支持集群部署,具有较高的容错性和可扩展性。

阅读全文 »

Mybatis源码解析(一)--SqlSessionFactory

发表于 2018-12-29 | 分类于 技术

写这篇文章主要因为觉得自己总是只知其然,而不知其所以然!所以才写下这篇文章,其主要目的是帮助自己巩固加深所学习的知识。以后也会写更多这样的文章,希望能够帮到自己和其他人能够知其然,也要知其所以然。

Mybatis流程图

Myabtis流程图
上图描述了Mybatis的一个整体流程图,包括从SqlSessionFactory的创建一直到Statment执行Sql,并且返回相关的结果,右边一部分是运行期间要使用到的额外对象。后边的分析也会围绕这个流程图进行分析,首先让我们进入到一个环节,创建SqlSessionFactory对象。

阅读全文 »
<12
Marchen

Marchen

原来我很快乐,只是不愿承认

15 日志
2 分类
24 标签
0%
© 2020 Marchen
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4