Spring Bean的生命周期?
bean的生命周期是指Spring容器在创建bean、管理bean时是经过实例化,初始化、依赖注入、执行业务逻辑到最终销毁bean。(源码中重点方法:doCreateBean)
- 实例化:Spring容器通过反射或者工厂方法创建bean实例
- 属性注入:Spring容器将bean的属性值依赖注入到容器中
- 初始化:
- 执行所有实现aware接口的方法
- 执行BeanPostProcess中bean初始化之前方法
- 如果bean实现了InitializingBean接⼝,Spring容器将调⽤afterPropertiesSet()⽅法;如果在bean配置中声明了init-method属性,则Spring容器将调⽤指定的⽅法。(此时就可以使⽤bean了)
- 执行BeanPostProcess中bean初始化之后的方法
- 销毁:如果bean实现了DisposableBean接⼝,Spring容器将在关闭应⽤程序上下⽂时调⽤destroy()⽅法;如果在bean配置中声明了destroy-method属性,则Spring容器将调⽤指定的⽅法。
SpringMVC执行流程?
- 用户发送请求,前端控制器DispatcherServlet接收请求并封装相对应的参数信息
- DispatcherServlet调用handlerMapping,找到具体处理器,并返回处理器调用链
- DispatcherServlet调用handlerAdapter处理适配器,返回handerAdapter对象ha
- 如果注册有拦截器,则调用拦截器的preHandle方法
- 通过处理器适配器调用处理器中方法,返回modelAndView对象
- 如果注册有拦截器,则调用拦截器的postHandle方法
- DispatcherServlet将ModelAndView对象传个视图解析器ViewResolver,返回View对象
- DispatcherServlet根据返回的View对象进行页面渲染
- DispatcherServlet将响应结果返回至用户
SpringBoot自动装配的原理
-
启动类中有@SpringBootApplication注解,底层用了三个核心注解,@SpringBootConfiguration相当于当前类为配置类,@ComponentScan默认扫描当前类所在包及其子包,@EnableAutoConfiguration这个是自动装配的关键,其底层使用了@Import注解,导入了一个实现了ImportSelector的接口实现类,
-
@Import注解导入实现ImportSelector接⼝的实现类,低版本调⽤selectImports(),⾼版本调⽤getAutoConfigurationEntry(),读取当前项⽬下所有依赖jar包中META-INF/spring.factories、META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports两个⽂件⾥⾯定义的
配置类,类似于SPI机制。
-
然后进行去重、排除、过滤等操作。
-
在配置类中定义⼀个@Bean标识的⽅法,还定义了@Conditional开头的注解,条件如果满⾜,Spring
会⾃动调⽤配置类中@Bean标识的⽅法,并把⽅法的返回值注册到IOC容器中
Spring事务隔离级别?事务失效场景?如何改变传播⾏为?
1、事务隔离级别
读未提交、读已提交、可重复读和串⾏化,使⽤@Transactional注解的isolation属性来控制事务的隔离级别。
2、事务失效(aop代理的)
-
事务使⽤在静态⽅法上会失效
-
事务使⽤在⾮public上(访问权限问题)
-
事务中对异常进⾏捕获,出现异常后spring框架⽆法感知到异常,事务就会失效
-
⽅法⽤ final 修饰
-
⽅法内部调⽤
-
未被 spring 管理
-
多线程调⽤
-
表不⽀持事务
3、事务传播行为
- REQUIRED:如果当前存在⼀个事务,则加⼊该事务;否则创建⼀个新的事务。这是默认传播
⾏为。(默认)
-
SUPPORTS:如果当前存在⼀个事务,则加⼊该事务;否则以⾮事务的⽅式执⾏。
-
MANDATORY:如果当前存在⼀个事务,则加⼊该事务;否则抛出异常。
-
REQUIRES_NEW:创建⼀个新的事务,如果当前存在事务,则将当前事务挂起。
-
NOT_SUPPORTED:以⾮事务⽅式执⾏操作,如果当前存在事务,则将当前事务挂起。
-
NEVER:以⾮事务⽅式执⾏,如果当前存在事务,则抛出异常。
-
NESTED:如果当前存在事务,则在嵌套事务内执⾏。如果当前没有事务,则执⾏与REQUIRED类似的操作
-
使⽤@Transactional注解的propagation属性来控制事务的传播⾏为