【SSM面试题】

1什么是Spring框架?

我们一般说的Spring框架就是Spring Framework,旨在提高开发人员的开发效率以及系统的可维护性。
这些模块是:核心容器、数据访问/集成、Web、AOP(面向切面编程)、工具、消息和测试模块。

2对于Spring I0c的认识

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

DI:依赖注入,从spring容器获取对象,并给属性赋值

3谈谈自己对于AOP的理解

在面向切面编程中,我们将一个个对象某些类似的方面横向抽象成一个切面,对这个切面进行一些如权限验证,事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。
Spring AOP底层是基于动态代理实现的,在不改变原始代码的基础上进行功能增强.

4 Spring AOP和AspectJ AOP有什么区别?

1 Spring AOP是属于运行时增强,而AspectJ是编译时增强。
2 Spring AOP基于代理(Proxying),而AspectJ基于字节码操作(Bytecode Manipulation)是指通过XML文件来定义切面、切入点及通知,所有的切面切入点通知都必须是定义在aop的config元素内。
3 Spring AOP已经集成了AspectJ,AspectJ应该算得上是Java生态系统中最完整的AOP框架了。
4 AspectJ相比于Spring AOP功能更加强大,但是Spring AOP相对来说更简单。
如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择AspectJ,它比SpringAOP快很多

5 Spring中的单例bean的线程安全问题

单例bean存在线程问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量写操作会存在线程安全问题
有两种常见的解决方案:
1.在bean对象中尽量避免定义可变的成员变量(不太现实)。
2.在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在ThreadLocal中(推荐的一种方式)

6 Spring中的bean生命周期?

1.详细版

1.Bean容器找到配置文件中Spring Bean的定义。
2.Bean容器利用Java Reflection API创建一个Bean的实例。
3.如果涉及到一些属性值,利用set()方法设置一些属性值。
4.如果Bean实现了BeanNameAware接口,调用setBeanName()方法,传入Bean的名字。
5.如果Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例。
6.如果Bean实现了BeanFactoryAware接口,调用setBeanClassFacotory()方法,传入ClassLoader对象的实例。
7.与上面的类似,如果实现了其他*Aware接口,就调用相应的方法。
8.如果有和加载这个Bean的Spring容器相关的BeanPostProcessor对象,执行postProcessBeforeInitialization()方法。
9.如果Bean实现了InitializingBean接口,执行afeterPropertiesSet()方法。
10.如果Bean在配置文件中的定义包含init-method属性,执行指定的方法。
11.如果有和加载这个Bean的Spring容器相关的BeanPostProcess对象,执行postProcessAfterInitialization()方法。
12.当要销毁Bean的时候,如果Bean实现了DisposableBean接口,执行destroy()方法。
13.当要销毁Bean的时候,如果Bean在配置文件中的定义包含destroy-method属性,执行指定的方法。

2.图例非常详细

https://www.cnblogs.com/zrtqsk/p/3735273.html

3.简单版

生命周期分为:

实例化(Instantiation):
调用springframework中的createBeanInstance()方法给Bean对象分配内存空间,此时属性是默认值,并未进行属性的依赖注入.

初始化-属性赋值(Populate):

​ 1.调用springframework中的populateBean()方法来对用户自定义的对象的属性的赋值.

​ 2.调用springframework中的invokeAwareMethods()方法对引用的容器级别对象的属性的赋值

初始化-增强实现(PostProcessor)

​ 通过BeanPostProcessor接口来对Bean增强实现

​ 1.执行前置处理方法(前置处理):postProcessBeforeInitialization ()完成所有xxxAware接口的注入,即对引用的容器级别对象的属性的赋值/依赖注入操作

​ 2.执行初始化调用方法invokeInitMethods()Java中前置处理已经完成属性赋值,所以无特殊含义.

​ 3.执行后置处理方法.postProcessAfterInitialization()

其中只有一个方法afterPropertiesSet(),来给用户最后一次机会来手动进行属性的赋值或方法的调用操作.

使用和销毁(Destruction):
当Bean不再需要时就会进入销毁阶段,使用destroy方法销毁

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

1 工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
2 单例模式:Bean默认为单例模式。
3 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
4 模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
5 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的 对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener

6.适配器模式:是结构型模式,也是各种结构型模式的起源 将一个接口转换为调用方需要的接口 适配器使得接口不兼容的类之间可以一起工作.适配器又被称为包装器Wrapper

7.装饰器模式:动态地给对象添加一些额外的属性或者行为 和继承相比,装饰器模式更加灵活

8.策略模式:一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

8你用到Spring中的哪些注解?

@Component:标识了一个受Spring管理的组件,泛指组件
@Respository: 标识持久层,数据访问组件,即DAO组件
@Service: 标识业务层组件
@Controller :标识表现层,控制层组件
@RequestMapping 是用来处理请求地址映射的注解,可用于类或方法上
@Resource和**@Autowired**都是做bean的注入时使用,都可以写在字段上,或者是setter方法上

9 Spring事务管理的方式有几种?

1.编程式事务:在代码中硬编码(不推荐使用)。
2.声明式事务:在配置文件中配置(推荐使用),分为基于XML的声明式事务和基于注解的声明式事务。

10 Spring事务中的隔离级别有哪几种?

在TransactionDefinition接口中定义了五个表示隔离级别的常量:
ISOLATION_DEFAULT:使用后端数据库默认的隔离级别,Mysql默认采用的REPEATABLE_READ隔离级别;Oracle默认采用的READ_COMMITTED隔离级别。
ISOLATION_READ_UNCOMMITTED:读未提交
ISOLATION_READ_COMMITTED:读已提交
ISOLATION_REPEATABLE_READ:可重复读
ISOLATION_SERIALIZABLE:串行化

11 Spring中什么时候@Transactional会失效?

同时如果某个⽅法是private的,那么@Transactional会失效
因为底层cglib是基于⽗⼦类来实现的,⼦类是不能重载⽗类的private⽅法的,
所以⽆法很好的利⽤代理,也会导致@Transactianal失效

12 Spring的事务传播行为

可以在事务属性中通过propagation属性来指定事务传播行为 :
PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就 加入该事务,该设置是最常用的设置。
PROPAGATION_SUPPORTS(默认):支持当前事务,如果当前存在事务,就加入该事务,如果当前不 存在事务,就以非事务执行。
PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前 不存在事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前 事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则 按REQUIRED属性执行。

13 Spring中的事务是如何实现的?

1 Spring事务底层是基于数据库事务AOP机制
2 ⾸先对于使⽤了@Transactional注解的Bean,Spring会创建⼀个代理对象作为Bean
3 当调⽤代理对象的⽅法时,会先判断该⽅法上是否加了@Transactional注解
4 如果加了,那么则利⽤事务管理器创建⼀个数据库连接
5 并且修改数据库连接的autocommit属性为false,禁⽌此连接的⾃动提交,这是实现Spring事务⾮ 常重要的⼀步
6 然后执⾏当前⽅法,⽅法中会执⾏sql
7 执⾏完当前⽅法后,如果没有出现异常就直接提交事务
8 如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务
9 Spring事务的隔离级别对应的就是数据库的隔离级别
10 Spring事务的传播机制是Spring事务⾃⼰实现的,也是Spring事务中最复杂的
11 Spring事务的传播机制是基于数据库连接来做的,⼀个数据库连接⼀个事务,
如果传播机制配置为需要新开⼀个事务,那么实际上就是先建⽴⼀个数据库连接,在此新数据库连接上执⾏sql

14使用@Autowired注解自动装配的过程是怎样的?

使用@Autowired注解来自动装配指定的bean。
1 在使用@Autowired注解之前需要在Spring配置文件进行配置
2 启动spring IOC后,容器自动装载了一个后置处理器,当容器扫描到@Autowied、@Resource时,
就会自动查找需要的bean, 并装配给该对象的属性。
在使用@Autowired时,首先在容器中查询对应类型的bean:
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;
如果查询的结果不止一个,那么@Autowired会根据名称来查找;
如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false

15 spring自动装配bean有哪些方式?

在Spring框架xml配置中共有5种自动装配:
no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean
byName:通过bean的名称进行自动装配,如果一个bean的 property 与另一bean 的name 相 同,就进行自动装配。
byType:通过参数的数据类型进行自动装配。
constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。
autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。

l6 Spring支特的几种bean的作用域Scope?

Spring框架支持以下五种bean的作用域:
singleton
prototype
request
session
global-session

在这里插入图片描述

17什么是SpringMVC简单介绍下你对springMVC的理解?

Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,
通过把Model(模型)View(视图),==Controller(控制器)==分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,
简化开发,减少出错,方便组内开发人员之间的配合。
优点:
1.可以支持各种视图技术,而不仅仅局限于JSP
2.与Spring框架集成
3.清晰的角色分配:前端控制器,请求到处理器映射,处理器适配器,视图解析器
4.支持各种请求资源的映射策略

18 描述一下SpringMVC的工作流程?springMVC的优点

1 用户发送请求至前端控制器DispatcherServlet;
2 DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;
3 处理器映射器 根据请求url找到具体的处理器,生成 处理器对象 及 处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
4 DispatcherServlet 调用 HandlerAdapter处理器适配器;
5 HandlerAdapter 经过适配调用具体处理器(Handler,也叫后端控制器);
6 Handler执行完成返回ModelAndView;
7 HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
8 DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
9 ViewResolver解析后返回具体View;
10 DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
11 DispatcherServlet响应用户。
(1)用户端将请求统一提交到DispatcherServlet;
(2)DispatcherServlet会将请求交给HandlerMapping进行请求映射,匹配该请求的Handler;
(3)DispatcherServlet再请求HandlerAdapter调用相应的Handler处理请求,并向前端控制器返回一个ModelAndView对象;
(4)DispatcherServlet将ModelAndView对象交给ViewResoler视图解析器处理,返回指定的视图View;
(5)DispatcherServlet 对 View 进行渲染(即将模型数据填充至视图中);
(6)DispatcherServlet 将页面响应给用户;

19 SpringMVC常用的注解有哪些?

@RestController : @Controller和@ResponseBody的组合注解
@RequestMapping : 接口请求映射
@GetMapping : GET请求方式映射
@PutMapping : PUT请求方式映射
@PostMapping : PUT请求方式映射
@DeleteMapping : DELETE请求方式映射
@RequestBody : 接收请求体数据,JSON会自动转对象
@ResponseBody : 响应数据自动转JSON
@RequestParam : 接收请求参数
@Cookie : 接收请求中的cookie
@RequestHeader : 接收请求头
@PathVariable : 声明路径变量

20在浏览器输入地址到服务器响应数据的过程

1、在浏览器中输入url,直接输入ip或者输入域名
2、如果输入的是域名就需要通过DNS解析将域名解析成IP地址,通过IP来确认访问的是哪个服务器
3、建立TCP请求(即三次握手)
4、发送http请求
5、服务器处理请求,并将结果返回给浏览器
6、最后断开TCP连接(即四次挥手)
7、浏览器根据返回结果进行处理以及页面渲染

21 springl的优点

a)spring属于低侵入式设计,代码的污染极低
b)spring的DI机制将对象之间的依赖关系交由框架处理、降低组件的耦合性
c)spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用

22 spring有哪些模块组成

(1)Spring Core:核心类库,提供IOC服务
(2)Spring Context:提供框架式的Bean访问方式,以及企业级功能(定时任务等)
(3)Spring AOP:AOP服务
(4)Spring DAO:对JDBC的抽象,简化了数据访问异常的处理
(5)Spring ORM:对现有的ORM框架的支持
(6)Spring Web:提供了基本的面向Web的重合特性,例如多方文件上传
(7)Spring MVC:提供面向Web应用的Model-View-Controller实现

23 Spring容器启动流程是怎样的?

创建Spring容器,也就是启动Spring时⾸先会进⾏扫描,扫描得到所有的BeanDefinition对象,并存在⼀个Map中 ,
然后筛选出⾮懒加载的单例BeanDefinition进⾏创建Bean , 利⽤BeanDefinition创建Bean就是Bean的创建⽣命周期,
这期间包括了合并BeanDefinition、推断 构造⽅法、实例化、属性填充、初始化前、初始化、初始化后等步骤,
其中AOP就是发⽣在初始化后这⼀步骤中 , 单例Bean创建完了之后,Spring会发布⼀个容器启动事件 ,之后 Spring启动结束

24 Spring如何处理线程并发问题?

1 在一般情况下,只有无状态的Bean才可以在多线程环境下共享,
在Spring中,绝大部分Bean都可 以声明为singleton作用域,
因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题
2 ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。
同步机制采用了 “时间换空间”的方式,仅提供一份变量,
不同的线程在访问前需要获取锁,没获得锁的线程则需要排队,
ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突

25什么是循环引用,如何解决循环引用?

循环引用的bean之间会构成一个环,要想打破这个环,
那么这个环中至少需要有一个bean可以在自身的依赖还没有得到满足前,就能够被创建出来(最起码要被实例化出来,可以先不注入其需要的依赖)
这种bean只能是通过属性注入依赖的类,因为它们可以先使用默认构造器创建出实例,
然后再通过setter方法注入依赖。而通过构造器注入依赖的类,
在它的依赖没有被满足前,无法被实例化

26 Spring Refresh

Spring容器创建之后,会调用它的refresh方法刷新Spring应用的上下文。

27 Spring核心类有哪些,各有什么作用

1.BeanFactory:产生一个新的实例,可以实现单例模式
2.BeanWrapper:提供统一的get及set方法
3.ApplicationContext:提供框架的实现,包括BeanFactory所有功能

28如果解决P0ST请求/GET请求中文乱码问题?

1.解决post请求乱码问题:在web.xml配置一个CharacterEncodingFiltre过滤器设置为utf-8
2.get请求中文参数出现乱码解决方法有两个
(1)修改tomcat配置文件添加编码与工程编码一致
(2)对参数进行重写编码

29 SpringMvc.里面的拦截器怎么写

1.一种是实现HandlerInterceptor接口
2.另一种是继承适配器类,接着在接口方法当中实现处理逻辑

30 SpringMVC.怎么跟AJAX互相调用

1.通过Jackson框架就可以把Java里面的对象之间转化成Js可以识别JSON对象,步骤如下:
(1)加入Jackson.jar
(2)在配置文件中配置json的映射
(3)在接受Ajax方法里面可以直接返回Object、List等,但方法前面要加上ResponseBody注解

31 SpringMVC的异常处理

可以将异常抛给Spring框架,由Spring框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添加视图页面即可

32 SpringMVC的控制器是不是单例模式,如果是,有什么问题,怎么解决

是单例模式,在多线程访问的时候有线程安全问题,
解决方法是在控制器里面不能写可变状态量,
如果需要使用这些可变状态,可以使用ThreadLocal机制解决,
为每个线程单独生成一份变量副本独立操作,互不影响

33 SpringMVC中函数的返回值是什么?

String、ModelAndView。ModerlAndView类把试图和数据都合并的一起

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 首先,@SessionAttributes注解可以在类上面加上,里面包含的字符串就是要放入session里面的key。通过Jackson框架可以将Java对象直接转化成可以识别的Json对象。具体步骤包括加入Jackson.jar,配置json的映射,以及在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解。\[1\] MyBatis的好处是可以将SQL语句从Java源程序中独立出来,放在单独的XML文件中编写,给程序的维护带来了很大便利。此外,MyBatis封装了底层JDBC API的调用细节,并能自动将结果集转换成Java Bean对象,简化了Java数据库编程的重复工作。相比于全自动ORM框架,如Hibernate,MyBatis需要程序员自己编写SQL语句,因此能够更灵活地控制SQL语句,实现更高的查询效率,能够完成复杂查询。\[2\] 关于MyBatis的缓存,它可以提高查询性能。MyBatis的缓存分为一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,它默认开启,可以减少对数据库的访问次数。二级缓存是Mapper级别的缓存,可以跨SqlSession共享数据,需要手动配置开启。使用缓存可以减少对数据库的访问,提高系统性能。但是需要注意缓存的更新和失效机制,以保证数据的一致性。\[3\] #### 引用[.reference_title] - *1* *2* *3* [JavaSSM框架精选50道面试题](https://blog.csdn.net/qq_41735004/article/details/87199651)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v4^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值