Spring是一个开源的轻量级Java SE / Java EE开发应用框架。在传统应用程序开发中,一个完整的应用是由一组相互协作的对象组成。所以开发一个应用除了要开发业务逻辑之外,最多的是关注如何使这些对象协作来完成所需功能,而且要低耦合、高内聚

Spring框架可以帮我们管理对象及其依赖关系,另外还提供像通用日志记录、性能统计、安全控制、异常处理等面向切面的能力,以及管理数据库事务,除了本身提供了一套简单的JDBC访问实现,还提供与第三方数据访问框架集成,与各种Java EE技术整合(如Java Mail、任务调度等),提供一套自己的web层框架Spring MVC。可以认为Spring是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力,从而使我们可以更自由的选择到底使用什么技术进行开发。

spring的aop的实现方式

AOP的实现是代理模式

动态代理的实现方式和区别

jdk动态代理和使用cglib产生代理。

一般jdk动态代理用于目标类都是基于统一的接口,cglib多用于对类的代理,这些类不需要实现统一的接口。

spring源码+原理

说到spring原理,我们就一定要提到spring的整体架构,也就是它的主要模块。

spring中创建bean的底层原理流程

1、ResourceLoader从存储介质中加载Spring配置信息,并使用Resource表示这个配置文件的资源;

2、BeanDefinitionReader读取Resource所指向的配置文件资源,然后解析配置文件。配置文件中每一个解析成一个BeanDefinition对象,并保存到BeanDefinitionRegistry中;

3、容器扫描BeanDefinitionRegistry中的BeanDefinition,使用Java的反射机制自动识别出Bean工厂后处理后器(实现BeanFactoryPostProcessor接口)的Bean,然后调用这些Bean工厂后处理器对BeanDefinitionRegistry中的BeanDefinition进行加工处理。主要完成以下两项工作:

1)对使用到占位符的元素标签进行解析,得到最终的配置值,这意味对一些半成品式的BeanDefinition对象进行加工处理并得到成品的BeanDefinition对象;

2)对BeanDefinitionRegistry中的BeanDefinition进行扫描,通过Java反射机制找出所有属性编辑器的Bean(实现java.beans.PropertyEditor接口的Bean),并自动将它们注册到Spring容器的属性编辑器注册表中(PropertyEditorRegistry);

4.Spring容器从BeanDefinitionRegistry中取出加工后的BeanDefinition,并调用InstantiationStrategy着手进行Bean实例化的工作;

5.在实例化Bean时,Spring容器使用BeanWrapper对Bean进行封装,BeanWrapper提供了很多以Java反射机制操作Bean的方法,它将结合该Bean的BeanDefinition以及容器中属性编辑器,完成Bean属性的设置工作;

6.利用容器中注册的Bean后处理器(实现BeanPostProcessor接口的Bean)对已经完成属性设置工作的Bean进行后续加工,直接装配出一个准备就绪的Bean。

spring的特性

Spring IoC容器

IoC容器是实现控制反转的载体,它可以在对象生成或初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖。

BeanFactory是IOC容器的实际代表者,它是面向Spring本身的<getBean()>;

ApplicationContext继承了BeanFactory,它是面向框架使用者的。

spring一个bean装配的过程

Bean是由IoC容器进行加载的。

  1. BeanDefinitonReader读取Resource所指向的配置文件资源,然后解析配置文件。配置文件中每一个解析成一个BeanDefiniton对象,并保存到BeanDefinitonRegistry
  2. 容器扫描BeanDefinitonRegistry中的BeanDefiniton,调用InstantiationStrategy进行Bean实例化的工作,使用BeanWrapper完成Bean属性的设置工作
  3. 单例Bean缓存池:Spring在DefaultSingletomBeanRegistry类中提供一个用于缓存单实例Bean的缓存器,单实例Bean以beanName为键保存在HashMap

spring的事务特性

ACID

Bean与Spring容器的关系

① Spring启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表

② 根据注册表实例化Bean,装配好Bean之间的依赖关系

③ 将Bean实例放到Spring容器中

④ 使用Bean

BeanFactory和FactoryBean

一个是Factory,也就是IoC容器或对象工厂;所有的Bean都是由BeanFactory来进行管理的。

一个是Bean。一个能产生或者修饰对象生成的工厂Bean。实现与工厂模式相似。

Aop的概念

连接点JointPoint:需要插入横切关注点的扩展点,即被拦截的点,在spring中指方法

切入点Pointcut:选择一组连接点模式,即对连接点的拦截作定义

通知Advice:拦截到连接点之后做的动作

Aop默认使用的代理技术

默认情况下,@EnableAspectAutoProxyproxyTargetClass属性为false。如果业务类有实现接口,那么aop使用jdk;没有实现接口使用cglib。若属性设置为true,强制使用cglib。

在aop增强的业务类中,a方法调用b方法,怎么让b方法也被增强

@EnableAspectAutoProxyexposeProxy属性设置为true,将代理对象暴露到线程中。调用时从当前线程中获取代理对象进行调用,而不是使用this。

怎么指定多个切面的执行顺序

可以在切面类加上@Order注解,value值为顺序,数字越大,优先级越低。默认是Integer最大值。也可以实现Order接口?

Aop使用场景

日志,权限验证,符号验证,输入输出验证。

自定义切面和事务注解切面怎么控制他的顺序

@EnableTransactionManagement导入的切面优先级就是默认的,最低的。自定义的就可以指定优先级。

Aop怎么解析切面的?

在bean的生命周期过程中,createBean中还没有调用bean的构造方法之前会调用bean的后置处理器InstantiationAwareBeanPostProcessorpostProcessBeforeInstantiation()方法,如果还没有目标对象且需要被代理,在该后置处理器中会解析切面保存到缓存中,然后创建代理对象:

  1. 去容器中获取所有bean的名称,然后遍历,通过bean名称取出class对象,然后判断有没有@Aspect注解
  2. 如果是切面了,再根据class.getMethod获取方法上的注解,判断类型,建立通知对象
  3. 加入缓存(因为遍历很耗时)

spring面试合集的更多相关文章

  1. 一线大厂工程师推荐:Mysql、Springboot、JVM、Spring等面试合集

    前两天晚上,正当我加班沉浸在敲代码的快乐中时,听到前桌的同事在嘀咕:Spring究竟是如何解决的循环依赖? 这让我想起最开始学Java的时候,掌握了一点基本语法和面向对象的一点皮毛.当时心里也是各种想 ...

  2. spring + mybatis合集

    一.Spring 1. IoC 什么是IoC: 跟我一起学Spring 3(4)–深入理解IoC(控制反转)和DI(依赖注入) Spring中IoC的优点与缺点 spring Ioc 实践 IoC如何 ...

  3. 秋招如何抱佛脚?2022最新大厂Java面试真题合集(附答案

    2022秋招眼看着就要来了,但是离谱的是,很多同学最近才想起来还有秋招这回事,所以纷纷临时抱佛脚,问我有没有什么快速磨枪的方法, 我的回答是:有! 说起来,临阵磨枪没有比背八股文更靠谱的了,很多人对这 ...

  4. 面试必备:高频算法题终章「图文解析 + 范例代码」之 矩阵 二进制 + 位运算 + LRU 合集

    Attention 秋招接近尾声,我总结了 牛客.WanAndroid 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对.测试.欢迎食用 本 ...

  5. Struts+Hibernate+Spring面试题合集及答案

    Struts+Hibernate+Spring面试题合集及答案 Struts+Hibernate+Spring面试题合集 1 1. Hibernate部分 2 1.1. Hibernate工作原理 2 ...

  6. Java学习、面试、求职、干货资源精品合集

    本系列文章整合了本号发表和转载过的,有关Java学习.进阶.面试.做项目.求职经验等方面的文章,希望对想要找工作,以及正在找工作的你,能够有所帮助. 原创Java学习专题文章: 如何才能够系统地学习J ...

  7. Struts+Hibernate+Spring面试题合集及答案(转)

    Struts+Hibernate+Spring面试题合集及答案 Struts+Hibernate+Spring 面试题合集 1 1. Hibernate部分 2 1.1. Hibernate工作原理 ...

  8. 掘金 Android 文章精选合集

    掘金 Android 文章精选合集 掘金官方 关注 2017.07.10 16:42* 字数 175276 阅读 50053评论 13喜欢 669 用两张图告诉你,为什么你的 App 会卡顿? - A ...

  9. 备战金三银四!一线互联网公司java岗面试题整理:Java基础+多线程+集合+JVM合集!

    前言 回首来看2020年,真的是印象中过的最快的一年了,真的是时间过的飞快,还没反应过来年就夸完了,相信大家也已经开始上班了!俗话说新年新气象,马上就要到了一年之中最重要的金三银四,之前一直有粉丝要求 ...

随机推荐

  1. 哈夫曼树 动态数组的使用vector

    问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下: 1. ...

  2. C语言递归之二叉树的最小深度

    题目描述 给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例 输入:[3,9,20,null,null,15,7] ...

  3. 新建Microsoft Word文档

    问题描述 L正在出题,新建了一个word文档,想不好取什么名字,身旁一人惊问:“你出的题目叫<新建Microsoft Word文档>吗?”,L大喜,一拍桌子,说:“好,就叫这个名字了.” ...

  4. 检测到 LoaderLock Message: 正试图在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。

    解决方法: 调试状态=>异常(Ctrl+Alt+E)=>Managed Debuggin Assistants=>LoaderLock 的选中状态去掉即可.

  5. float浮动造成高度塌陷的解决办法

    Float是我们在页面布局中常用的,也是非常重要的一个属性,可以让页面布局变得更加灵活. 但是在继续学习之后,尤其是掌握了宽高自适应之后,我们常常会发现一个奇怪的现象:如果父元素没有设置高度,而子元素 ...

  6. unity踩坑2020-01-21

    这几天一直在测试一个类似于传奇的2d界面游戏,目前做的测试为: 人物动作响应,主要是8方向的判断和资源文件精灵的刷新. 学到的知识点: 1,Enum.GetHashCode() 可以得到这个枚举的索引 ...

  7. MySQL进阶之索引

    一.索引的本质: 数据库查询是数据库的最主要的功能之一,数据库系统的设计者从查询算法的角度对数据库进行了一定的优化. 最基本的顺序查找算法的复杂度为O(n),在数据量很大的时候算法的效率是很低的.虽然 ...

  8. Date工具类中CompareTo()

    A<B 结果是-1 A>B 结果是1 A==B 结果是0

  9. pymysql 连接池

    pymysql连接池 import pymysql from DBUtils.PooledDB import PooledDB, SharedDBConnection ''' 连接池 ''' clas ...

  10. hdu1005 矩阵快速幂

    #include<iostream> #include<cstdio> #include<cstring> #include<set> #include ...