时隔很多天的我又回来....最近发展了一下自己的爱好,所以拖了很长时间。

前面我们从概念性上分析了spring的特性

这里我们附上Spring框架的结构图

我们简单的来说一些这个框架图

我们从下往上看

1.测试部分Test

Spring提供的测试部分非常重要,这个SpringTest可以帮助我们在服务器上完成测试(即不用每次都重启服务器去测试),跟Junit的测试一样。而且这个SpringTest是可以配合Junit使用的。

2.Spring的核心部分

这里有4个部分 Beans Core Context ExpressionLanguage

Beans 是关于创建Bean和管理Bean的一些类

Core 部分就不多说了,一般核心部分都是最底层的东西

Context 负责上下文的一些类

ExpressionLanguage EL表达式。跟Struts2的OGNL表达式类似

3.AOP,Aspects

这个部分的Instrumentation我没用过,看到的也很少,所以这里就不提了。欢迎评论区补充。这层是切面层。关于AOP,Aspects这里不再做过多的解释了

4.WEB层

主要是关联一些其他的框架,如Struts,SpringMVC,还有一些远程调用。

5.Data Access层

这部分是事务管理和数据源部分。spring有自己的jdbc模版,jdbcTemplate。同样Spring也为其他ORM框架提供了交互层,如:Hibernate,Mybatis,JPA等

IOC是如何工作的呢?

这就是本章我们要研究的问题

1.spring容器

前面我们讲了SpringIOC容器的概念。现在我们通过源码来看一下,SpringIOC容器是什么。

Spring的容器并不是只有一个,Spring自带了多个容器实现,大致可以分为两类

①BeanFactory,提供最基本的DI功能

图1.1 beanFactory的方法

再看一下它的基本实现类

②应用上下文ApplicationContext,它是基于BeanFactory。除了支持基本的DI功能,还支持从属性文件解析文本,以及发布事件给事件监听者,该接口继承多个其他的接口。

 

图1.2-1 Application接口

我们常用的几个Spring容器的具体实现有:

1.ClassPathXmlApplicationContext

2.FileSystemXmlApplicationContext

这两个是我们在本地引用xml配置文件时用的IOC容器,web的IOC容器我们在后面讨论。这个小节我们讨论IOC容器的具体工作。

Spring加载bean通常称为装配,以下是其中一种模式(XML显示装配)

ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");
Car car =app.getBean(Car.class);
System.out.println(car.getBrand()+","+car.getDesc());

以上一段代码包含以下几点:

1.读取配置文件beans.xml

2.根据beans.xml中的配置,找到对应的类的配置并实例化

3.调用实例化后的实例。

实际这3步里执行了多少逻辑对我们是透明的,这几步也许就是它的原理了..

蓝色颜色标注的为相同的(因为线确实扯不过来....),红色的为基本的常用的Spring容器

这是spring的IOC容器的体系结构,了解一下。下一节,来了解IOC容器是如何初始化的。

1.2浅谈Spring-Spring结构的更多相关文章

  1. 浅谈对Spring Framework的认识

    Spring Framework,作为一个应用框架,官方的介绍如下: The Spring Framework provides a comprehensive programming and con ...

  2. 浅谈使用spring security中的BCryptPasswordEncoder方法对密码进行加密与密码匹配

    浅谈使用springsecurity中的BCryptPasswordEncoder方法对密码进行加密(encode)与密码匹配(matches) spring security中的BCryptPass ...

  3. 浅谈c语言结构体

    对于很多非计算机专业来说,c语言课程基本上指针都不怎么讲,更别说后面的结构体了.这造成很多学生对结构体的不熟悉.这里我就浅谈一下我对结构体的认识. 结构体,就是我们自己定义出一种新的类型,定义好之后, ...

  4. Spring 学习教程(一):浅谈对Spring IOC以及DI的理解

    一.个人对IoC(控制反转)和DI(依赖注入)的理解我们平时在开发java web程序的时候,每个对象在需要使用它的合作对象时,自己都要将它要合作对象创建出来(比如 new 对象),这个合作对象是由自 ...

  5. 浅谈C/C++结构体内存分配问题

    .wiz-todo, .wiz-todo-img {width: 16px; height: 16px; cursor: default; padding: 0 10px 0 2px; vertica ...

  6. 浅谈 System.Decimal 结构

    引言 我们知道,Microsoft .NET Framework 中的 System.Decimal 结构(在 C# 语言中等价于 decimal keyword)用来表示十进制数,范围从 -(296 ...

  7. 浅谈linux虚拟内存结构

    一个虚拟存储器系统要求硬件和软件之间紧密写作(mmu(内存管理单元,虚拟地址到物理地址的翻译),TLB块表(虚拟地址到物理地址index,虚拟寻址),l1,l2,l3高速缓存(物理单元数据)物理寻址) ...

  8. 浅谈JVM - 内存结构(二)- 虚拟机栈|凡酷

    2.1 定义 Java Virtual Machine Stacks(Java虚拟机栈) Java 虚拟机栈描述的是 Java 方法执行的内存模型,用于存储栈帧,是线程私有的,生命周期随着线程启动而产 ...

  9. Spring缓存框架原理浅谈

    运维在上线,无聊写博客.最近看了下Spring的缓存框架,这里写一下 1.Spring 缓存框架 原理浅谈 2.Spring 缓存框架 注解使用说明 3.Spring 缓存配置 + Ehcache(默 ...

  10. 浅谈Spring MVC知识

    关于MVC框架,我相信大家都不陌生,都会说也就是模型-视图-控制器这三层的框架结构,如果你参加面试的时候考官会问:“MVC框架是什么?你说一说.”其实我们都知道这个问题还需要问的,只要你是一个开发人员 ...

随机推荐

  1. libstdc++适配Xcode10与iOS12

    编译报错 当你开心得升级完新 macOS,以及新 XCode,准备体验了一把 Dark Mode 编程模式,开心的打开自己的老项目的时候,发现编译不通过了╮(╯_╰)╭ 如果你的工程中如果依赖 lib ...

  2. Bootstrap -- 导航栏样式、分页样式、标签样式、徽章样式

    Bootstrap -- 导航栏样式.分页样式.标签样式.徽章样式 1. 使用图标的导航栏 使用导航栏样式: <!DOCTYPE html> <html> <head&g ...

  3. Extjs 在Grid单元中格添加Tooltip提示

    Grid 中的单元格添加Tooltip 的效果 Ext.QuickTips.init(); //必须要… columns: [ { text: 'Name', dataIndex: 'name' }, ...

  4. Angular的项目结构

    前面我们已经在我们想要的位置顺利的创建了Angular项目,现在我们就来看一下项目的结构吧. 下面使我们项目的整体结构,包括node的模板.src资源文件以及配置文件等. 下面是根目录文件夹内的文件用 ...

  5. RabbitMQ安装,Windows下

    一.下载安装ERLANG语言 otp_win64_20.3.exe 一直下一步.然后设置环境变量  ERLANG_HOME   C:\Program Files\erl9.3 二.安装RabbitMQ ...

  6. 【Python 25】52周存钱挑战5.0(datetime库和import)

    1.案例描述 按照52周存钱法,存钱人必须在一年52周内,每周递存10元.例如,第一周存10元,第二周存20元,第三周存30元,直到第52周存520元. 记录52周后能存多少钱?即10+20+30+. ...

  7. dispatch_barrier_async--屏障是一个同步点

    Discussion Calls to this function always return immediately after the block has been submitted and n ...

  8. Linux(CentOS)下设置nginx开机自动启动(2个办法)

    首先,在linux系统的/etc/init.d/目录下创建nginx文件,使用如下命令: vim /etc/init.d/nginx 在脚本中添加如下命令: #!/bin/sh # # nginx - ...

  9. HNOI2019做题笔记

    代码比较长所以直接去LOJ看吧- 鱼(计算几何.向量) 比较套路的内容:枚举\(D\),对于其他所有点按照\(D\)极角排序,按照极角序枚举\(A\),这样垂直于\(AD\)的线也会以极角序旋转,可以 ...

  10. Golang常见误区(一)

    1.左大括号一般不能单独一行 在其他大多数语言中,{ 的位置你自行决定.Go 比较特别,遵守分号注入规则(automatic semicolon injection):编译器会在每行代码尾部特定分隔符 ...