趣文网 > 作文大全

工作3年 去参加大厂面试Java开发 结果被Spring问自闭了……

2020-12-04 04:15:01
相关推荐

前言:

又到了金九银十的日子,前几天好朋友发来喜讯,跳槽一个月了,面试了有二十家公司,在面试官的狂轰滥炸下终于拿到了不错的offer。但是比较可惜的是朋友内推的大厂面试失败了,而且还是在Spring上,就令人挺无语的。他说本来以为大厂的面试会问一下高并发线程组件方面的知识,所以就着重看了一下这些,没想到栽倒了Spring上,真是太惨了!

所以今天就总结一下几个关于Spring的高频面试题,比如:SpringAOP和aspectJ AOP有什么区别?springbean的生命周期?事务控制等,希望对大家有所帮助。

IOC

IOC(Inversion Of Controll,控制反转)是一种设计思想,将原本在程序中手动创建对象的控制权,交由给Spring框架来管理。IOC容器是Spring用来实现IOC的载体,IOC容器实际上就是一个Map(key, value),Map中存放的是各种对象。

这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。IOC容器就像是一个工厂,当需要创建一个对象,只需要配置好配置文件/注解即可,不用考虑对象是如何被创建出来的,大大增加了项目的可维护性且降低了开发难度。

AOP

AOP(Aspect-Oriented Programming,面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可扩展性和可维护性。使用AOP之后我们可以把一些通用功能抽象出来,在需要用到的地方直接使用即可,这样可以大大简化代码量,提高了系统的扩展性。

Spring AOP是基于动态代理的,如果要代理的对象实现了某个接口,那么Spring AOP就会使用JDK动态代理去创建代理对象;而对于没有实现接口的对象,就无法使用JDK动态代理,转而使用CGlib动态代理生成一个被代理对象的子类来作为代理。

Spring AOP / AspectJ AOP 的区别?

Spring AOP属于运行时增强,而AspectJ是编译时增强。

Spring AOP基于代理(Proxying),而AspectJ基于字节码操作(Bytecode Manipulation)。

AspectJ相比于Spring AOP功能更加强大,但是Spring AOP相对来说更简单。如果切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择AspectJ,它比SpringAOP快很多。

Spring框架中都用到了哪些设计模式?

代理模式:在AOP和remoting中被用得比较多。单例模式:在spring配置文件中定义的bean默认为单例模式。模板方法模式:用来解决代码重复的问题。前端控制器模式:Spring提供了DispatcherServlet来对请求进行分发。依赖注入模式:贯穿于BeanFactory / ApplicationContext接口的核心理念。工厂模式:BeanFactory用来创建对象的实例。Spring MVC的核心是什么,请求的流程是怎么处理的,控制反转怎么实现的

核心:控制反转和面向切面

请求处理流程:

首先用户发送请求到前端控制器,前端控制器根据请求信息(如URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个ModelAndView(模型数据和逻辑视图名);前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;前端控制器再次收回控制权,将响应返回给用户。控制反转如何实现:

我们每次使用spring框架都要配置xml文件,这个xml配置了bean的id和class。spring中默认的bean为单实例模式,通过bean的class引用反射机制可以创建这个实例。因此,spring框架通过反射替我们创建好了实例并且替我们维护他们。A需要引用B类,spring框架就会通过xml把B实例的引用传给了A的成员变量。

你用过哪些重要的 Spring 注解?

@Controller - 用于 Spring MVC 项目中的控制器类。

@Service - 用于服务类。

@RequestMapping - 用于在控制器处理程序方法中配置 URI 映射。

@ResponseBody - 用于发送 Object 作为响应,通常用于发送 XML 或 JSON 数据作为响应。

@PathVariable - 用于将动态值从 URI 映射到处理程序方法参数。

@Autowired - 用于在 spring bean 中自动装配依赖项。

@Qualifier - 使用 @Autowired 注解,以避免在存在多个 bean 类型实例时出现混淆。

@Scope - 用于配置 spring bean 的范围。

@Configuration,@ComponentScan 和 @Bean - 用于基于 java 的配置。

@Aspect,@Before,@After,@Around,@Pointcut - 用于切面编程(AOP)。

@Component, @Controller, @Repository, @Service 有何区别?

@Component:这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。@Controller:这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IoC 容器中。@Service:此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用@Service 而不是 @Component,因为它以更好的方式指定了意图。@Repository:这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。

SpringMVC 流程?

1)用户发送请求至前端控制器 DispatcherServlet。2)DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。3)处理器映射器找到具体的处理器(可以根据 xml 配置、注解进行查找),生成处理器及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet。4)DispatcherServlet 调用 HandlerAdapter 处理器适配器。5)HandlerAdapter 经过适配调用具体的处理器(Controller,也叫后端控制器)6)Controller 执行完成返回 ModelAndView。7)HandlerAdapter 将 controller 执行结果 ModelAndView 返回给 DispatcherServlet。8)DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器。9)ViewReslover 解析后返回具体 View。10)DispatcherServlet 根据 View 进行渲染视图(即将模型数据填充至视图中)。11)DispatcherServlet 响应用户。

SpringMvc 怎么和 AJAX 相互调用的?

通过 Jackson 框架就可以把 Java 里面的对象直接转化成 Js 可以识别的 Json 对象具体步骤如下:

加入 Jackson.jar在配置文件中配置 json 的映射在接受 Ajax 方法里面可以直接返回 Object,List 等,但方法前面要加上@ResponseB注解有哪些不同类型的依赖注入实现方式?

依赖注入是时下最流行的IoC实现方式,依赖注入分为接口注入(Interface Injection),Setter方法注入(Setter Injection)和构造器注入(Constructor Injection)三种方式。其中接口注入由于在灵活性和易用性比较差,现在从Spring4开始已被废弃。

构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。

Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。

Spring Beans

什么是Spring beans?

Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中 的形式定义。

一个 Spring Bean 定义 包含什么?

一个Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。

如何给Spring 容器提供配置元数据?Spring有几种配置方式

这里有三种重要的方法给Spring 容器提供配置元数据。

XML配置文件。基于注解的配置。基于java的配置。

Spring配置文件包含了哪些信息

Spring配置文件是个XML 文件,这个文件包含了类信息,描述了如何配置它们,以及如何相互调用。

Spring基于xml注入bean的几种方式

Set方法注入;构造器注入:①通过index设置参数的位置;②通过type设置参数类型;静态工厂注入;实例工厂;

关于事务控制

事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。

1.1 spring中事务控制APIPlatformTransactionManager 接口提供事务操作的方法,包含三个具体的操作

spring中事务控制接口的结构

1.1.2 TransactionDefinition

事务的定义信息对象,包含如下方法:

获取事务对象名称:String getName()

获取事务隔离级别:int getIsolationLevel()

获取事务传播行为:int getPropagationBehavior()

获取事务超时时间:int getTimeout()

获取事务是否只读:boolean isReadOnly()

1.1.3 TransactionStatus

描述了某个时间点上事务对象的状态信息,包含6个具体的操作:

刷新事务:void flush()

获取是否存在储存点:boolean hasSavepoint()

获取事务是否完成:boolean isCompleted()

获取事务是否为新的事物:boolean isNewTransaction()

获取事务是否回滚:boolean isRollbackOnly()

设置事务回滚:void set RollbackOnly()

1.2 事务的隔离级别

事务的隔离界别反映事务提交并发访问时的处理态度

1.2.1 事务隔离的级别

ISOLATION_DEFAULT 默认级别,由 DBA 默认的设置来决定隔离级别,归属下列某一种ISOLATION_READ_UNCOMMITTED 就是一个事务可以读取另一个未提交事务的数据。会出现脏读、不可重复读、幻读(隔离级别最低,但并发性高)ISOLATION_READ_COMMITTED 就是一个事务要等另一个事务提交后才能读取数据,解决脏读问题。会出现不可重复读、幻读问题(锁定正在读取的行,适用于大多数系统,Oracle默认级别)ISOLATION_REPEATABLE_READ 就是在开始读取数据(事务开启)时,不再允许修改操作,解决不可重复读问题。会出现幻读问题(锁定所读的所有行,MYSQL默认级别)ISOLATION_SERALZABLE 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

1.2.2 数据库读取时会出现的三种问题

① Dirty reads:读脏数据。

也就是说,比如事务A的未提交(还依然缓存)的数据被事务B读走,如果事务A失败回滚,会导致事务B所读取的的数据是错误的。

② non-repeatable reads:数据不可重复读。

比如事务A中两处读取数据price的值。在第一读的时候,price是100,然后事务B就把price的值改成 200;事务A再读一次,结果就发现,price竟然就变成200了,造成事务A数据混乱。

③ phantom reads:幻象读数据。

这个和non-repeatable reads相似,也是同一个事务中多次读不一致的问题。但是 non-repeatable reads 的不一致是因为他所要取的数据值被改变了(比如price)而 phantom reads 所要读的数据的不一致却是他的条件数据集发生变化了。

比如:执行 Select account.id where account.name=“Bruce*”,第一次读去了6个符合条件的id;第二次读取的时候,由于事务B把一个帐号的名字由"dd"改成"Bruce1",结果取出来了7个数据。

1.2.3 数据隔离级别和出现的问题之间的关联

1.3 事务的传播行为

REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选 择(默认值)SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。NEVER:以非事务方式运行,如果当前存在事务,抛出异常。NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行REQUIRED类似的操作。1.4 超时时间

指事务提交后最长可以等待的时间,超出时间则会自动失败。默认值是-1,没有时间限制。如果有,则以秒为单位进行设置。

1.5 是否为只读事务

读写型事务:增加、删除、修改时开启事务

只读型事务:执行查询时,也会开启事务

面试总结:

无论是哪家公司,都很重视Spring框架技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

另外整理多个项目练习题,以及各种Java核心知识点免费分享给大家,下方只是部分截图,需要的话想要资料的话可以下方评论,或者私聊~

阅读剩余内容
网友评论
相关内容
延伸阅读
小编推荐

大家都在看

英语作文初中 总会想起那张照片作文600字 值得珍藏的财富作文600字 劳动作文600字初中 冬日美景作文 夏天 作文 家 作文 读西游记有感450字作文 四年级写作文的技巧和方法 读什么有感作文400字 关于春节的作文100字 我们都是一家人作文 关于元宵节的英语作文 快乐的一天作文500字 给某某的一封信作文 我最喜欢的动物英语作文 乡村美景作文400字 四年级英语作文大全 告别作文600字初中 挠美女脚心作文 写物作文500字 找春天的作文 寒假作文怎么写 榜样作文500字 介绍春节英语作文 故事新编作文 挫折的作文素材 我的家乡作文怎么写 友谊作文600字 老物件作文