1、事务的七种传播行为
1.PROPAGATION_REQUIRED:如果存在一个事务,就支持这个事务,如果不存在就开启一个新的事务执行
2.PROPAGATION_REQUIRES_NEW:总是开启一个新的事务执行
3.PROPAGATION_NEVER:以非事务执行,如果存在事务就抛出异常
4.PROPAGATION_NOT_SUPPORTED:以非事务执行并且挂起存在的事务
5.PROPAGATION_SUPPORTS:如果存在一个事务,就支持这个事务,如果没有就按非事务执行
6.PROPAGATION_MANDATORY:如果存在一个事务,就支持这个事务,如果不存在就抛出异常
7.PROPAGATION_NESTED:如果存在一个事务,就开启一个嵌套事务执行,如果不存在就开启一个新的事务执行
2、事务的实现方式
编程式事务:通过编程的方式来管理事务,也就是需要手动调用commit、rollback等函数来实现提交回滚这些操作。
声明式事务:用@Transation注解来实现,主要的参数有value、propagation、isolation、readonly等,其中value用来执行事务管理器,propagation用来设置传播行为,isolation用来设置事务的隔离级别,readonly用来设置读写还是只读。
3、事务的隔离级别
有五种,默认的隔离级别(使用数据库默认的隔离级别)、串行化、可重复读、读已提交、读未提交
4、Spring Bean的生命周期
分为五个阶段:
1.创建前准备阶段:在这个阶段会解析并查找Bean有关的扩展实现,这些扩展类用来实现Bean加载过程中的扩展机制
2.创建实例阶段:在这个阶段会通过反射来创建Bean的实例化对象,扫描并解析Bean对象声明的属性
3.依赖注入阶段:在这个阶段,如果Bean对象需要依赖其他的对象,就会对这些Bean对象进行依赖注入
4.容器缓存阶段:在这个阶段,会将实例化好的Bean存在容器里面供开发者调用
5.销毁实例阶段:在这个阶段,会将Bean进行销毁
4、IOC
IOC即控制反转,就是由Spring容器来管理Bean的整个生命周期,这样可以降低代码之间的耦合。
IOC的实现方式有两种,一种是依赖查找,一种是依赖注入。依赖注入可以通过构造器注入,set注入或者基于注解进行注入。
IOC的初始化流程:首先会读取xml文件,然后对xml文件进行解析,得到BeanDefinition,然后将BeanDefinition注册到容器BeanDefinitionMap中,之后使用BeanFactory根据BeanDefinition来进行实例化和初始化Bean。
5、AOP
AOP即面向切面编程,可以理解成在不修改源代码的情况下进行一个功能的增强。AOP可以有效地减少代码的复用,降低模块之间的耦合度。
AOP的实现有两种方式,一种是静态代理一种是动态代理,在Spring中采用的是动态代理来实现的,AspectJ则是使用静态代理。静态代理指的是在代码编译的时候进行一个织入,也叫编译时增强。动态代理则是在程序运行时进行功能的增强。动态代理又分为JDK动态代理和CGLIB动态代理,JDK动态代理需要代理的类实现接口,如果目标类没有实现接口,那就需要使用CGLIB来实现动态代理,CGLIB是通过继承来实现的动态代理,因此如果目标类被final修饰了的话就无法使用这种方式来进行动态代理。此外,如果目标类实现了接口,可以强制CGLIB来动态代理。
AOP的相关术语:
切面:将通知应用到切入点的过程
连接点:类中可以进行增强的方法
切入点:实际增强的方法
通知:增强的部分,分为前置通知Before、后置通知After、环绕通知Around、异常通知AfterThrowing和返回通知AfterReturning
6、Spring用到了哪些设计模式
1.单例模式:一个类只有一个实例,spring中创建的Bean默认都是单例。
2.适配器模式:在SpringMVC的执行流程中用到了适配器模式
SpringMVC的执行流程是:
首先DispatcherServlet接收到用户发送的请求
然后将这个请求通过处理器映射器(HandlerMapping)得到一个执行链(包含拦截器这些)
然后DispatcherServlet通过这个执行链找到对应的HandlerAdapter
HandlerAdapter再调用handle方法进行处理并返回一个ModelAndView给DispatcherServlet
DispatcherServlet将这个ModelAndView通过ViewResolver视图解析器进行解析,得到View视图
DispatcherServlet将View视图进行渲染,也就是填充数据,之后返回给客户端浏览器显示
3.代理模式:Spring的AOP使用了动态代理
4.观察者模式:spring中常用的地方是listener的实现,比如kafkaListener
5.模板模式:比如jdbcTemplate、redisTemplate、kafkaTemplate、elasticsearchRestTemplate等
6.工厂方法模式
7.简单工厂模式
7、Bean注入容器的方式
1.@Configuration和@Bean
2.@Component、@Controller、@Service、@Repository,然后使用@ComponentScan来扫描
3.@Import
8、Bean的作用域
1.singleton,单例,对于一个bean只创建一个实例对象
2.prototype,每次从IOC容器中获取对象的时候,都会创建一个新的bean实例对象返回
3.request,每次http请求的时候就会创建一个新的Bean实例对象
4.session,同一个session共享同一个bean实例,不同的session产生不同的实例
5.global-session,针对全局session共享同一个Bean实例
9、spring怎么解决循环依赖问题
采用了三级缓存来解决这个问题。假设BeanA和BeanB循环依赖,首先假设要初始化BeanA,那么就会将BeanA放到三级缓存中,然后进行依赖注入,发现BeanA依赖BeanB,所以需要对BeanB进行初始化,BeanB也需要依赖注入,然后要注入BeanA,BeanB就可以从三级缓存中获取BeanA并完成初始化,同时将BeanA从三级缓存中删除移动到二级缓存中,BeanB也会放入到以及缓存中,这个时候BeanA就可以从一级缓存中获取BeanB实现依赖注入,之后完成初始化,将BeanA放入到一级缓存中。
10、@Atuowired和@Resource的区别
@Autowired是根据类型进行注入,如果要根据名称的话可以结合@Qualifier来实现
@Resource默认是按照名称来进行注入,它有两个重要的属性,一个是name,一个是type,使用了哪种属性就按照哪种方式来进行注入,如果都不指定默认就是按照名称注入。如果都设置了,会先通过name来注入,如果找不到再用type。
11、@Bean和@Component的区别
@Component可以作用于任何类上,通过@Component注解Spring会自动创建该类的实例并注入到SpringIOC容器中。
@Bean用于配置类中声明一个bean,通常是用于配置类的方法上面,表示把这个方法的返回对象注册到IOC容器中,通过Bean注解,我们可以自定义Bean的创建和初始化过程,包括指定Bean的名称、作用域、依赖关系等
12、Spring的单例Bean是否有线程安全问题
对于无状态的Bean没有,对于有状态的Bean存在线程安全问题,有状态就是这个Bean对象中有实例变量,可以保存数据,比如entity中的用户类,假设要获取用户实例并进行操作,可以用ThreadLocal来进行线程隔离或者考虑使用prototype?
13、SpringMVC的注解
1.@Controller:用于标识此类的实例是一个控制器
2.@RequestMapping:映射Web请求,即访问路径和参数
3.@ResponseBody:注解返回数据而不是页面
4.@RequestBody:注解实现接收http请求请求体的JSON数据,并将JSON数据转换为java对象
5.@PathVariable:获得URL中变量的值
6.@RestController:相当于@Controller和@ResponseBody
14、@RequestBody和@RequestParam的区别
@RequestBody主要用于接收post请求中请求体中的参数,@RequestParam主要用于接收get请求中url的参数
15、@Pathvariable和@RequestParam的区别
@Pathvariable主要是从url的模板中获取值,即
@RequestMapping(value = "/whisperingNew/workOrder/{id}", method = RequestMethod.DELETE)
xxxx:xxxx/xxxx/xxxx/whisperingNew/workOrder/23
@RequestParam则是从request中获取值
@RequestMapping(value = "/whisperingNew/workOrder", method = RequestMethod.DELETE)
xxxx:xxxx/xxxx/xxxx/whisperingNew/workOrder?id=23
16、SpringBootApplication包含哪些注解
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan