模板网站与定制网站的区别,wordpress 屏蔽工具条,网站开发多少钱,企业网站备案要多少钱文章目录 Spring中的单例bean是线程安全的吗什么是AOP#xff0c;项目中有没有使用到AOPSpring中的事务是如何实现的Spring中事务失效的场景有哪些Bean的生命周期Spring中的循环依赖#xff08;循环引用#xff09;SpringMVC的执行流程SpringBoot自动配置原理Spring、Spring… 文章目录 Spring中的单例bean是线程安全的吗什么是AOP项目中有没有使用到AOPSpring中的事务是如何实现的Spring中事务失效的场景有哪些Bean的生命周期Spring中的循环依赖循环引用SpringMVC的执行流程SpringBoot自动配置原理Spring、SpringMVC、SpringBoot常见注解MyBatis执行流程MyBatis是否支持延迟加载延迟加载的原理MyBatis的一级、二级缓存MyBatis的二级缓存什么时候会清理缓存中的数据 Spring中的单例bean是线程安全的吗
不是线程安全的。在并发执行请求的情况下如果该请求的业务逻辑中存在对单例bean的修改、成员变量的修改则要考虑线程安全问题而且Spring并没有提供bean的线程安全策略。在Spring中可以使用Scope注解来指定bean的生命周期模式有singleton、prototype、request、session、global session第一种指定的是单例bean、第二种指定的是多例bean默认是单例bean。在Spring中的bean大多数是被注入无状态的对象没有线程安全问题如果定义了可修改的成员变量是要考虑线程安全问题的可以使用多例bean、加锁、ThreadLocal来解决部分问题最后尽量不要在bean中定义成员变量。
什么是AOP项目中有没有使用到AOP
AOP称为面向切面编程用于那些与业务无关的却和多个对象产生影响的公共行为和逻辑抽取并封装为一个可重用的模块这个模块被称为”切面Aspect“减少系统中的重复代码降低模块之间的耦合度同时提高了系统的可维护性常见的使用场景有记录操作记录、缓存处理、Spring中内置的事务处理编程式事务、声明式事务、公共字段的填充等等。
Spring中的事务是如何实现的
本质是通过事务管理器 动态代理对加了Transaction注解的方法前后进行封装事务拦截器来拦截方法调用在执行方法之前开启事务在执行目标方法后根据执行情况提交或回滚事务受到AOP支持。
Spring中事务失效的场景有哪些
异常捕获处理事务通知只有捕获目标抛出的异常才能进行后续的回滚处理如果目标自己处理了异常事务后续的回滚则不进行导致事务失效在这种情况下如果希望事务不失效那我们应该让事务感知到异常所以我们在catch块中添加抛出异常即可throw new RuntimeException(e)。抛出检查异常checked exceptionsSpring默认只会回滚非检查异常在这种情况下我们希望事务不失效可以指定检查的异常为所有异常这样只要是异常事务都会生效Transactional(rollbackFor Exception.class)。非public方法导致的事务失效因为Spring为方法创建代理、添加事务通知前提条件都是该方法是public的所以希望在这种情况下事务不失效把方法改为public的即可。
Bean的生命周期
手写Spring中Bean的生命周期https://github.com/openallzzz/spring-openallzzz调用BeanDefinition获取bean的定义信息获取beanDefinition的class信息调用构造函数实例化bean反射调用clazz.getDeclaredConstructor().newInstance()bean的依赖注入反射获取属性判断属性是否存在注解Autowired处理aware接口BeanNameAware、BeanFactoryAware、ApplicationContextAwareBean的后置处理器BeanPostProcessor-前置postProcessBeforeInitialization初始化方法重写InitializingBean中的afterPropertiesSet方法、init-methodBean的后置处理器BeanPostProcessor-后置postProcessAfterInitialization销毁bean
Spring中的循环依赖循环引用
就是两个或两个以上的bean互相持有对方最终形成闭环。比如A依赖于BB依赖于A。 循环依赖在spring中是允许存在的spring框架依据三级缓存已经解决了大部分的循环依赖非构造方法产生的
一级缓存单例池缓存已经经历了完整的生命周期已经被初始化完成的bean对象二级缓存缓存早期的bean对象生命周期还没走完三级缓存缓存的是ObjectFactory表示对象工厂用来创建某个对象的
构造方法出现了循环依赖的解决方案spring框架并不能解决构造函数的循环依赖我们可以使用Lazy注解进行懒加载什么时候需要对象再进行bean对象的创建。
SpringMVC的执行流程 视图阶段JSP、Thymeleaf 前后端分离阶段接口开发、异步
SpringBoot自动配置原理 Spring、SpringMVC、SpringBoot常见注解
Spring SpringMVC SpringBoot
MyBatis执行流程 MyBatis是否支持延迟加载
支持延迟加载但默认是关闭的。对于延迟加载的定义这里举一个例子用户实体中存在订单属性如果我们在查询用户的时候把用户所属的订单数也查询出来这个就是立即加载如果在查询用户的时候暂时不查询订单数据当需要订单数据的时候再查询订单这个就是延迟加载。
延迟加载的原理 MyBatis的一级、二级缓存 注意开启二级缓存需要在配置文件中开启cacheEnabledtrue并且在相应的mapper.xml文件中使用cache/标签相关select语句的参数 useCachetrue相关的实体类需要实现序列化接口数据才会被加入到二级缓存。
MyBatis的二级缓存什么时候会清理缓存中的数据
详细解答https://blog.csdn.net/jinbaizhe/article/details/81158514 当某一个作用域一级缓存Session / 二级缓存namespace进行了写操作新增、修改、删除操作默认该作用域下所有select中的缓存将被清空。