Spring高频面试题总结
1.Spring框架能给我们带来哪些好处?
- 简化开发,解放双手
- 提供内置的解决方案BOP(面向Bean编程)、Ioc(控制反转)、AOP(面向切面编程)
- 声明式事务管理 (TransactionManager)
- 提供诸多的工具类,围绕Spring生态,比如 JdbcTemplate。
2.BeanFactory和ApplicationContext有什么区别?
- ApplicationContext是BeanFactory的实现类
- BeanFcatory是顶层设计(抽象),而ApplicationContext是User Interface
- ApplicationContext功能会非常丰富,API是最全的。一般会认为ApplicationContext就是Ioc
- Ioc的功能是在DefaultBeanFactory类中完成的。但是有共同的接口
3.BeanFactory 和 FactoryBean的区别?
- BeanFactory 是Ioc容器的顶层设计
- FactoryBean 是用来构建Bean的一个包装类
4.Spring Bean的生命周期
- singleton :是从Spring容器的启动到Spring容器的销毁,如果是延时加载,在调用前创建。
- prototype :在调用前创建,调用后销毁
作用域决定了生命周期的长短
。
5.Spring Bean各作用域之间的区别?
- singleton 作用域全局,在任何地方可以通过Ioc容器拿到它
- protoype 全局的
- request 在一次请求发起和结束之间
- session 一个session创建 和 session失效之间,一般默认是30分钟
- global-session 可以理解为容器中的一个应用(Spring 5 不再支持)
6.Spring 中的Bean是线程安全的吗?
Spring中的Bean是否线程安全和Spring 无关,跟自已写的代码有关。
7.请问Spring中用到了哪些设计模式?
- 工厂模式、
- 单例模式(容器式单例) 、
- 原型(多例)模式(容器式多例)、
- 代理模式、
- 享元模式、
- 门面模式、
- 适配器模式、
- 委派模式、
- 装饰器模式(事务装饰器)、
- 责任链模式、
- 空对象模式、
- 解释器模式、
- 建造者模式
8.Spring事务怎么传播?
通过 TransactionManager(使用了代理模式),从数据库连接池中拿到 Connection , 针对Connection 进行操作, 即:
......
before(){
conn.setAutocommint(false);
}
execute();//原始的逻辑
after() {
if (condition) {
conn.rollback();
} else {
conn.commit();
}
}
finally {
conn.close();
}
.....
想要实现事务嵌套 ,从数据库连接池拿到多个连接,对连接进行操作即可
通常数据库连接池均会实现 ConnectionPoolDataSource 接口,因此TransactionManager 可从池中拿到连接。
9.一个方法内,for循环内重复操作数据库,是用一个链接还是多个链接?
不要在一个方法内用for循环去查询数据库,因为会多次连接数据库, 导致连接池的数量不可控, 循环的次数未知 ,连接会很快用光。
解决方案:
1、分页
2、缓存
3、联合查询
10.Spring、SpringMvc、Spring Boot 、Spring Cloud到底有什么区别?
- Spring:是一个一站式的轻量级的java开发框架,核心是控制反转(IOC)和面向切面(AOP),针对于开发的WEB层(springMvc)、业务层(Ioc)、持久层(jdbcTemplate)等都提供了多种配置解决方案
- SpringMvc : 是Spring基础之上的一个MVC框架,主要处理web开发的路径映射和视图渲染,属于Spring框架中WEB层开发的一部分
- Spring boot : 使用了默认大于配置的理念, 简化开发,spring 简化的不够,因为配置文件很头疼,配置的管理(架构师很累), 内置了默认的配置,我们需要配的是需要覆盖的,不需要覆盖实现零配置,全面的去servlet化,能够自运行了,部署也简单了,一个jar包打天下,不需要Tomcat ,Jetty 。 官方 层面提供了一套脚手架,一键搭建,节省时间。
- Spring Cloud : 正式进军分布式,包含有 注册中心、服务发现、监控(链路追踪)、配置中心、负载、熔断… , 打造一个生态 ,不需要自已整合,一站式分布式的解决方案。
Spring Cloud 依赖 Spring boot , Spring boot 依赖 Spring