前言:

spring是一个轻量级的开源的控制反转(Inversion of Control,IOC)和面向切面(AOP)的容器框架,它的主要目的是简化企业开发。这两个模块使得java开发更加简单。IOC将对象的创建交给容器并且管理,达到了解耦的作用。增加对象的时候,不用改动代码,直接增加配置文件即可。Aop可以快速的添加某种功能。

1、IOC

1.1、ioc与其说是一门技术不如说是一种思想,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。 IOC又为控制反转,何为控制反转?java程序里把创建对象,以及对象之间的依赖交给容器去管理。代码创建对象需要去听过new一个,或者反射方式以及其他的方式。spring的容器可以创建和管理这些bean。通过xml文件或者通过注解就可以创建bean和管理bean。至于容器是有BeanFactory和ApplicationContext来创建的。

1.2、 ioc的实现方式:(1)使用XML配置的方式实现IOC.  (2)注解实现 (3)依赖注入:构造方法和setter注入

    1.3、ioc容器创建和管理的都是bean,所以最重要的都是bean。bean的创建和管理等原理见:https://juejin.im/post/5be976a76fb9a049fd0f5f31。

2、DI

IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的

3、Junit单元测试 (后续添加)

4、AOP

切面(Aspect): 程序运行过程中的某个步骤或者阶段。

通知(advice): 在符合的连接点进行特殊的处理(增强处理)。

切入点(pointcut):可切入进行增强处理的连接点,AOP核心之一就是如何用表达式来定义符合的切入点。在Spring中,默认使用AspectJ的切入点语法。

连接点(joinpoint): 程序运行过程中可执行特定处理(增强处理)的点,如异常处理,在springAOP中,方法调用是连接点。

目标对象(target): 被进行增强处理的对象。

aop代理(AopProxy): 是一个重新封装了(增强处理 + 被代理对象的方法 )方法的代理对象。

织入(weaving): 增强处理切入目标对象以后,并获得代理对象(AOP代理)的这个过程,就是织入。按其作用的时间分类为,编译时织入与运行时织入。

AOP使用场景:权限控制、异常处理、缓存、事务管理、日志记录、数据校验等等。

Spring AOP中的动态代理主要有两种方式:JDK动态代理和CGLIB动态代理。

JDK动态代理,被代理的类必须要继承InvocationHandler接口,这个接口时JDK提供的,JDK动态代理:JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。为什么一定要继续接口呢?

1.在需要继承proxy类获得有关方法和InvocationHandler构造方法传参的同时,java不能同时继承两个类,我们需要和想要代理的类建立联系,只能实现一个接口。InvocationHandler中的invoke方法被自动调用。通过Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);形成代理类。使用反射机制。

动态代理的第二种实现——CGlibcglib是针对类来实现代理的,原理是对指定的业务类生成一个子类,并覆盖其中业务方法实现代理。因为采用的是继承,所以不能对final修饰的类进行代理。

目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的,诸如private的方法也是不可以作为切面的。

实现 MethodInterceptor方法代理接口,创建代理类。通过代理类对象.getInstance(业务类对象)  返回一个动态代理类对象(它是业务类的子类,可以用业务类引用指向它)。最后通过动态代理类对象进行方法调用。使用ASM 非常强大的Java字节码生成框架。

5、spring事务

6、核心容器(Core Container)

获取bean的过程主要是第一第二步。

1 ApplicationContext context = new ClassPathXmlApplicationContext("hello.xml");
2 HelloBean helloBean = (HelloBean) context.getBean("hello");
3 helloBean.sayHello();

1、Beans:Bean工厂,bean的创建和管理。首先下面两张图:

创建bean的时序图

图(1)

创建bean的入口类是applicationCoontext,refresh()方法中有个obtainFreshBeanFactory方法是创建beanFactory的核心,然后调用AbstractRfreshAbleApplicationContext中的refreshBeanFactory(),如果已经建立了BeanFactory,则销毁并关闭该BeanFactory  。如果没有则开始创建BeanFactory。使用的是DeafultBeanFactory中的loanBeanDefinition:首先初始化了BeanDefinitionReader,加载resource(xml)定位,将xml文件转换成Document(document读取xml文件)。然后RegisterBeanDefinition将Document解析成BeanDefinition(class文件)(将bean的一些描述信息抽象成对象)具体过程建图(2)。

解析和注册bean时序图

图(2)

第一步读取xml文件将bean解析组装成beanDefiniationMap。第二步,BeanDefinition建立好bean后,就是获取bean,使用AbstractBeanFactory里getBean方法,对于所有获取Bean对象是实例,都是用这个getBean(通过反射将class反射成空对象)方法,这个方法最终调用的是doGetBean(注入值)方法,这个方法就是所谓的DI(依赖注入)发生的地方。主要是解析BeanDefinition的数据合成bean。

2、组件介绍

BeanFactory:

BeanFactory的直接子接口有3个:ListableBeanFactory(可列的)、HierarchicalBeanFactory 和 AutowireCapableBeanFactory(自动装载的)ConfigurableBeanfactory(根据配置信息的)。从上图中我们可以发现最终的默认实现类是 DefaultListableBeanFactory,他实现了所有的接口。BeanFactory、ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory这四个接口共同定义了Bean的集合、Bean之间的关系、以及Bean 行为。

那为何要定义这么多层次的接口呢?最后一个类DefaultListableBeanFactory实现了所有的接口,每个单一的接口都实现了不同的功能,最后一个类继承了所有的接口,就可以实现丰富的功能。

BeanDefinition:

BeanDefinition完整描述了在Spring的配置文件中定义的<bean/>节点中所有的信息,包括各种子节点。当Spring成功解析了一个<bean/>节点后,在 Spring内部就将它被转化成BeanDefinition对象,以后所有的操作都是对这个对象完成的。

BeanDefinitionReader:

BeanDefinitionReader读入resource信息(xml)。

BeanFactoryPostProcessor:

从BeanFactoryPostProcessor 接口的名称上可以得知,实现此接口的Bean,可以在BeanFactory完成依赖注入后进行一些后继处理动作,要作什么动作取决于您,例如我们就可以在BeanFactory完成依赖注入后,根据我们提供的一个简单属性文件来设定一些经常变动的选项

Core:核心工具类

Context:运行时spring容器,上下文。

Context 在 Spring 的 org.springframework.context 包下,前面已经讲解了 Context 组件在 Spring 中的作用,他实际上就是给 Spring 提供一个运行时的环境,用以保存各个对象的状态。下面看一下这个环境是如何构建的。

总体来说 ApplicationContext 必须要完成以下几件事:

  • 标识一个应用环境
  • 利用 BeanFactory 创建 Bean 对象
  • 保存对象关系表
  • 能够捕获各种事件

spring重点知识分享的更多相关文章

  1. Spring基础知识

    Spring基础知识 利用spring完成松耦合 接口 public interface IOutputGenerator { public void generateOutput(); } 实现类 ...

  2. AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解

    AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解 javascriptvue-clicommonjswebpackast  阅读约 27 分钟 抽象语法树(AST),是一 ...

  3. PureStudy:学科知识分享——个人网站开发全解

    PureStudy:学科知识分享--个人网站开发全解 项目描述 PureStudy,学科知识分享网站. 学生可以使用这个网站,来浏览相应学科的知识点.学习总结,获取相关的资料.此外,他们可以选择上传文 ...

  4. 【转载】STL"源码"剖析-重点知识总结

    原文:STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点 ...

  5. 分享吉林大学机械科学与工程学院,zhao jun 博士的Halcon学习过程及知识分享

    分享吉林大学机械科学与工程学院,zhao jun 博士的Halcon学习过程及知识分享 全文转载zhao jun 博士的新浪博客,版权为zhaojun博士所有 原文地址:http://blog.sin ...

  6. Spring零碎知识复习

    自学了Spring也有一段时间了,多多少少掌握了一些Spring的知识,现在手上也没有很多的项目练手,就将就着把这些学到的东西先收集起来,方便日后用到的时候没地方找. 1.spring的国际化 主要是 ...

  7. JavaScript重点知识(二)

    三.JS的API 3.1知识点(DOM) 1)DOM本质 将html结构化成浏览器和JS可识别可操作的东西 2)变量计算---强制类型转换 获取DOM节点 Attribute(对html标签属性的修改 ...

  8. 【springmvc+mybatis项目实战】杰信商贸-6.重点知识回顾

    1.重点知识回顾 Maven1)覆盖仓库文件,实际企业开发,公司会架一个测试服务器,在测试服务器中架私服.我们开发人员的程序,都连接私服.当本地没有项目中要使用的jar,Myeclipse maven ...

  9. 使用javascript开发的视差滚动效果的云彩 极客标签 - 做最棒的极客知识分享平台

    www.gbtags.com 使用javascript开发的视差滚动效果的云彩 阅读全文:使用javascript开发的视差滚动效果的云彩 极客标签 - 做最棒的极客知识分享平台

随机推荐

  1. 从数据源支持、支持方式等角度深入了解Smartbi与Tableau

    对数据分析来讲,数据源支持是基本功.让数据分析工具与数据保持一个通道,建立会话.用数据分析应用服务器与我们需要分析的业务数据进行连接,拿到需要的数据进行分析.Smartbi.Tableau系统给我们提 ...

  2. 《Java从入门到精通》学习笔记(详细)

    目录 03 Java语言基础 基本数据类型 变量与常量 运算符 类型转换 代码规范 标识符命名规范 常用输入输出 04 流程控制 条件语句 循环语句 循环控制 练习 05 字符串 创建字符串 连接字符 ...

  3. selenium+python自动化106 - 滑动 iframe 上的滚动条

    前言 页面嵌套了iframe,这个iframe又是可以滚动的,如何操作iframe上的滚动条? 示例 写一个html页面案例,源码如下 <!DOCTYPE html> <html l ...

  4. 用Assert(断言)封装异常,让代码更优雅(附项目源码)

    有关Assert断言大家并不陌生,我们在做单元测试的时候,看业务事务复合预期,我们可以通过断言来校验,断言常用的方法如下: public class Assert { /** * 结果 = 预期 则正 ...

  5. selenium在爬虫中的使用

    一. selenium概述 1.1 定义 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接调用浏览器,它支持所有主流的浏览器(包括Phantom ...

  6. C语言之判断质数算法

    今天学校OJ的一题判断是质数和合数. 首先我们要弄明白质数和合数的概念:质数就是除了本身和1以外没有其他因数的数,合数就是除了本身和1以外还有其他因数的数.注意:1既不是质数也不是合数. 明白了概念, ...

  7. TP5框架中实现多条件登录

    控制器代码 //登录功能 public function login(){ $data = input(); $validate = $this->validate($data,[ 'uname ...

  8. 怎么做 HDFS 的原地平滑缩容?

    背景 当数据规模越来越大,存储成本也水涨船高.随着时间推移,数据热度分布往往呈 2⁄8 原则,即 80% 的访问集中在 20% 的数据上.对于那不经常访问的 80% 数据来说,使用多个 SSD 来存储 ...

  9. 使用flask进行mock接口

    在测试日常过程中,我们经常会遇到因为环境问题,或者是因为上下游,前后端开发进度不一,提测时间不一等情况.这时候我们可以通过mock的方式去完成一些操作.今天给大家分享一个通过flask去mock接口, ...

  10. 『现学现忘』Docker基础 — 29、Docker容器数据卷的应用

    目录 1.验证容器和宿主机之间数据共享 2.容器停止退出后,主机修改后数据是否同步 3.带只读权限的挂载数据卷 1.验证容器和宿主机之间数据共享 通过上面的操作,接下来我们演示一下通过数据卷的挂载,实 ...