Spring篇
什么是Spring
Spring是个轻量级的框架,他有两大内核分别是IOC、AOP
IOC是什么 *
依赖注入和控制反转,它是一种思想,创建对象不是直接new出来,而是交给IOC容器,由容器去创建进行管理,这就是控制反转,管理者统一由容器去管理,不是由使用者去管理。比如我们的service和dao层,我们不是直接new出来,而是交给Spring容器,然后通过@Authired注解进行注入,这就是依赖注入。
@Authired和@Resource的区别
都是依赖注入,@Autowired是Spring定义的注解,而@Resource是Java定义的注解
@Autowired是先根据类型(byType)查找,如果存在多个 Bean 再根据名称(byName)进行查找
@Resource是先根据类型(byName)查找,如果存在多个 Bean 再根据名称(byType)进行查找
AOP是什么 *
AOP是面向切面编程,它这个思想就是代理模式,SpringAOP是基于动态代理实现的,默认是jdk动态代理;典型案例就是:记录日志、事务的注解
AOP常用注解
前置通知 Before
后置通知 After
返回通知 如果有异常不执行
异常通知 出现异常才执行
环绕通知
如何使用aop自定义日志
1.定义切面,哪些方法,哪些类下方法需要进行拦截
2.然后写通知前逻辑,获取请求参数
3.然后写通知后的逻辑,获取执行结果的状态,继续记录日志
4.如果出现异常,如何处理,具体的记录错误日志
循环依赖是什么,怎么解决的
循环依赖就是多个Bean互相依赖,创建a依赖b,创建b依赖c,创建c依赖a,导致所有对象创建不出来。
解决:Spring默认是单例模式,不会报错,Spring是通过三级缓存来解决循环依赖,三级缓存是用3个Map对象,一级缓存就是单例池;
Spring 事务原理
我们一般在某个方法上增加@Transactional注解,底层使用AOP,如果没有异常,SQL执行完自动提交事务,如果有异常会回滚
Spring 事务失效场景
1 该类没有被IOC容器进行管理,加载到容器里
2 该方法不是public类型
3 业务代码有try catch捕获异常
Spring 用了哪些设计模式
BeanFactory用了工厂模式、AOP用了动态代理模式、SpringMVC中handlerAdaper用来适配器模式、Spring里的监听器用了观察者模式、RestTemplate用来模板方法模式
SpringBoot自动配置原理 *
自动装配,在之前的SSM项目,每引一个第三方框架,就需要在xml进行构建配置,很麻烦,所有有了SpringBoot自动装配,目的:简化开发
在SpringBoot启动类有一个在启动类有@SpringbootApplication注解,
该注解下有3个重要注解:
1 @SpringbootConfiguration:表示启动类是一个自动配置类;
2 @CompontScan:自动扫描组件,默认扫描该类所在包及其子包下所有带有指定注解的类,将它们自动装配到bean容器中,如:@Controller、@Service等注解,加载到容器中;
3 @EnableAutoConfiguration,该注解开启自动配置
该注解下有:
@AutoConfigurationPackage注解,该注解里有@Import注解,引入一个Registrar类,帮我们批量导入一系列默认的自动化配置,把一些基础的包里带有@Bean、@Configuration等注解,扫码到容器里,以备接下来完成自动化配置;
@Import,就是导入,这里有一个方法,将spring.factories文件里需要自动装配的类,全部加载到ioc容器中,这些自动配置类还会通过xxxProperties文件里配置来进行属性设值,属性进行绑定,就是进行条件装配。最终把这些类全部创建好,存入到IOC容器里。
在springboot项目,基于第三方所有的默认配置被预先定义好,在spring.boot.autoconfigure的包
Spring 中的事务传播行为有哪些
有7种传播行为
1 PROPAGATION_REQUIRED 如果当前存在事务,则加入该事务;如果不存在事务,则创建一个新的事务(默认的)
2 PROPAGATION_SUPPORTS 如果当前存在事务,则加入该事务;如果不存在事务,那就没有事务
3 PROPAGATION_MANDATORY如果当前存在事务,则加入该事务;如果不存在事务,则抛出异常
4 PROPAGATION_REQUIRES_NEW 创建一个新的事务,如果当前存在事务,创建新的事务
5 PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,创建新的事务
6 PROPAGATION_NEVER 以非事务方式执行操作,如果当前存在事务,则抛出异常
7 PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行;如果不存在事务,则创建一个新的事务。
Spring 中的 RestTemplate 是什么