Java开发框架和中间件面试题(7)

目录

63.Spring中都应用了哪些设计模式?

64.请举例说明如何在Spring中注入一个Java  Collection?

65.说一下都有哪些基本理念?

67.Spring Bean的生命周期?

68.说说Spring  AOP的实现原理?

69.Spring中事务的实现方式?

70.说说Spring事务的底层原理?

71.Spring依赖注入有哪几种方式?

72.如何防止表单重复提交?

73.说一下Spring MVC的运行流程?

74.SpringMVC启动流程?

75.什么是ORM框架?

76.mybatis中的#和${}的区别是什么?

77.Mybatis是否支持延迟加载?延迟加载的原理是什么?

78.说一下mybatis的一级缓存和二级缓存?

79.mybatis有哪些执行器(Executor)?

80.Mybatis和hibernate的区别有哪些?

81.Mybatis如何根据多个id进行查询?


63.Spring中都应用了哪些设计模式?

  1.简单工厂模式:简单工厂模式的本质就是一个工厂类根据传入的参数,动态的决定实例化哪个类。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象。

2.工厂方法模式:应用程序将对象的创建以及初始化职责交给工厂对象,工厂Bean。定义工厂方法,然后通过config.xml配置文件,将其纳入Spring容器来管理,需要通过factory menthod指定静态方法名称。

3.单例模式:Spring用的是双重判断加锁的单例模式。

4.代理模式:Spring的AOP中,使用的Advice(通知)来增强被代理类的功能。Spring实现AOP功能的原理就是代理模式(①JDK动态代理,②CGlib字节码生成技术代理。)对类进行方法级别的切面增强。

5.装饰器模式:动态的给一个对象添加一些额外的功能。Spring的ApplicationContext中配置所有的DataSource。这些DataSource可能是不同的数据库,然后SessionFactory根据用户的每次请求,将DataSource设置成不同的数据源,以达到切换数据源的目的。在Spring中有两种表现:

   一种是类名中含有Wrapper

   另一种是类名中含有Decorator

6.观察者模式:定义对象间的一对多的关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并自动更新。Spring中观察者模式一般用在listener的实现。

7.策略模式:策略模式是行为性模式,调用不同的方法,适应行为的变化,强调父类的调用子类的特性。getHandler是HandlerMapping接口中唯一方法,用于根据请求找到匹配的处理器。

8.模板方法模式:Spring JdbcTemplate的query方法总体结构是一个模板方法和回调函数,query方法中调用的execute()时一个模板方法,而预期的回调doInStatement(Statement state)方法也是一个模板方法。

64.请举例说明如何在Spring中注入一个Java  Collection?

    1.Spring注入有四种方式:

      set注入,构造器注入,基于注解的注入,xml配置文件注入

   2.可以注入的Java collection集合类如下:

    list,set,map,props:该标签支持注入键和值都是字符串类型的键值对。

  list和set都使用value标签;map使用entry标签;props使用prop标签。

65.说一下都有哪些基本理念?

  1.横切关注点

对哪些方法进行拦截,拦截后怎么处理,这些关注点称为横切关注点;

2.Aspect(切面)通常是一个类,里面可以定义切入点和通知。

3.JointPoint(连接点)程序执行过程中明确的点,一般是方法的调用,被拦截到的点。因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。

4.Advice(通知)AOP在特定的切入点上执行的增强处理,有before(前置),after(后置),afterReturning(最终),afterThrowing(异常),around(环绕)。

5.Pointcut(切入点)带有通知的连接点,在程序中主要体现在书写切入点表达式。

6.weave(织入)将切面应用到目标对象并导致代理对象创建的过程。

7.introduction(引入)在不修改代码的前提下,引入可以在运行期为类动态地增加一些方法或者字段。

8.AOP代理(AOP proxy)AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以是JDK动态代理,也可以是CGlib代理,前者基于接口,后者基于子类。

9.目标对象(Target Object)包含连接点的对象,也被称作被通知或者被代理对象,POJO。

66.说一下AOP的使用场景?

1.Authentication权限

2.Caching缓存

3.Context passing内容传递

4.Error handling 错误处理

5.Lazy  loading懒加载

6.Debugging调试

7.logging,tracing,profiling and monitor记录跟踪,优化,校准

8.Performance   optimization性能优化

9.Persistence持久化

10.Resource  pooling资源池

11.Synchronization同步

12.Transaction事务

67.Spring Bean的生命周期?

Spring bean的生命周期简单易懂。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。

Spring  Bean Factory负责管理在Spring容器中被创建的Bean的生命周期。

bean的生命周期由两组回调(call back)方法组成,初始化之后调用的回调方法。

销毁之前调用的回调方法。

Spring框架提供了以下四种方式来管理bean的生命周期事件。

initializingBean和DisposableBean回调接口

针对特殊行为的其他Aware接口

Bean配置文件中的Custom  init()方法和destroy()方法

@PostConstruct和@PreDestroy注解方式

68.说说Spring  AOP的实现原理?

    Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGlib动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。

   如果目标类没有实现接口,那么Spring AOP会选择使用CGlib来动态代理目标类。CGlib(Code Generation  Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGlib是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么他是无法使用CGlib做动态代理的。

69.Spring中事务的实现方式?

1.编码方式

   所谓编程式事务指的是通过编程方式实现事务,即类似于JDBC编程实现事务管理。

2.声明式事务管理方式

声明式管理又有两种实现方式:基于XML配置文件的方式;另一个是在业务方法上进行@Transaction注解,将事务规则应用到业务逻辑中。

70.说说Spring事务的底层原理?

  1.划分处理单元

IOC由于Spring解决的问题是对单个数据库进行局部事务处理单元。并且将对事务的各种配置放到了IOC容器中(设置事务处理管理器,设置事务的传播特性以及隔离机制)。

2.AOP拦截需要进行事务处理的类Spring事务处理模块是通过AOP功能来实现声明式事务处理的,具体操作(比如事务实行的配置和读取,实物对象的抽象),用TransactionProxyFactoryBean接口来使用AOP功能,生成proxy代理对象,通过TransactionInterceptor完成对代理方法的拦截,将事务处理的功能编织到拦截的方法中。读取IOC容器事务配置属性,转化为Spring事务处理需要的内部数据结构(TransactionAttributeSourceAdvisor),转化为TransactionAttribute表示的数据对象。

3.对事物处理的实现)事务的生成,提交,回滚,挂起)Spring委托给具体的事务处理器实现。实现了一个抽象和适配。适配的具体事务处理器:DataSource数据源支持,hibernate数据源事务处理支持,JDO数据源事务处理支持,JPA,JTA数据源事务处理支持。这些支持都是通过设计PlatformTransactionManager,AbtractPlatforTransaction一系列事务处理的支持。为常用数据源支持提供了一系列的TransactionManager。

4.结合PlatformTransactionManager实现了TransactionInterception接口,让其与TransactionProxyFactoryBean结合起来,形成一个Spring声明式事务处理的设计体系。

71.Spring依赖注入有哪几种方式?

     1.构造器注入

      2.setter方法注入

      3.静态工厂注入

       4.实例工厂注入

72.如何防止表单重复提交?

1.通过JavaScript屏蔽提交按钮(不推荐)

2.给数据库添加唯一键约束

3.利用Session防止表单重复提交(推荐)

4.使用AOP自定义切入实现

73.说一下Spring MVC的运行流程?

 1.SpringMVC将所有的请求都提交给DispatcherServlet,他会委托应用系统的其他模块负责对请求进行真正的处理工作。

2.DispatcherServlet查询到一个或者多个HandlerMapping,找到处理请求的Controller。

3.DispatcherServlet请求提交到目标Controller;

4.Controller进行业务逻辑处理后,会返回一个ModelAndView;

5.Dispathcher查询一个或者多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象。

6.视图对象负责渲染返回给客户端。

74.SpringMVC启动流程?

1.web.xml文件中给Spring MVC的servlet配置了load on startup,所以程序启动的时候会初始化SpringMVC;

2.然后在HttpServletBean中配置的contextConfigLocation属性设置到Servlet中;

3.接着在FrameworkServlet中创建了WebApplicationContext;

4.DispatcherServlet根据contextConfigLocation配置的classpath下的xml文件初始化SpringMVC中的各组件。

75.什么是ORM框架?

  ORM(object  relation  mapping),对象关系映射。是为了解决面向对象与关系型数据库存在的不匹配问题。

ORM框架的优点:

  1.开发效率跟高

  2.数据访问更抽象,轻便

  3.支持面向对象封装

76.mybatis中的#和${}的区别是什么?

   1.#{}带引号,${}不带引号;

   2.#{}可以防止SQL注入;

   3.${}常用于数据库表名,order  by子句;

   一般能用#{}就不要使用${}

77.Mybatis是否支持延迟加载?延迟加载的原理是什么?

   mybatis是否支持延迟加载?延迟加载其实就是讲数据加载时机推迟,比如推迟嵌套查询的时机。延迟加载可以实现先查询主表,按需实时做关联查询,返回关联表结果集,一定程度上提高了效率。mybatis仅支持关联对象association和关联集合对象collection的延迟加载,associatation是一对一,collection是一对多查询,在mybatis配置文件中可以配置lazyloadingEnable=true/false。

   延迟加载的原理是什么?使用CGlib为目标对象建立代理对象,当调用目标对象的方法时进入拦截器方法。

  比如调用a.getB().getName()拦截器方法invoke()发现a.getB()为null,会单独发送事先准备好的查询关联B对象的SQL语句,把B查询出来然后调用a.setB(b),也是a的对象的属性b就有值了,然后调用getName(),这就是延迟加载的原理。

78.说一下mybatis的一级缓存和二级缓存?

   一级缓存是session级别的缓存,默认开启,当查询一次数据库时,对查询结果进行缓存,如果之后的查询在一级缓存中存在,则无需再访问数据库。

   二级缓存是sessionFactory级别的缓存,需要配置才会开启。当进行SQL语句查询时,先查看一级缓存,如果不存在,访问二级缓存,降低数据库访问压力。

79.mybatis有哪些执行器(Executor)?

1.mybatis有三种基本的Excutor执行器:

   1.1SimpleExecutor,每执行一次update或者select,就开启一个Statement对象,用完立刻关闭Statement。

   1.2PauseEcecutor,执行update或者select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而且放置于Map内,供下一次使用。简言之,就是重复使用Statement对象。

   1.3BatchExecutor,执行update,将所有SQL通过addBatch()都添加到批处理中,等待统一执行executeBatch().他缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一executeBatch()批处理。与JDBC批处理相同。

  2.作用范围Executor的这些特点,都严格限制在SqlSession生命周期范围内。

  3.Mybatis中如何指定使用哪一种Excutor执行器?在mybatis的配置文件中,可以指定默认的ExcutorType执行器类型,也可以手动给DefaultSqlSessionFactory的创建SqlSession的方法传递ExecutorType类型参数。

80.Mybatis和hibernate的区别有哪些?

1.两者最大的区别

针对简单逻辑,都有对应的代码生成工具,可以生成简单基本的dao层方法;针对高级查询,Mybatis要手动编写SQL语句和resultMap,而hibernate有良好的映射机制;

2.开发难度对比

hibernate>mybatis

3.日志统计

hibernate有自己的日志统计功能,而Mybatis需要借助log4j来记录日志。

4.数据库扩展比较

hibernate>mybatis

5.缓存机制比较,因为hibernate对查询对象有良好的管理机制,用户无需关心sql,所以使用二级缓存如果出现脏数据,系统会报错。而Mybatis,如果不能获取最新数据,应该避免缓存的使用,脏数据的出现会给系统的正常运行带来很大的隐患。

6.如何选择Mybatis需要编写SQL和映射规则,工作量大于hibernate;Mybatis支持的工具也有限,不能像hibernate那样有许多插件可以帮助生成映射代码和关联关系;对于性能要求不太苛刻的系统,比如管理系统,ERP等推荐hibernate;对于性能要求高,响应快,灵活的系统,比如电商系统,推荐使用Mybatis;

81.Mybatis如何根据多个id进行查询?

    根据多个id进行查询的示例代码如下所示:

    Page  getUserListByIds(@Param("ids")  List ids);

      select  *   from  student    where   id   in   #{userid}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/585103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3导入excel并解析excel数据渲染到表格中,纯前端实现。

需求 用户将已有的excel上传到系统,并将excel数据同步到页面的表格中进行二次编辑,由于excel数据不是最终数据,只是批量的一个初始模板,后端不需要存储,所以该功能由前端独立完成。 吐槽 系统中文件上传下载预览三部…

在pytorch中,读取GPU上张量的数值 (数据从GPU到CPU) 的几种常用方法

1、.cpu() 方法: 使用 .cpu() 方法可以将张量从 GPU 移动到 CPU。这是一种简便的方法,常用于在进行 CPU 上的操作之前将数据从 GPU 取回 import torch# 在 GPU 上创建一个张量 gpu_tensor torch.tensor([1, 2, 3], devicecuda)# 将 GPU 上的张…

AI赋能金融创新:技术驱动的未来金融革命

人工智能(AI)作为一种技术手段,正逐渐改变金融行业的方方面面。从风险管理到客户体验,从交易执行到反欺诈,AI带来了许多创新和机遇。本文将探讨AI在金融领域的应用和其赋能的金融创新。 金融领域一直以来都面临着复杂的…

QT UI自动化测试(1)

一、框架选择 想结合公司产品搭建一套自动化测试框架,一方面自己学习用,一方面也希望跟公司业务结合起来,双赢。公司软件最多的产品是部署在Linux系统上,基于QT QML开发的UI,本来奔着免费的自动化框架去的,…

编写html的vscode快捷键

一快速生成 按住!(英文的),回车。 二快捷键 1.代码格式化 用来对齐标签。整理代码,强迫症患者必备。 shiftaltf 2.快速移动一行 altdown altup 向上或向下移动一行 3.快速复制一行代码 ShiftAltUp ShiftAltDown 4.快速保存 Ctrl S 5.快速查…

ViT的极简pytorch实现及其即插即用

先放一张ViT的网络图 可以看到是把图像分割成小块,像NLP的句子那样按顺序进入transformer,经过MLP后,输出类别。每个小块是16x16,进入Linear Projection of Flattened Patches, 在每个的开头加上cls token和位置信息,…

C++项目之酒店客房管理系统架构——设计模式应用场景详解(上)

在C++酒店客房管理系统中,可以使用以下设计模式来架构程序: 1. 单例模式(Singleton Pattern):用于确保系统中只有一个客房管理系统实例。这样可以确保整个系统中只有一个唯一的实例,方便管理和控制。 通过私有的构造函数和静态的getInstance方法来控制实例的创建。getI…

Mysql5.7主从数据库同步失败(日记文件错误)解决记录

记录一次Mysql主从数据库同步失败(日记文件错误)解决记录 查看同步状态: 具体错误: 检查mysql数据库日记 2021-06-10T03:45:43.522398Z 1 [ERROR] Error reading packet from server for channel : event read from binlog did not pass crc check; the…

Oracle 拼接字符串

语法 使用||拼接如果内容中有单引号,则可在该单引号前面再加一个单引号进行转义 例子 比如有一个业务是根据需要生成多条插入语句 select insert into des_account_des_role(des_account_id, roles_id) values( || id || , || (select id from des_role where wo…

Ps:八大混合模式及其在色彩渲染上的运用

在所有的图层混合模式中,有八种比较特别。 特别之处在于,其它的混合模式在修改图层的“不透明度”或“填充”时,效果是一样的。 而这八种混合模式使用“填充”比使用“不透明度”可带来更好的效果,有时甚至可以说是惊艳。 提示&am…

ubuntu下编译obs-studio遇到的问题记录

参考的是这篇文档:Build Instructions For Linux obsproject/obs-studio Wiki GitHub 在安装OBS dependencies时, sudo apt install libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev libswresample-dev libswscale-d…

[ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择

文章目录 一、前言二、Amazon SNS 服务(Amazon Simple Notification Service)三、Amazon SQS 服务(Amazon Simple Queue Service)四、SNS 与 SQS 的区别(本文重点)4.1 基于推送和轮询区别4.2 消费者数量对应…

HBuilder常用的快捷键

查看专栏目录 Network 灰鸽宝典专栏主要关注服务器的配置,前后端开发环境的配置,编辑器的配置,网络服务的配置,网络命令的应用与配置,windows常见问题的解决等。 文章目录 常用快捷键分9项快捷键1.文件(4)2.编辑(13)3.…

网络安全应急响应工具之-流量安全取证NetworkMiner

在前面的一些文章中,用了很多的章节介绍流量分析和捕获工具wireshark。Wireshark是一款通用的网络协议分析工具,非常强大,关于wireshark的更多介绍,请关注专栏,wireshark从入门到精通。本文将介绍一个专注于网络流量取…

计算机网络【DHCP动态主机配置协议】

DHCP 出现 电脑或手机需要 IP 地址才能上网。大刘有两台电脑和两台手机,小美有一台笔记本电脑、一台平板电脑和两台手机,老王、阿丽、敏敏也有几台终端设备。如果为每台设备手动配置 IP 地址,那会非常繁琐,一点儿也不方便。特别是…

华为OD机试 - 路口最短时间问题(Java JS Python C)

题目描述 假定街道是棋盘型的,每格距离相等,车辆通过每格街道需要时间均为 timePerRoad; 街道的街口(交叉点)有交通灯,灯的周期 T(=lights[row][col])各不相同; 车辆可直行、左转和右转,其中直行和左转需要等相应 T 时间的交通灯才可通行,右转无需等待。 现给出…

k8s:kubernets

自动部署、自动扩展和管理的容器化部署的应用程序的一个开源系统 k8s负责自动化运维管理多个容器化程序的集群,是一个功能强大的容器编排工具 可以以分布式和集群化的方式进行容器管理 1.18版本,目前最多的是1.20版本,最新的是1.29版本&am…

Java IDEA JUnit 单元测试

JUnit是一个开源的 Java 单元测试框架,它使得组织和运行测试代码变得非常简单,利用JUnit可以轻松地编写和执行单元测试,并且可以清楚地看到哪些测试成功,哪些失败 JUnit 还提供了生成测试报告的功能,报告不仅包含测试…

什么是PD快充诱骗芯片?它的原理是什么?

PD快充诱骗芯片,顾名思义,就是通过LDR6328Q PD取电芯片把pd适配器的电压给诱骗出来固定给后端设备供电。 PD诱骗芯片是受电端的一种PD协议芯片,它内置了PD通讯模块,通过与供电端(如PD充电器)的PD协议芯片握…

SpringCloud实战之Feign 2.x 迁移到 4.x

从官方文档中去发现变化的点: 官方关于Okhttp from 3.x to 4.x 官方关于Spring-cloudfeign from 2.2.x 官方关于Spring-cloudfeign from 4.1.x spring-cloud-openfeign 变化对比 如何引入feign?如何加载feign?如何申明一个client?关于load-balancer关…