spring重点知识分享
前言:
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重点知识分享的更多相关文章
- Spring基础知识
Spring基础知识 利用spring完成松耦合 接口 public interface IOutputGenerator { public void generateOutput(); } 实现类 ...
- AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解
AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解 javascriptvue-clicommonjswebpackast 阅读约 27 分钟 抽象语法树(AST),是一 ...
- PureStudy:学科知识分享——个人网站开发全解
PureStudy:学科知识分享--个人网站开发全解 项目描述 PureStudy,学科知识分享网站. 学生可以使用这个网站,来浏览相应学科的知识点.学习总结,获取相关的资料.此外,他们可以选择上传文 ...
- 【转载】STL"源码"剖析-重点知识总结
原文:STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点 ...
- 分享吉林大学机械科学与工程学院,zhao jun 博士的Halcon学习过程及知识分享
分享吉林大学机械科学与工程学院,zhao jun 博士的Halcon学习过程及知识分享 全文转载zhao jun 博士的新浪博客,版权为zhaojun博士所有 原文地址:http://blog.sin ...
- Spring零碎知识复习
自学了Spring也有一段时间了,多多少少掌握了一些Spring的知识,现在手上也没有很多的项目练手,就将就着把这些学到的东西先收集起来,方便日后用到的时候没地方找. 1.spring的国际化 主要是 ...
- JavaScript重点知识(二)
三.JS的API 3.1知识点(DOM) 1)DOM本质 将html结构化成浏览器和JS可识别可操作的东西 2)变量计算---强制类型转换 获取DOM节点 Attribute(对html标签属性的修改 ...
- 【springmvc+mybatis项目实战】杰信商贸-6.重点知识回顾
1.重点知识回顾 Maven1)覆盖仓库文件,实际企业开发,公司会架一个测试服务器,在测试服务器中架私服.我们开发人员的程序,都连接私服.当本地没有项目中要使用的jar,Myeclipse maven ...
- 使用javascript开发的视差滚动效果的云彩 极客标签 - 做最棒的极客知识分享平台
www.gbtags.com 使用javascript开发的视差滚动效果的云彩 阅读全文:使用javascript开发的视差滚动效果的云彩 极客标签 - 做最棒的极客知识分享平台
随机推荐
- linux centos7下 c++编程
在Linux下与在windos下编程没啥区别,可以在windos上实现后,然后更改一些,移植到linux中 yum install gcc yum install gcc-c++ vi main.cp ...
- linux中jupyter notebook中切换虚拟环境
python -m ipykernel install --user --name 虚拟环境名称 --display-name "虚拟环境名称" 然后再打开jupyter note ...
- (第二章第二部分)TensorFlow框架之读取图片数据
系列博客链接: (第二章第一部分)TensorFlow框架之文件读取流程:https://www.cnblogs.com/kongweisi/p/11050302.html 本文概述: 目标 说明图片 ...
- 十进制数转IEE754单精度浮点数以及浮点数转换的python实现
十进制数转IEE754单精度浮点数 理解题目 单精度浮点数:单精度浮点数是用来表示带有小数部分的实数,一般用于科学计算.占用4个字节(32位)存储空间,包括符号位1位,阶码8位,尾数23位.其数值范围 ...
- querylist 在laravel框架中的简单采集数据(专业5)
//爬虫网站路由Route::get('/querylist/list','querylistControllers@querylist'); //控制器 <?phpnamespace App\ ...
- thinkpad笔记本选型
ThinkPad分为了几大系列,低端的有L系列.E系列,比较高端的有T系列.X系列及P系列,这些系列中质量比较稳定属于商务办公系列,中端有针对商务或者是娱乐的R系列.A系列和S系列.具体介绍如下: 1 ...
- LOJ6485题解
应该是经典题之一了. \[[n|k]=\frac 1 n\sum_{i=0}^{n-1}w_n^{ik} \] 有这个就可以算了. \[\sum_{i=0}^n\binom n i x^ia_{i \ ...
- Django基础五之Ajax
Django基础五之Ajax 目录 Django基础五之Ajax 1. Ajax介绍 2. Ajax前后端传值 2.1 方法一HttpResponse直接返回 2.2 方法二使用Json格式返回 2. ...
- 神经网络中的Heloo,World,基于MINST数据集的LeNet
前言 最近刚开始接触机器学习,记录下目前的一些理解,以及看到的一些好文章mark一下 1.MINST数据集 MNIST 数据集来自美国国家标准与技术研究所, National Institute of ...
- 《前端运维》一、Linux基础--10定时任务
一.进程管理 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体 ...