Spring七大模块
Spring Core:框架的最基础部分,提供 IoC 容器,对 bean 进行管理。它主要的组件就是BeanFactory, 是工厂模式的实现。同时BeanFactory适用控制反转(IOC)思想将应用程序的配置和依赖性规范与实际的应用程序分开。

Spring Context:继承BeanFactory,提供上下文信息,扩展出JNDI、EJB、电子邮件、国际化等功能。

Spring DAO:提供了JDBC的抽象层,还提供了声明性事务管理方法。并且极大地降低了需要编写地异常代码数据 (例如打开和关闭连接)。

Spring ORM:提供了JPA、JDO、Hibernate、MyBatis 等ORM映射层.

Spring AOP:集成了所有AOP功能。减弱代码的功能耦合,清晰的被分离开。

Spring Web:提供了基础的 Web 开发的上下文信息,现有的Web框架,如JSF、Tapestry、Structs等,提供了集成

Spring Web MVC:提供了 Web 应用的 Model-View-Controller 全功能实现。

Bean定义5种作用域
singleton(单例) prototype(原型) request session global session

pring ioc初始化流程?
resource定位 即寻找用户定义的bean资源,由 ResourceLoader通过统一的接口Resource接口来完成 beanDefinition载入 BeanDefinitionReader读取、解析Resource定位的资源 成BeanDefinition 载入到ioc中(通过HashMap进行维护BD) BeanDefinition注册 即向IOC容器注册这些BeanDefinition, 通过BeanDefinitionRegistery实现

BeanDefinition加载流程?
定义BeanDefinitionReader解析xml的document BeanDefinitionDocumentReader解析document成beanDefinition

DI依赖注入流程? (实例化,处理Bean之间的依赖关系)
过程在Ioc初始化后,依赖注入的过程是用户第一次向IoC容器索要Bean时触发

如果设置lazy-init=true,会在第一次getBean的时候才初始化bean, lazy-init=false,会容器启动的时候直接初始化(singleton bean);

调用BeanFactory.getBean()生成bean的;

生成bean过程运用装饰器模式产生的bean都是beanWrapper(bean的增强);

依赖注入怎么处理bean之间的依赖关系?
其实就是通过在beanDefinition载入时,如果bean有依赖关系,通过占位符来代替,在调用getbean时候,如果遇到占位符,从ioc里获取bean注入到本实例来

Bean的生命周期?
实例化Bean: Ioc容器通过获取BeanDefinition对象中的信息进行实例化,实例化对象被包装在BeanWrapper对象中
设置对象属性(DI):通过BeanWrapper提供的设置属性的接口完成属性依赖注入;
注入Aware接口(BeanFactoryAware, 可以用这个方式来获取其它 Bean,ApplicationContextAware):Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给bean
BeanPostProcessor:自定义的处理(分前置处理和后置处理)
InitializingBean和init-method:执行我们自己定义的初始化方法
使用
destroy:bean的销毁
IOC:控制反转:将对象的创建权,由Spring管理. DI(依赖注入):在Spring创建对象的过程中,把对象依赖的属性注入到类中。
Spring的IOC注入方式有哪几种
构造器注入 setter方法注入 注解注入 接口注入

怎么检测是否存在循环依赖?
Bean在创建的时候可以给该Bean打标,如果递归调用回来发现正在创建中的话,即说明了循环依赖了。

Spring如解决Bean循环依赖问题?
Spring中循环依赖场景有:

构造器的循环依赖
属性的循环依赖
singletonObjects:第一级缓存,里面放置的是实例化好的单例对象; earlySingletonObjects:第二级缓存,里面存放的是提前曝光的单例对象; singletonFactories:第三级缓存,里面存放的是要被实例化的对象的对象工厂
创建bean的时候Spring首先从一级缓存singletonObjects中获取。如果获取不到,并且对象正在创建中,就再从二级缓存earlySingletonObjects中获取,如果还是获取不到就从三级缓存singletonFactories中取(Bean调用构造函数进行实例化后,即使属性还未填充,就可以通过三级缓存向外提前暴露依赖的引用值(提前曝光),根据对象引用能定位到堆中的对象,其原理是基于Java的引用传递),取到后从三级缓存移动到了二级缓存完全初始化之后将自己放入到一级缓存中供其他使用,
因为加入singletonFactories三级缓存的前提是执行了构造器,所以构造器的循环依赖没法解决。
构造器循环依赖解决办法:在构造函数中使用@Lazy注解延迟加载。在注入依赖时,先注入代理对象,当首次使用时再创建对象说明:一种互斥的关系而非层次递进的关系,故称为三个Map而非三级缓存的缘由 完成注入;
Spring 中使用了哪些设计模式?
工厂模式: spring中的BeanFactory就是简单工厂模式的体现,根据传入唯一的标识来获得bean对象;
单例模式: 提供了全局的访问点BeanFactory;
代理模式: AOP功能的原理就使用代理模式(1、JDK动态代理。2、CGLib字节码生成技术代理。)
装饰器模式: 依赖注入就需要使用BeanWrapper;
观察者模式: spring中Observer模式常用的地方是listener的实现。如ApplicationListener。
策略模式: Bean的实例化的时候决定采用何种方式初始化bean实例(反射或者CGLIB动态字节码生成)

AOP 核心概念
1.切面(aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象
2.横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点。
3.连接点(joinpoint):被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在Spring 中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。
4.切入点(pointcut):对连接点进行拦截的定义
5.通知(advice):所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类。
6.目标对象:代理的目标对象
7.织入(weave):将切面应用到目标对象并导致代理对象创建的过程
8.引入(introduction):在不修改代码的前提下,引入可以在运行期为类动态地添加方法或字段。

解释一下AOP
传统oop开发代码逻辑自上而下的,这个过程中会产生一些横切性问题,这些问题与我们主业务逻辑关系不大,会散落在代码的各个地方,造成难以维护,aop思想就是把业务逻辑与横切的问题进行分离,达到解耦的目的,提高代码重用性和开发效率;

AOP 主要应用场景有:
记录日志
监控性能
权限控制
事务管理
线程池关闭等
AOP源码分析
@EnableAspectJAutoProxy给容器(beanFactory)中注册一个AnnotationAwareAspectJAutoProxyCreator对象;
AnnotationAwareAspectJAutoProxyCreator对目标对象进行代理对象的创建,对象内部,是封装JDK和CGlib两个技术,实现动态代理对象创建的(创建代理对象过程中,会先创建一个代理工厂,获取到所有的增强器(通知方法),将这些增强器和目标类注入代理工厂,再用代理工厂创建对象);
代理对象执行目标方法,得到目标方法的拦截器链,利用拦截器的链式机制,依次进入每一个拦截器进行执行
AOP使用哪种动态代理?
当bean的是实现中存在接口或者是Proxy的子类,—jdk动态代理;不存在接口,spring会采用CGLIB来生成代理对象;
JDK 动态代理主要涉及到 java.lang.reflect 包中的两个类:Proxy 和 InvocationHandler。
Proxy 利用 InvocationHandler(定义横切逻辑) 接口动态创建 目标类的代理对象。
什么是jdk动态代理
通过bind方法建立代理与真实对象关系,通过Proxy.newProxyInstance(target)生成代理对象
代理对象通过反射invoke方法实现调用真实对象的方法
动态代理与静态代理区别
静态代理,程序运行前代理类的.class文件就存在了;
动态代理:在程序运行时利用反射动态创建代理对象<复用性,易用性,更加集中都调用invoke>
CGLIB与JDK动态代理区别
Jdk必须提供接口才能使用;
CGLIB不需要,只要一个非抽象类就能实现动态代理

Spring框架及七大模块相关推荐

  1. horizon服务主要模块_openstack七大模块概述

    前言 OpenStack主要由七部分组成,分别是Identify, Image, Network, Compute, Block Storage, Object Storage, Dashboard, ...

  2. 一、初识 Spring 框架

    文章目录 一.Spring 简介 二.Spring 框架的优点 三.Spring 框架的组成 四.Spring 框架 学习路线 一.Spring 简介 Spring 框架简介 2004年3月24日发布 ...

  3. spring学习12 -Spring 框架模块以及面试常见问题注解等

    以下为spring常见面试问题: 1.Spring 框架中都用到了哪些设计模式? Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式-在AOP和remoting中被用的比较 ...

  4. 一文带你了解Spring框架的基本使用

    Spring作为企业Java最流行的应用程序开发框架,已经被数以百万计的世界各地的开发人员使用,Spring框架用来创建高性能,易于测试的,可重用的代码.是一个开源的Java平台,它最初是由Rod J ...

  5. Spring框架核心之(一)Spring简介

                                                            Spring简介 一.什么是Spring Spring是一个轻量级开源框架,他是一个基于 ...

  6. 初识Spring框架

    1,what is the Spring frame?有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础 ...

  7. Spring 系列: Spring 框架简介

    Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. 在这篇由三部 ...

  8. Java教程分享:使用Spring框架能带来哪些好处?

    Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发. Spring框架本身亦 ...

  9. spring框架_一篇文章带你理解Spring框架

    虽然现在流行用SpringBoot了,很多配置已经简化和封装了,但是对于Spring的一些基础我们了解一些是对我们自己的架构思想很有帮助的!接下来和笔者一起来探讨一下Spring框架吧! 1.什么是S ...

最新文章

  1. 利用frp进行内网穿透
  2. MySQL存储过程使用游标循环数据列表
  3. can-utils源码解析cansend
  4. node 安装 webpack
  5. hdu 1045 Fire Net
  6. python统计词频瓦尔登湖_1.5 python文件操作
  7. LiveVideoStack线上分享第四季(九):360视频云Web前端HEVC播放器实践剖析
  8. 【tool】番茄时间管理法
  9. win10如何在不同窗口切换
  10. 记录:Base64编码步骤详解
  11. C语言异或运算逆运算,异或的逆运算
  12. OpenCV的区域分割、轮廓检测和阈值处理
  13. 融跃教育登陆湖南卫视!揭秘融跃是个什么样机构!CFA/FRM/ACCA
  14. 【CSS】字体、行高、文本对齐
  15. 低通滤波器对实际控制系统的作用
  16. 20款可嵌入网站和博客的免费音频播放器
  17. python中db是什么意思_python_面试题_DB相关问题
  18. outlook删除特定年份邮件_Outlook中删除只保留30天邮件文件夹
  19. rust第三人称视角插件_一个第三人称游戏相机的实现(基于rust语言和cgmath库)...
  20. C++ 实现俄罗斯方块!!!

热门文章

  1. imovie打开视频卡死解决办法
  2. 一张图看清自然语言处理脉络
  3. fast rcnn 论文解读(附代码链接)
  4. 4由通道检测_博唐平四通道糖化血红蛋白检测仪通过上海临检中心性能验证(二)...
  5. 使用vscode连接阿里云服务器报错: ssh: Could not resolve hostname Name or service not known
  6. 利用CSS使元素在水平方向或水平,竖直同时居中
  7. 设备巡检app android开发,富士康移动巡检app安卓,富士康移动巡检app安卓手机软件预约 v1.0-手游汇...
  8. linux定制环境变量,定制Linux系统环境变量.doc
  9. html载入图片代码,TextVeiw加载HTML代码块内图片
  10. 两个iphone怎么大量传照片_「唯物」传个视频到 iPhone,有了新方法