【剑指 Java】第 4 弹:绝对硬货,Spring 面试知识点总结大全

本文详细介绍了Spring框架中的Bean作用域(单例、原型、请求和会话)、Bean的生命周期过程,以及四种依赖注入方式(构造器、setter、静态工厂和实例工厂)。同时涵盖了IoC容器的优缺点和AOP(面向切面编程)原理,以及SpringMVC在MVC架构中的应用。
摘要由CSDN通过智能技术生成
  1. 根据上一步中生成的 Bean 配置注册表来实例化 Bean,并装配好 Bean 之间的依赖关系;

  2. 将实例化后的 Bean 装载到 Spring 容器中的 Bean 缓存池中,供上层的应用程序使用;

4.3 Spring Bean 的作用域及生命周期

4.3.1 作用域

Spring 中,用来组成应用程序的主体以及由 Spring IoC 容器所管理的对象叫做 Bean。简而言之,Bean 就是由 IoC 容器来进行初始化、装配和管理的对象。

Bean 的作用域主要有如下几种:

  1. Singleton(单例)

作用域为 Singleton该模式在多线程下不安全,表明 IoC 容器中只会存在一个共享 Bean 实例,而且所有对 Bean 的请求,主要 id 和该 Bean 定义相匹配,那么就会返回 Bean 的同一实例。Singleton 是单例模型,即在从创建容器的同时就会自动创建一个 Bean 的对象,无论是否使用,而且 每次获取到的对象都是同一对象

  1. Prototype(原型):每次创建时使用

作用域为 Prototype,表明一个 Bean 定义对应多个实例,该作用域中的 Bean 会导致在 每次对该 Bean 请求时均创建一个新的 Bean 实例Prototype 是一个原型类型,在我们创建容器时并未实例化,而是当我们获取 Bean 时才去创建一个对象,而且每次获取到的对象都不一样。

  1. Request:一次 request 一个实例

作用域为 Request表明在一次 HTTP 请求中,容器返回该 Bean 的同一个实例,即每个 HTTP 请求均有各自的 Bean 实例,依据某个 Bean 定义创建而成,只在基于 Web 的 Spring ApplicationContext 情形下有效。当一次 HTTP 请求处理结束时,该作用域中的 Bean 实例均被销毁。

  1. Session

作用域为 Session ,表明 在一个 HTTP Session 中,容器返回该 Bean 的同一个实例,对不同的 Session 请求则创建新的实例,该 Bean 实例仅在当前 Session 内有效,只在基于 Web 的 Spring ApplicationContext 情形下有效。当一个 HTTP Session 被废弃时,在该作用域内的 Bean 也将失效。

| 作用域类别 | 说明 |

| — | — |

| Singleton | Spring IoC 容器中仅存在一个 Bean 实例,以单例方式存在,是 Spring 中的默认值 |

| Prototype | 每次从容器中调用 Bean 时,均返回一个新的实例,即每次调用 getBean() 方法,相当于 new 一个新的对象 |

| Request | 每次 HTTP 请求均创建一个新的 Bean,仅适用于 WebApplicationContext 环境 |

| Session | 每次 HTTP Session 共享一个 Bean,不同 Session 使用不同的 Bean,仅适用于 WebApplicationContext 环境 |

4.3.2 生命周期
  1. Spring 对 Bean 进行实例化;

  2. Spring 将值和 Bean 的引用注入到 Bean 对应属性中;

  3. 若 Bean 实现了 BeanNameAware 接口,则 Spring 将 Bean 的 ID 传递给 setBeanName() 方法;

  4. 若 Bean 实现了 BeanFactoryAware 接口,Spring 将调用 setBeanFactory() 方法,将 Bean 所在应用引用传入进来;

  5. 若 Bean 实现了 ApplicationContextAware 接口,Spring 将调用 setApplicationContext() 方法,将 Bean 所在应用的引用传入进来;

  6. 若 Bean 实现了 BeanPostProcessor 接口,Spring 将调用 post-ProcessBeforeInitalization() 方法;

  7. 若 Bean 实现了 InitializingBean 接口,Spring 将调用他们的 after-PropertiesSet() 方法,类似地,如果 Bean 使用 init-method 声明了初始化方法,则该方法也会被调用;

  8. 若 Bean 实现了 BeanPostProcessor 接口,Spring 将调用他们的 post-ProcessAfterInitialization() 方法;

  9. 此时,Bean 已经准备就绪,我们就可以被应用程序使用,他们将一直驻留在应用上下文中,直到该应用被销毁;

  10. 若 Bean 实现了 DisposableBean 接口,Spring 将调用它的 destory() 接口方法;同样,若 Bean 使用 destroy-method 声明了销毁方法,该方法也将被调用;

4.4 Spring 依赖注入的四种方式

  1. 构造器注入

// 带参,方便用构造器进行注入

public CatDaoImpl(String name){

this.name = name;

}

  1. setter 方法注入

public class Id {

private int id;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

}

  1. 静态工厂注入

所谓静态工厂就是通过调用静态工厂的方法来获取自己所需对象,而且为了方便 Spring 管理,我们不能通过 “类.静态方法()” 来获取对象,而应该通过 Spring 注入的形式;

// 静态工厂

public class DaoFactory {

public static final FactoryDao getStaticFactoryDaoImpl(){

return new StaticFacotryDaoImpl();

}

}

public class SpringAction {

// 需要注入的对象

private FactoryDao staticFactoryDao;

// 注入对象的 set 方法

public void setStaticFactoryDao(FactoryDao staticFactoryDao) {

this.staticFactoryDao = staticFactoryDao;

}

}

  1. 实例工厂

实例工厂表示获取对象实例的方法不是静态的,所以需要先 new 工厂类,然后再调用普通的实例方法;

// 实例工厂

public class DaoFactory {

public FactoryDao getFactoryDaoImpl(){

return new FactoryDaoImpl();

}

}

public class SpringAction {

// 注入对象

private FactoryDao factoryDao;

public void setFactoryDao(FactoryDao factoryDao) {

this.factoryDao = factoryDao;

}

}

4.5 Spring 自动装配方式

要实现自动装配,主要从如下两个角度来进行实现:

  1. 组件扫描(Component Scanning):Spring 会自动发现应用上下文中所创建的 Bean;

  2. 自动装配(Autowiring):Spring 自动满足 Bean 之间的依赖;

Spring 装配包括 手动转配和自动装配手动装配是通过 XML 装配、构造方法、setter 方法等方式;

而自动装配有如下几种,使得 Spring 容器通过自动装配方式来进行依赖注入;

| 装配方式 | 说明 |

| — | — |

| no | 默认不进行自动装配,通过显式设置 ref 属性来进行装配 |

| byName | 通过参数名自动装配,Spring 容器在配置文件中发现 Beanautowire 属性被设置为 byName 后试图匹配、装载和该 Bean 的属性具有相同名字的 Bean |

| byType | 通过参数类型自动装配,Spring 容器在配置文件中发现 Beanautowire 属性被设置为 byType 后试图匹配、装载和该 Bean 的属性具有相同了类型的 Bean,若发现多个 Bean 符合条件,则抛出错误 |

| constructor | 类似于 byType,但需要提供给构造器参数,若无固定的带参的构造器参数类型,则抛出异常 |

| autodetect | 首先尝试使用 constructor 来自动装配,若无法工作,则使用 byType 方式 |

4.6 IoC 的优缺点

  1. 优点:组件之间的解耦,提高程序可维护性、灵活性;

  2. 缺点:创建对象步骤复杂,有一定学习成本;利用反射创建对象,效率会降低;

5. AOP 原理


5.1 定义

即剖开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为 Aspect即切面。所谓切面即 与业务无关,但被业务模块所公用的逻辑,便于减少系统的重复代码,降低模块间的耦合度,利于后续的可操作性和可维护性

通过使用横切,AOP 将软件切分为:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与横切关注点关系不大。横切关注点的特点是经常发生在核心关注点的多处,且各处基本相似。AOP 的作用就在于 分离系统中的各种关注点,将核心关注点和横切关注点分离开

5.2 核心概念

5.3 AOP 的两种代理方式

Spring 提供了两种方式来生成代理对象:JDK Proxy 和 CGlib,默认的策略是如果目标类是接口,则使用 JDK 动态代理技术,否则使用 CGlib 来生成代理

  1. JDK 动态接口代理

主要涉及 ProxyInvocationHandlerInvocationHandler 是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态地将横切逻辑与业务逻辑编制在一起。而 Proxy 则利用 InvocationHandler 动态创建一个符合某一接口的实例,生成目标类的代理对象;

  1. CGlib 动态代理

全称 Code Generation Library是一个高性能高质量的代码生成类库,能在运行期间扩展 Java 类与实现 Java 接口。 CGlib 封装了 ASM,能在运行期间动态生成新的类。

  1. JDK 动态代理和 CGlib 动态代理的区别

JDK 动态代理只能为接口创建代理实例,而对于没有通过接口定义业务方法的类,则需要通过 CGlib 创建动态代理;

5.4 切面的通知类型

  1. 前置通知(Before):目标方法在被调用前调用通知;

  2. 后置通知(After):目标方法完成后调用通知;

  3. 返回通知(After-returning):目标方法成功执行之后调用通知;

  4. 异常通知(After-throwing):目标方法抛出异常后调用通知;

  5. 环绕通知(Around):在被通知的方法调用之前和调用之后执行自定义的行为;

6. Spring MVC


6.1 什么是 MVC 框架?

MVC,全称 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范。用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件中,然后在改进和个性化定制界面及用户交互的同时,不用重写业务逻辑;

采用 MVC 设计模式主要有如下好处:

  1. 通过分层设计,实现了业务系统各组件之间的结构,有利于业务系统的可扩展性和可维护性;

  2. 有利于系统的并行开发,提升开发效率;

6.2 SpringMVC

6.2.1 定义

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后我们该如何学习?

1、看视频进行系统学习

这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。

另外,我自己也珍藏了好几套视频资料躺在网盘里,有需要的我也可以分享给你:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

2、读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

Spring源码深度解析:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Mybatis 3源码深度解析:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Redis学习笔记:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Spring Boot核心技术-笔记:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

3、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。

人生短暂,别稀里糊涂的活一辈子,不要将就。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
edis学习笔记:

[外链图片转存中…(img-STXj5LGZ-1713544979308)]

Spring Boot核心技术-笔记:

[外链图片转存中…(img-hudISImP-1713544979310)]

3、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

[外链图片转存中…(img-DjRh1OJG-1713544979311)]

只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。

人生短暂,别稀里糊涂的活一辈子,不要将就。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值