1.Spring是什么?
1.Spring是⼀个轻量级的控制反转和⾯向切⾯的容器框架:
2.通过控制反转(IoC)的技术达到松耦合的⽬的
3.包含并管理应⽤对象(Bean)的配置和⽣命周期,这个意义上是⼀个容器。
4.可以整合多种技术
2.谈谈你对AOP的理解
OOP允许我们定义从上到下的关系,导致了⼤量代码的重复,⽽不利于各个模块的重⽤。
AOP将程序中的交叉业务逻辑,封装成⼀个切⾯,然后注⼊到⽬标对象的具体业务逻辑中去。AOP可以对某个对象或某些对象的功能进⾏增强。
3.谈谈你对IOC的理解
容器概念、控制反转、依赖注⼊
ioc容器:实际上就是个map,⾥⾯存的是各种对象。在项⽬启动的时候会读取配置⽂件⾥⾯的 bean节点,根据全限定类名使⽤反射创建对象放到map⾥。接下来我们在代码⾥需要⽤到⾥⾯的对象时再通过注入获取。
控制反转:
在没有引⼊IOC容器之前,对象A依赖于对象B,那么对象A运⾏到某⼀点的时候,⾃⼰必须主动去创建对象B,进行对对象B的控制。
引⼊IOC容器之后,对象A与对象B之间失去了直接联系,全部对象的控制权全部上缴给“第三⽅”IOC容器,它起到了 ⼀种类似“粘合剂”的作⽤,这就是控制反转。
4.解释下Spring⽀持的⼏种bean的作⽤域。
● singleton:默认,每个容器中只有⼀个bean的实例。该对象的⽣命周期是与Spring IOC容器⼀致的(但在第⼀次被注⼊时才会创建)。
● prototype:为每⼀个bean请求提供⼀个实例。在每次注⼊时都会创建⼀个新的对象
● request:bean被定义为在每个HTTP请求中创建⼀个单例对象,也就是说在单个请求中都会复⽤这⼀个单例对象。
● session:与request范围类似,确保每个session中有⼀个bean的实例,在session过期后,bean会随之失效。
5.Spring事务隔离级别?
spring事务隔离级别就是数据库的隔离级别:
read uncommitted(未提交读)
read committed(提交读、不可重复读)
repeatable read(可重复读)
serializable(可串⾏化)
数据库的配置隔离级别是Read Commited,⽽Spring配置的隔离级别是Repeatable Read,请问这时隔离级别是以哪⼀个为准? 以Spring配置的为准,如果spring设置的隔离级别数据库不⽀持,效果取决于数据库
6.Spring事务传播机制
- REQUIRED(Spring默认的事务传播类型):如果当前没有事务,则⾃⼰新建⼀个事务,如果当前存 在事务,则加⼊这个事务
- SUPPORTS:当前存在事务,则加⼊当前事务,如果当前没有事务,就以⾮事务⽅法执⾏
- MANDATORY:当前存在事务,则加⼊当前事务,如果当前事务不存在,则抛出异常。
- REQUIRES_NEW:创建⼀个新事务,如果存在当前事务,则挂起该事务。
- NOT_SUPPORTED:以⾮事务⽅式执⾏,如果当前存在事务,则挂起当前事务
- NEVER:不使⽤事务,如果当前事务存在,则抛出异常
- NESTED:如果当前事务存在,则在嵌套事务中执⾏,否则REQUIRED的操作⼀样(开启⼀个事 务)
7.Spring事务什么时候会失效?
1、发⽣⾃调⽤,不是通过注入的Bean对象调用,而是通过普通对象调用事务方法。
2、⽅法不是public的:@Transactional 只能⽤于 public 的⽅法上,否则事务不会失效,如果要⽤在⾮ public ⽅法上,可以开启 AspectJ 代理模式。
3、数据库不⽀持事务
4、没有被spring管理
5、异常被吃掉,事务不会回滚(或者抛出的异常没有被定义,默认为RuntimeException)
8.Spring中的Bean创建的⽣命周期有哪些步骤
- 推断构造⽅法
- 实例化
- 填充属性,也就是依赖注⼊
- 处理Aware回调
- 初始化前,处理@PostConstruct注解
- 初始化,处理InitializingBean接⼝
- 初始化后,进⾏AOP
https://blog.csdn.net/weixin_45994575/article/details/120254342
9.Spring中Bean是线程安全的吗
1.Spring中的Bean默认是单例模式的,框架并没有对bean进行多线程的封装处理。 如果Bean是⽆状态的,那么Bean则是线程安全的
2. 有状态的bean,具有数据存储功能。无状态的bean,只有普通的对数据的操作方法,而没有存储功能。有状态的bean不应该被线程共享,无状态的bean可以被线程共享。如果Bean是有状态的,那么Bean则不是线程安全的 。如果Bean是有状态的 那就需要开发人员自己来进行线程安全的保证,最简单的办法就是改变bean的作用域 把 "singleton"改为’‘protopyte’ 这样每次请求Bean就相当于是 new Bean() 这样就可以保证线程的安全了。
10.ApplicationContext和BeanFactory有什么区别
BeanFactory:
是Spring里面最低层的接口,提供了最简单的容器的功能,提供了实例化对象和获取对象的功能;
ApplicationContext:
应用上下文,继承BeanFactory接口,它是Spring的一个更高级的容器,提供了更多的有用的功能;比如:
国际化(MessageSource)
访问资源,如URL和文件(ResourceLoader)
载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
消息发送、响应机制(ApplicationEventPublisher)
AOP(拦截器)
BeanFactory在启动的时候不会去实例化Bean,只有中有从容器中拿Bean的时候才会去实例化;
ApplicationContext在启动的时候就把所有的Bean全部实例化了。
11.Spring中的事务是如何实现的
- Spring事务底层是基于数据库事务和AOP机制的
- ⾸先对于使⽤了@Transactional注解的Bean,Spring会创建⼀个代理对象作为Bean
- 当调⽤代理对象的⽅法时,会先判断该⽅法上是否加了@Transactional注解
- 如果加了,那么则利⽤事务管理器创建⼀个数据库连接
- 并且修改数据库连接的autocommit属性为false,禁⽌此连接的⾃动提交
- 然后执⾏当前⽅法,⽅法中会执⾏sql
- 执⾏完当前⽅法后,如果没有出现异常就直接提交事务
- 如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务
13.Spring容器启动流程是怎样的
-
在创建Spring容器,也就是启动Spring时:
-
⾸先会进⾏扫描,扫描得到所有的BeanDefinition对象,并存在⼀个Map中
-
然后筛选出⾮懒加载的单例BeanDefinition进⾏创建Bean,对于多例Bean不需要在启动过程中去进⾏创建,对于多例Bean会在每次获取Bean时利⽤BeanDefinition去创建
-
利⽤BeanDefinition创建Bean就是Bean的创建⽣命周期,这期间包括了合并BeanDefinition、推断 构造⽅法、实例化、属性填充、初始化前、初始化、初始化后等步骤,其中AOP就是发⽣在初始化 后这⼀步骤中
-
单例Bean创建完了之后,Spring会发布⼀个容器启动事件
-
Spring启动结束
-
在源码中会更复杂,⽐如源码中会提供⼀些模板⽅法,让⼦类来实现,⽐如源码中还涉及到⼀些 BeanFactoryPostProcessor和BeanPostProcessor的注册,Spring的扫描就是通过 BenaFactoryPostProcessor来实现的,依赖注⼊就是通过BeanPostProcessor来实现的
-
在Spring启动过程中还会去处理@Import等注解
14.Spring Boot、Spring MVC 和 Spring 有什么区别
spring是⼀个IOC容器,⽤来管理Bean,使⽤依赖注⼊实现控制反转,可以很⽅便的整合各种框架
springmvc是spring对web框架的⼀个解决⽅案,提供了⼀个总的前端控制器Servlet⽤来接收请求, 然后定义了⼀套路由策略将结果使⽤视图解析技术⽣成视图展现给前端
springboot是spring提供的⼀个快速开发⼯具包,让程序员能更⽅便、更快速的开发spring+springmvc 应⽤,约定了默认配置,整合了⼀系列的解决⽅案,可以开箱即⽤
15.Spring MVC ⼯作流程
1)⽤户发送请求⾄前端控制器 DispatcherServlet。
2)DispatcherServlet 收到请求调⽤ HandlerMapping 处理器映射器。
3)处理器映射器找到具体的处理器,⽣成处理器及处理器拦截器⼀并返回给 DispatcherServlet
4)DispatcherServlet 调⽤ HandlerAdapter 处理器适配器。
5)HandlerAdapter 经过适配调⽤后端控制器
6)Controller 执⾏完成返回 ModelAndView。
7)HandlerAdapter 将 controller 执⾏结果 ModelAndView 返回给 DispatcherServlet。
8) DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器。
9)ViewReslover 解析后返回具体 View。
10)DispatcherServlet 根据 View 进⾏渲染视图
11)DispatcherServlet 响应⽤户。
17.Spring Boot ⾃动配置原理?
@Import + @Configuration + Spring spi ⾃动配置类由各个starter提供,使⽤@Configuration + @Bean定义配置类,放到META- INF/spring.factories下 使⽤Spring spi扫描META-INF/spring.factories下的配置类 使⽤@Import导⼊⾃动配置类
18.如何理解 Spring Boot 中的 Starter
使⽤spring + springmvc使⽤,如果需要引⼊mybatis等框架,需要到xml中定义mybatis需要的bean starter就是定义⼀个starter的jar包,写⼀个@Configuration配置类、将这些bean定义在⾥⾯,然后在 starter包的META-INF/spring.factories中写⼊该配置类,springboot会按照约定来加载该配置类
开发⼈员只需要将相应的starter包依赖进应⽤,进⾏相应的属性配置(使⽤默认配置时,不需要配 置),就可以直接进⾏代码开发,使⽤对应的功能了,⽐如mybatis-spring-boot–starter,spring- boot-starter-redis
19.Spring Boot中常⽤注解及其底层实现
-
@SpringBootApplication注解:这个注解标识了⼀个SpringBoot⼯程,它实际上是另外三个注解的 组合,这三个注解是: a. @SpringBootConfiguration:这个注解实际就是⼀个@Configuration,表示启动类也是⼀个 配置类 b. @EnableAutoConfiguration:向Spring容器中导⼊了⼀个Selector,⽤来加载ClassPath下 SpringFactories中所定义的⾃动配置类,将这些⾃动加载为配置Bean c. @ComponentScan:标识扫描路径,因为默认是没有配置实际扫描路径,所以SpringBoot扫 描的路径是启动类所在的当前⽬录
-
@Bean注解:⽤来定义Bean,类似于XML中的标签,Spring在启动时,会对加了@Bean注 解的⽅法进⾏解析,将⽅法的名字做为beanName,并通过执⾏⽅法得到bean对象
-
@Controller、@Service、@ResponseBody、@Autowired都可以说
20.Spring Boot是如何启动Tomcat的
- ⾸先,SpringBoot在启动时会先创建⼀个Spring容器
- 在创建Spring容器过程中,会利⽤@ConditionalOnClass技术来判断当前classpath中是否存在 Tomcat依赖,如果存在则会⽣成⼀个启动Tomcat的Bean
- Spring容器创建完之后,就会获取启动Tomcat的Bean,并创建Tomcat对象,并绑定端⼝等,然后 启动Tomcat
21.Spring Boot中配置⽂件的加载顺序是怎样的?
优先级从⾼到低,⾼优先级的配置覆盖低优先级的配置,所有配置会形成互补配置。
- 命令⾏参数。所有的配置都可以在命令⾏上进⾏指定;
- Java系统属性(System.getProperties());
- 操作系统环境变量 ;
- jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置⽂件
- jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置⽂件 再来加 载不带profile
- jar包外部的application.properties或application.yml(不带spring.profile)配置⽂件
. jar包内部的application.properties或application.yml(不带spring.profile)配置⽂件
- @Configuration注解类上的@PropertySource