spring中的bean是线程安全的吗?
不是线程安全的。若bean中有可以修改的成员变量,是要考虑线程安全问题的。若bean中没有可修改的成员变量(无状态bean),是不需要考虑线程安全问题的。
说一下spring?
spring是一个轻量级框架,主要分为IOC、AOP。IOC是spring提供帮助我们管理对象的,包含对象的整个生命周期。我们把创建对象的权利交给spring的IOC,当我们需要使用某个对象的时候,注入即可(控制反转)。AOP是面向切面编程,主要用来给主业务添加增强方法。比如记录日志、开启事务等。AOP底层是基于接口动态代理技术和基于父类动态代理技术。
spring事务的失效场景?
自己捕获了异常(try),并且没有抛出新异常。
抛出检查异常。(io异常) 解决配置rollbackFor属性。
非public方法导致事务失效。
数据库不支持事务。
Bean的生命周期?
spring扫描包,创建BeanDefinition;通过BeanDefinition获取bean的定义信息;调用构造函数实例化Bean;Bean的依赖注入(属性注入);处理各种Aware接口;Bean的前置处理器;Bean的初始化方法;Bean的后置处理器;Bean的销毁。
spring解决循环依赖?
循环依赖:beanA中注入了b,beanB中注入了a。a中有b,b中有a。
一级缓存:经历过完整生命周期的Bean
二级缓存:未经历完整生命周期的Bean
三级缓存:Bean工厂,创建bean对象
当A创建,会先执行其构造方法创建Abean,然后依赖注入B;Bean还没有创建,这时把A放入一级缓存,开始创建Bbean。执行B的构造方法创建Bbena,需要依赖注入A,从一级缓存获取A,注入B的bean中。B就可以正常初始化了,B被放入一级缓存。再去执行A,A把B注入。这样就解决循环依赖了。
三级缓存主要解决有代理对象循环依赖的,会在执行构造方法前执行,并把Bean工厂放入三级缓存,需要注入当前对象,需要在三级缓存中获取。
构造函数出现循环依赖,可以使用@Lazy解决(懒加载)。
springMVC执行流程?
前端发送请求给前端控制器(DispatcherServlet),根据路径再处理器映射器查询handler,处理器适配器执行具体的handler(controller中具体方法),返回ModelAndView。视图解析器进行解析,图像渲染。
springBoot自动装配原理?
在springBoot的启动类上有@SpringBootApplication注解。
@SpringBootApplication可以分为:@ComponentScan(扫描包)@SpringBootConfiguration(配置)@EnableAutoConfiguration(自动装配的核心类)
@EnableAutoConfiguration是import进来的,在其下面封装好了很多bean。会根据是否有指定的类,才会进行加载。
mybatis执行流程?
根据mybatis-config.xml获取数据库环境信息;创建会话工厂(sqlSessonFactory);创建会话(sqlSession);根据会话中的Executor执行sql,包括java类型转数据库类型,数据库类型转java类型。