第四篇:SSM框架(Spring、SpringMVC、Mybatis)

SSM框架 面试题-Spring

1. 什么是Spring框架

我们一般来说,Spring是一个轻量级的java开发框架。它是为了解决企业应用开发的复杂性而创建的。Spring 的核心是控制反转(IoC)和依赖注入(DI)面向切面编程(AOP)。

IOC容器有哪些?

ClassPathxmTApplicationContext.AnnotationConfigApplicationContext、BeanFactory
FilesystemXmlApplicationcontext

ApplicationContext的实现类有哪些?

FileSystemXmlApplicationContext:此容器用xml的方式加载beans定义,需提供xml文件绝对路径
ClassPathXmlApplicationContext:此容器用xml的方式加载beans定义,需提供classpath和相对路径
WebXmlApplicationContext:此容器加载一个Xml文件,该文件定义了WEB应用的所有Bean
AnnotationConfigApplicationContext:用注解的方式启动容器

2. FactoryBean和BeanFactory的区别?

1.FactoryBean是一个特殊的Bean,是一个工厂Bean,用来创建对象,创建的对象类型在泛型里(IOC容器里)
2.BeanFactory是容器,用来存放Spring创建的对象

3.BeanFactory和ApplicationContext的区别?

首先,我们要明确BeanFactory和ApplicationContext都是Spring容器.
区别一:在于BeanFactory是底层容器,ApplicationContext是BeanFactory的派生容器,功能更强大.
区别二:在于BeanFactory是懒加载,getBean的时候才会创建对象.而ApplicationContext是容器初始化的时候才创建对象.
区别三:BeanFactory缺点是慢,如果属性不存在,使用的时候才会报错:优点是前期节省空间.ApplicationContext缺点是前期耗费空间,优点是使用的时候无需等待拿来即用,而且如果属性不存在,容器初始化的时候就会报错

4.谈谈你对Spring IOC的认识?

IOC,就是控制反转,它是一种设计思想,就是将原本在程序中手动创建的控制权交给了Spring框架来管理.直观来讲就是,以前创建对象的主动权和时机都是由自己把控的,IOC让对象的创建不用去new了,可以由Spring自动生产,利用java的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法.
Spring的IOC有三种注入方式:构造器注入,selter方法注入,根据注解注入.

5.谈谈你对Aop的理解

Aop是面向切面编程在不改变原始代码的基础上进行功能增强。

Aop底层原理

动态代理,在程序运行期间动态的生成一个代理对象,当调用到原始方法时,真正执行的是代理对象的代理方法.
动态代理实现方式有两种,基于JDK的动态代理(反射) 和基于CGLib的动态代理(继承).

6. Spring AOP和AspectJ AOP有什么区别?

1String AOP属于运行时增强,而AspectJ是编译时增强.
2.String AOP是基于代理(Proxying),而AspextJ是基于字节码操作.
3.Strnig AOP已经集成了AspectJ,AspectJ应该算的上是Java生态系统中最完整的AOP框架了.
4.AspectJ相比于Spring AOP功能更加强大,但是SpirngAOP相对来说更简单.如果我们的切面比较少,那么两者性能差异不大.但是,当切面太多的话,最好选择AspectJ,它比spring AOP快很多.

7.线程中的单例Bean线程安全问题解决了吗?

我们要清楚,单例bean存在线程问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题.
有两种常见的解决方案:
1.把bean的作用域改为非单例 prototype.
2.把共享变量放到ThreadLocal中,ThreadLocal是线程私有变量,线程间隔离,也可以解决线程安全问题.

8.谈谈你对Spring中bean的生命周期(初始化过程)?

浓缩版
BeanDefinition -> 实例化 -> 依赖注入 -> 初始化 -> 使用 -> 摧毁
1.先通过配置文件或者注解拿到所有的BeanDefinition,并放到BeanDefinitionMap中.
2.从BeanDefinitionMap中拿到bean定义并进行实例化 new
3.依赖注入,给容器中bean中的属性赋值
4.初始化,给属性赋值
5.初始化完成后,bean真正创建完成就可以把bean放到Spring容器中,ConcurrentHashMap,我们使用的时候就可以用过个getBean来获取bean
6.容器销毁的时候,bean也会跟着销毁

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

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

10.你用到Spring中的哪些注解?

1.定义bean: @Component_@Contro1ler @service @Repository
2.依赖注入: @Autowired @Qualifier @Resource @Value
3.定义第三方bean: @Bean
4.配置类注解: @Configuration @Import @propertySource @Componentscan
5.bean的作用范围和生命周期: @Scope @PostConstruct @PreDestroy

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

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

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

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

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

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

14. Spring的事务传播行为

Spring事务的作用?

保证业务层方法同成功同失败

如何添加事务?

1.@Transactional
2.在主配置类上添加 @EnableTransactionManager
3.把事务管理器交给spring管理 PTateformTransactionManagement

事务传播行为的作用?

作用: 为了解决业务层方法相互调用产生的事务问题,表明事务协调员是否要和管理员同成功同失败

事务传播行为有哪些?

默认.新建.支持,不支持

15. 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

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

使用@Autowired注解来自动装配指定的bean。
1 在使用@Autowired注解之前需要在Spring配置文件进行配置

2 启动spring IOC后,容器自动装载了一个后置处理器,当容器扫描到@Autowied、@Resource时,
就会自动查找需要的bean, 并装配给该对象的属性。

在使用@Autowired时,首先在容器中查询对应类型的bean:
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;
如果查询的结果不止一个,那么@Autowired会根据名称来查找;
如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false

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

在Spring框架xml配置中共有5种自动装配:

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

18.Spring支持的几种bean的作用域 Scope ?

Spring框架支持以下五种bean的作用域:
1.singleton
2.prototype
3.request
4.session
5.global-session

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

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

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

工作流程:
1.浏览器提交请求到中央调度器
2.中央调度器直接将请求转给处理器映射器
3.处理器映射器 根据请求url找到具体的处理器,生成 处理器对象 及 处理器拦截器
4.处理器适配器调用执行处理器
5.处理器将处理结果及要跳转的视图封装到一个对象ModelAndView中,将其返回给处理器适配器
6.处理器适配器直接将结果返回给中央调度器
7.中央调度器调用视图解析器,将ModelAndView中的视图名称封装为视图对象
8.视图解析器将封装了的视图对象返回给中央调度器
9.中央调度器调用视图对象,让其自己进行渲染,即进行数据填充,形成响应对象
10.中央调度器响应浏览器

SpringMVC的优点:

1.基于MVC架构,功能分工明确。解耦合,
2.容易理解,上手快;使用简单。
就可以开发一个注解的SpringMVC项目,SpringMVC也是轻量级,jar很小。不依赖的特定的接口和类。
3.作为Spring框架一部分,能够使用Spring的Ioc和Aop。方便整合Strtus,MyBatis,Hiberate,JPA等其他框架。
4.SpringMVC强化注解的使用,在控制器,Service,Dao都可以使用注解。方便灵活 。
使用@Controller创建处理器对象,@Service创建业务对象,@Autowired或者@Resource在控制器,Service,Dao都可以使用注解。方便灵活

21.SpringMVC常用的注解有哪些?

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

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

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

23.spring的优点

a)spring属于低侵入式设计,代码的污染极低

b)spring的DI机制将对象之间的依赖关系交由框架处理、降低组件的耦合性

c)spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用

24.Spring有哪些模块组成

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

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

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

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

循环引用的bean之间会构成一个环,要想打破这个环,
那么这个环中至少需要有一个bean可以在自身的依赖还没有得到满足前,就能够被创建出来(最起码要被实例化出来,可以先不注入其需要的依赖)

这种bean只能是通过属性注入依赖的类,因为它们可以先使用默认构造器创建出实例,
然后再通过setter方法注入依赖。而通过构造器注入依赖的类,
在它的依赖没有被满足前,无法被实例化.

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

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

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

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

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

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

30.SpringMVC的异常处理

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

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

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

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

返回值可以有很多类型,有String, ModelAndView。ModelAndView类把视图和数据都合并的一起的,但一般用String比较好。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值