参考文章:https://blog.youkuaiyun.com/u012702547/article/details/95938198
文章部分答案来源于:
90.为什么使用Spring?
在Java中,Spring是一个开源源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿真个系统应用,Spring是一个分层的JavaSE/EE 一站式轻量级开源框架。
特点:
1.方便解耦 简化开发(通过Spring 提供的IOC容器,我们可以将对象之间的依赖关系交由Spring控制,避免硬编码造成的过度程序耦合)
2.AOP编程的支持(通过Spring 提供的AOP功能,方便进行面向切面编程,)
3.声明式事务的支持
4.方便程序的测试
5.方便集成各种优秀的框架
6.降低Java EE API 的使用难度
91.解释一下什么是 aop?
在程序运行时将代码切入到类的指定方法,指定位置上的编程思想就是面向切面的编程。
使用AOP技术,可以将一些系统相关的编程工作独立提取出来,独立实现,然后通过切面进入系统。
AOP相关的概念:Aspect(切面) Joint point(连接点) Advice(通知) PointCut(切点)
实战例子:https://blog.youkuaiyun.com/tangthh123/article/details/104141389
92.解释一下什么是 IOC?
IOC翻译成控制反转。控制对象的创建和销毁,控制对象的生命周期。之前我们创建一个对象都是new ,IOC 指的是将对象的控制权给了IOC容器。
参考文章:https://baijiahao.baidu.com/s?id=1654948911688026610&wfr=spider&for=pc
详细解释:https://blog.youkuaiyun.com/u013310119/article/details/51327109
93.spring 有哪些主要模块?
Spring框架的七大模块。
1. Spring Core
框架的最基础部分,提供 IoC 容器,对 bean 进行管理。
2.Spring Context
基于 bean,提供上下文信息,扩展出JNDI、EJB、电子邮件、国际化、校验和调度等功能。
3.Spring DAO
提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码,还提供了声明性事务管理方法。
4.Spring ORM
提供了常用的“对象/关系”映射APIs的集成层。 其中包括JPA、JDO、Hibernate、MyBatis 等。
5.Spring AOP
提供了符合AOP Alliance规范的面向方面的编程实现。
6.Spring Web
提供了基础的 Web 开发的上下文信息,可与其他 web 进行集成。
7.Spring Web MVC
提供了 Web 应用的 Model-View-Controller 全功能实现。
94.spring 常用的注入方式有哪些?
主要有三种,构造方法注入,setter注入,基于注解的注入。
参考文章:https://blog.youkuaiyun.com/qq594913801/article/details/80512451
95.spring 中的 bean 是线程安全的吗?
不是线程安全的
参考文章:https://www.cnblogs.com/myseries/p/11729800.html
96.spring 支持几种 bean 的作用域?
singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的bean只有一个实例。
prototype:原型模式,每次通过容器的getbean方法获取prototype定义的bean时,都产生一个新的bean实例。
只有在web应用中使用Spring时,request session global-session作用域才有效
- request 对于每次HTTP请求,使用request定义的bean都将产生一个新实例,即每次HTTP请求将会产生不同的bean实例。
- session 同一个session共享一个bean实例。
- global-session:同session作用域不同的是,所有的session共享一个bean实例
97.spring 自动装配 bean 有哪些方式?
1. no:这是Spring框架的默认设置,默认不支持自动装配
2. byName:从Spring环境中获取目标对象时,目标对象中的属性会根据名称在整个Spring环境中查找标签的id属性值。如果有相同的,那么获取这个对象,实现关联。整个Spring环境:表示所有的spring配置文件中查找,那么id不能有重复的。
3. byType:从Spring环境中获取目标对象时,目标对象中的属性会根据类型在整个spring环境中查找标签的class属性值。如果有相同的,那么获取这个对象,实现关联。缺点:如果存在多个相同类型的bean对象,会出错。如果属性为单一类型的数据,那么查找到多个关联对象会发生错误。如果属性为数组或集合(泛型)类型,那么查找到多个关联对象不会发生异常。
4. constructor:使用构造方法完成对象注入,其实也是根据构造方法的参数类型进行对象查找,相当于采用byType的方式。
5. autodetect:自动选择:如果对象没有无参数的构造方法,那么自动选择constructor的自动装配方式进行构造注入。如果对象含有无参数的构造方法,那么自动选择byType的自动装配方式进行setter注入。
补充Spring 的装配方式:
Spring容器负责创建应用程序中的bean同时通过id 来协调这些对象之间的关系,作为开发人员,我们需要告诉Spring要创建哪些bean 并且如何将其装配在一起。
- 1.隐式的bean发现机制和自动装配。
- 2.在java代码中或者XML中进行显示配置。
参考文章:
https://www.cnblogs.com/zuochengsi-9/p/9047111.html
http://www.yq1012.com/myweb/4479.html
98.spring 事务实现方式有哪些?
1.编程式事务管理对基于pojo 的应用来说是唯一选择,我们需要在代码中调用beginTransaction() comit() rollback等事务管理相关的方法,这就是编程式事务。
2.基于TransactionProxyFactoryBean的声明式事务管理
3.基于@Transactional 的声明式事务管理
4.基于Aspect AOP 配置事务。
参考文章:https://blog.youkuaiyun.com/mufeng633/article/details/88552245
99.说一下 spring 的事务隔离?
@Transactional(propagatio=Propagation.REQUIRED) 如果有新事务就新添加一个事务,没有默认添加一个
@ Transactional(propagation=Propagation.NOT_SUPPORTED) 不支持事务,按照非事务方式执行。
@ Transactional(propagation=Propagation.REQUIRES_NEW) 不管事务是否存在直接新建一个事务,如果都创建事务,原来的事务挂起,当第二个事务执行完毕后,在执行挂起的事务。
@ Transactional(propagation=Propagation.MANDATORY) 必须在一个事务中执行完毕否则抛出异常。@Transactional(propagation=Propagation.NEVER) 必须在一个没有的事务中执行,否则抛出异常
@ Transactional(propagation=Propagation.SUPPORTS) 如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
100.说一下 spring mvc 运行流程?
- 1.用户发送请求至前端控制器 DispatcherServlet
- 2.DispatcherServlet 收到请求调用HandlerMapping 处理器映射器。
- 3.处理器映射器(HandlerMapping)找到具体的处理器(可以根据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 响应用户。
101.spring mvc 有哪些组件?
前端控制器(DispatcherServlet)
处理器映射器(HandlerMapping)
处理器适配器(HandlerAdapter)
拦截器(HandlerInterceptor)
语言环境处理器(LocaleResolver)
主题解析器(ThemeResolver)
视图解析器(ViewResolver)
文件上传处理器(MultipartResolver)
异常处理器(HandlerExceptionResolver)
数据转换(DataBinder)
消息转换器(HttpMessageConverter)
请求转视图翻译器(RequestToViewNameTranslator)
页面跳转参数管理器(FlashMapManager)
处理程序执行链(HandlerExecutionChain)
————————————————
版权声明:本文为优快云博主「ConstXiong」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/meism5/article/details/90446749
102.@RequestMapping 的作用是什么?
是一个注解,用来标识http请求地址与Controller 类的方法之间的映射。可作用于类和方法上,方法请求的完整地址是Controller类上的RequestMapping value中的值 加上方法上的RequestMapping value上的值。
103.@Autowired 的作用是什么?
@Autowired 是一个注释,它可以对类成员变量、方法及构造函数进行标注,让 spring 完成 bean 自动装配的工作。
@Autowired 默认是按照类去匹配,配合 @Qualifier 指定按照名称去装配 bean。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import blog.service.ArticleService;
import blog.service.TagService;
import blog.service.TypeService;
@Controller
public class TestController {
//成员属性字段使用 @Autowired,无需字段的 set 方法
@Autowired
private TypeService typeService;
//set 方法使用 @Autowired
private ArticleService articleService;
@Autowired
public void setArticleService(ArticleService articleService) {
this.articleService = articleService;
}
//构造方法使用 @Autowired
private TagService tagService;
@Autowired
public TestController(TagService tagService) {
this.tagService = tagService;
}
}
参考文章: https://www.cnblogs.com/ConstXiong/p/12131499.html
十一、Spring Boot/Spring Cloud
104.什么是 spring boot?
SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的创建、运行、调试、部署等。以往在使用Sping框架的时候我们需要在项目中建立多个配置文件,有时候一个小小的问题都要找上大半天,而Springboot非常简洁,只要引入jar包依赖,在配置文件中配置一下即可,并且Springboot框架内置tomcat ,环境搭建比较快,易上手,大大的提高了开发速度。
105.为什么要用 spring boot?
1.简化编码:创建一个web项目SpringBoot只需要在pom.xml文件中引入spring-boot-starter-web ,而以往的项目我们需要引入更多的jar包。
2.简化部署:SpringBoot内嵌了tomcat 启动部署非常方便,以往的项目我们创建好项目以后还需要自行配置tomcat 然后再打包部署,所以SpringBoot部署更方便。
3.简化配置:SpringBoot提供了很多注解,使用注解非常方便。
4.独立运行:Spring Boot而且内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只 要打成一个可执行的jar包就能独立运行,
106.spring boot 核心配置文件是什么?
核心配置文件有俩种,一种是 .properties 还有一种是.yml 文件。
可参考:https://blog.youkuaiyun.com/tangthh123/article/details/104144115
107.spring boot 配置文件有哪几种类型?它们有什么区别?
.properties 和.yml 另外需要注意的是.yml 不支持@PropertySource 注解导入配置。
108.spring boot 有哪些方式可以实现热部署?
- Spring Loaded
- Spring-boot-devtools
- JRebel 插件
可参考:
https://blog.youkuaiyun.com/youanyyou/article/details/78993049
https://blog.youkuaiyun.com/youanyyou/article/details/78993049
109.jpa 和 hibernate 有什么区别?
详细解释:https://www.jdon.com/51332
JPA是规范,Hibernate是对这个规范的实现。
这意味着:我们的代码只需要针对JPA来编写,通过配置,在运行时使用Hibernate来执行真正的持久化工作。
110.什么是 spring cloud?
SpringCloud 是一个微服务框架的规范,提供了全套的分布式系统解决方案。
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现注册,配置中心,消息总线,负载均衡,数据监控,断路器,智能路由,领导选举,分布式会话,集群状态)。
服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控
111.spring cloud 断路器的作用是什么?
在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝) 向调用放返回一个错误响应,而不是长时间的等待,这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统的蔓延。
112.spring cloud 的核心组件有哪些?
Eureka Feign Ribbon Hystrix Zuul
可参考文章:https://developer.51cto.com/art/201811/586513.htm