嘘,助你一臂之力,快来瞧瞧这份-Spring-面试小抄!

  1. 若 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 容器通过自动装配方式来进行依赖注入;

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 定义

Spring MVC 是 Spring 框架的一个模块,一个基于 MVC 的框架;

6.2.2 组件
  1. DispatcherServlet:核心组件,前端控制器,也叫中央控制器,由它来调度相关组件,用于接收请求、响应结果,相当于转发器,有了 DispatcherServlet 就减少了其他组件之间的耦合度
  2. HandlerMapping:处理器映射器,根据 URL 路径映射到不同的 Handler
  3. HandlerAdapter:处理器适配器,按照 HandlerAdapter 的规则来执行 Handler
  4. Handler:处理器,由我们自己根据业务进行开发;
  5. ViewResolver:视图解析器,将逻辑视图解析成具体的视图;
  6. View:一个接口,支持不同的视图类型;
6.2.3 MVC 工作流程
  1. 浏览器发送请求,前端控制区 DispatcherServlet 拦截该请求;
  2. DispatcherServlet 拦截到请求后,对请求 URL 进行解析,得到请求资源标识符 URI,根据 URI 调用 HandlerMapping 后获取对应 Handler
  3. DispatcherServlet 拿到 Handler 之后,找到 HandlerAdapter ,通过它来访问 Handler,并执行处理器;
  4. 执行 Handler 的逻辑,返回一个 ModelAndView 对象给 DispatcherServlet
  5. 然后 DispatcherServlet 请求 ViewResolver 解析视图,根据逻辑视图名解析真正的 View
  6. 然后 ViewResolver 将解析后的 View 返回给 DispatcherServlet,然后对 View 进行渲染;
  7. 然后由 DispatcherServlet 响应视图给浏览器;
6.2.4 SpringMVC 的优点
  1. 具有 Spring 的特性;
  2. 支持多种视图;
  3. 配置方便,非侵入;
  4. 分层更加清晰,利于团队开发的代码维护,以及可读性好;

6.3 注解

6.3.1 注解原理

注解本质上是一个集成了 Annotation 的特殊接口,其具体实现类是 Java 运行时生成的动态代理类。通过反射获取注解时,返回的是 Java 运行时生成的动态代理对象。通过代理对象调用自定义注解的方法,将最终调用 AnnotationInvocationHandlerinvoke 方法,然后该方法从 memberValuesMap 中索引出对应的值;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

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

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

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

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

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

img

最后

这份《“java高分面试指南”-25分类227页1000+题50w+字解析》同样可分享给有需要的朋友,感兴趣的伙伴们可挑战一下自我,在不看答案解析的情况,测试测试自己的解题水平,这样也能达到事半功倍的效果!(好东西要大家一起看才香)

image

image

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
能达到事半功倍的效果!(好东西要大家一起看才香)

[外链图片转存中…(img-O8W8y5Ae-1713596996148)]

[外链图片转存中…(img-bF1kCf9W-1713596996149)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值