SpringBoot面试总结整理

1.Spring的IOC和AOP怎么理解

  • IoC,英文全称Inversion of Control,意为控制反转
  • AOP,英文全称Aspect-Oriented Programming,意为面向切面编程

Spring核心容器的主要组件是Bean工厂(BeanFactory),Bean工厂使用控制反转(IoC)模式来降低程序代码之间的耦合度,并提供了面向切面编程(AOP)的实现。


IoC

控制反转,局势创建对象的控制权,被反转到了Spring框架下。因为通常实例化一个对象,都是new一个对象,但是控制反转就能够使Spring容器去new一个对象

依赖注入DI

由IoC容器动态地将某个对象所需要的外部资源,注入到组件(Controller, Service等)之中

四种注入方式(Java实现3中依赖注入)

  • 注解
  • set
  • 构造器
  • 静态工厂

装配Bean可以基于注解注入方式@Autowired与@Resource

  • @Autowired默认按类型进行自动装配(该注解属于Spring)

    根据类型,默认情况下要求依赖的对象要存在,就需要@Autowired(required=false)
    如果想结合名称装配,可以使用@Qualifier

    @Autowired
    @Qualifier("adminService")
    private AdminService adminService;
    

如,同一个接口,两个实现类,就可以使用该方式指定注入。

  • @Resource默认按照名称进行装配(该注解属于J2EE)

    @Resource(name = "adminService")
    private AdminService adminService;
    

@Resource装配顺序(优先按照名称)

  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

AOP

比如业务A和业务B现在需要一个相同的操作,传统方法我们可能需要在A、B中都加入相关操作代码,而应用AOP就可以只写一遍代码,A、B共用这段代码。并且,当A、B需要增加新的操作时, 可以在不改动原代码的情况下,灵活添加新的业务逻辑实现。

AOP主要一般应用于签名验签、参数校验、日志记录、事务控制、权限控制、性能统计、异常处理等

切面@Aspect

  • 共有功能的实现,一个存放共有功能实现的标准Java类。

当Java类使用了@Aspect注解修饰时,就能被AOP容器识别为切面

通知

  • 切面(共有功能)的具体实现,就是要给目标对象织入的事情。

根据放置的地方不同,分为前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)与环绕通知(Around)5种。

连接点

  • 程序在运行过程中能够定义插入切面(共有功能)的地点

一个类的所有方法前、后、抛出异常时等都是连接点。

切入点

  • 用于定义具体实现应该切入到哪些连接点上。

比如,在上面所说的连接点的基础上,来定义切入点。我们有一个类,类里有10个方法,那就产生了几十个连接点。但是我们并不想在所有方法上都织入通知,因此切点才是我们真正需要切入通知的的地方。

目标对象

  • 即将切入切面的对象

代理对象

  • 被动态创建的对象

可以简单地理解为,代理对象的功能等于目标对象本身业务逻辑加上共有功能。代理对象就是,目标对象被织入共有功能后产生的对象。

比如:购买记录日志 = 购买记录 + 日志记录


2.Spring项目启动的时候会加载哪些资源,顺序是怎么样的

Spring

  1. 加载spring上下文
SpringApplicationContextUtils.initApplicationContext(event.getServletContext());
  1. 加载配置文件
properties.load(sct.getResourceAsStream("/WEB-INF/conf/comms.properties"));
  1. 加载缓存
cacheManager = (CacheManager)SpringApplicationContextUtils.getBean(EsbUtils.CACHEMANAGER);
cacheManager.loadAllCache();

public class CacheManager 中定义定时线程池,1个线程

SpringBoot

那么SpringBoot项目启动的时候发生了什么?

  1. 根据入口类,也就是@SpringBootApplication标识的类,自动加载需要扫描指定的包中的类进行加载
  2. 检测其他的类上是否存在组件类的注解,例如@Component,@Controller,@Service ,如果有就交给BeanFactory实现此类对象
  3. 基于类的作用域描述,将实例存储到不同作用域的容器中。

3.Spring中BeanFactory和ApplicationContext的区别

BeanFactory

访问Spring bean容器的根接口,定义获取bean及bean的各种属性。

BeanFactory 只能管理单例(Singleton)Bean 的生命周期

ApplicationContext

ApplicationContext为整个应用程序提供了核心配置

1、继承了ListableBeanFactory具有beanfactory的的工厂方法
2、继承ResourceLoader使其具有以通用方式加载资源文件的能力
3、继承ApplicationEventPublisher使其具有事件传播能力
4、具有标准的管理bean生命周期的能力
5、。。。

比较

  • BeanFactroy采用的是延迟加载形式来注入Bean,就是用到,才会对bean加载实例化,可能会存在一些配置问题。
  • 而ApplicationContext则相反,在容器启动时,一次性创建了所有的Bean,因此当配置很多的bean时,程序启动的比较慢。

因此,BeanFactory主要是面对与 spring 框架的基础设施,面对 spring 自己。而 ApplicationContext 主要面对与Spring 使用的开发者。

基本都会使用 ApplicationContext 并非 BeanFactory。


4.Spring中bean的作用域有哪些,有什么区别

在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean

看到有个说,其实bean实质是一个真正实例的“配方”,根据这个配方,注入不同的依赖,控制对象的作用阈,就可以创建多个实例。

Spring中的bean默认都是单例的

<bean id="user" class="com.lee.xxx "scope="session"/>

singleton :

唯一 bean 实例,Spring 中的 bean 默认都是单例的。

prototype :

每次调用getBean()时,都会创建一个新的 bean 实例。

request :

每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。

session :

同一个Http Session共享一个Bean,不同的Http Session使用不同的Bean,session过期后,bean也会随之过期,该作用域仅适用于WebApplicationContext 环境。

global-session:

全局session作用域,仅仅在基于portlet的web应用中才有意义,在Spring已经没有了。


5.SpringBoot和SpringMVC区别在哪

联系

Spring在刚开始的时候使用依赖注入(DI)和代理模式(AOP)解耦应用组件,进而开发出适用于Web开发的SpringMVC,在实际开发过程当中会使用到很多样板代码,就开发出了懒人版的SpringBoot;

区别

1、SpringMVC是Spring的一个模式,是一个Web框架,提供了一个轻耦合的方式来开发Web应用,涵盖面包括前端视图开发、文件配置、后台接口逻辑开发,但是由于是web开发涉及到数据库xml的操作,服务器的大量配置相对于很繁琐。

2、SpringBoot是习惯优于配置,降低了项目搭建的难度;

3、简化了SpringMVC的配置流程,SpringBoot专注于单体微服务接口开发,和前端解耦。


6.SpringMVC原理

参考:SpringMVC实现原理及详解

核心类是DispatcherServlet

在这里插入图片描述

HandlerMapping:用于handlers映射请求和一系列的对于拦截器的前处理和后处理,大部分用@Controller注解。

HandlerAdapter接口:处理请求映射,通过注解,把请求URL映射到Controller类的方法上。

ViewResolver:根据实际配置解析实际的View类型。

流程说明:

(1)客户端(浏览器)发送请求,直接请求到DispatcherServlet。

(2)DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler。

(3)解析到对应的Handler后,开始由HandlerAdapter适配器处理。

(4)HandlerAdapter会根据Handler来调用真正的处理器开处理请求,并处理相应的业务逻辑。

(5)处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View是个逻辑上的View。

(6)ViewResolver会根据逻辑View查找实际的View。

(7)DispaterServlet把返回的Model传给View。

(8)通过View返回给请求者(浏览器)


7.Spring的AOP和IOC的偏底层实现

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值