赞
踩
不是线程安全的。在并发执行请求的情况下,如果该请求的业务逻辑中存在对单例bean的修改、成员变量的修改,则要考虑线程安全问题,而且Spring并没有提供bean的线程安全策略。在Spring中可以使用@Scope注解来指定bean的生命周期,模式有singleton、prototype、request、session、global session,第一种指定的是单例bean、第二种指定的是多例bean,默认是单例bean。在Spring中的bean大多数是被注入无状态的对象,没有线程安全问题,如果定义了可修改的成员变量,是要考虑线程安全问题的,可以使用多例bean、加锁、ThreadLocal来解决部分问题,最后,尽量不要在bean中定义成员变量。
AOP称为面向切面编程,用于那些与业务无关的,却和多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被称为”切面(Aspect)“,减少系统中的重复代码,降低模块之间的耦合度,同时提高了系统的可维护性,常见的使用场景有:记录操作记录、缓存处理、Spring中内置的事务处理(编程式事务、声明式事务)、公共字段的填充等等。
本质是通过事务管理器 + 动态代理,对加了@Transaction注解的方法前后进行封装,事务拦截器来拦截方法调用,在执行方法之前开启事务,在执行目标方法后根据执行情况提交或回滚事务,受到AOP支持。
throw new RuntimeException(e)
。@Transactional(rollbackFor = Exception.class)
。clazz.getDeclaredConstructor().newInstance()
)@Autowired
)BeanNameAware、BeanFactoryAware、ApplicationContextAware
)就是两个或两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于A。
循环依赖在spring中是允许存在的,spring框架依据三级缓存已经解决了大部分的循环依赖(非构造方法产生的)
构造方法出现了循环依赖的解决方案,spring框架并不能解决构造函数的循环依赖,我们可以使用@Lazy注解进行懒加载,什么时候需要对象再进行bean对象的创建。
视图阶段(JSP、Thymeleaf):
前后端分离阶段(接口开发、异步):
支持延迟加载,但默认是关闭的。对于延迟加载的定义,这里举一个例子,用户实体中存在订单属性,如果我们在查询用户的时候,把用户所属的订单数也查询出来,这个就是立即加载;如果在查询用户的时候,暂时不查询订单数据,当需要订单数据的时候,再查询订单,这个就是延迟加载。
注意开启二级缓存需要在配置文件中开启cacheEnabled=true,并且在相应的mapper.xml文件中使用<cache/>
标签,相关select语句的参数 useCache=true,相关的实体类需要实现序列化接口,数据才会被加入到二级缓存。
详细解答:https://blog.csdn.net/jinbaizhe/article/details/81158514
当某一个作用域(一级缓存Session / 二级缓存namespace)进行了写操作(新增、修改、删除)操作,默认该作用域下所有select中的缓存将被清空。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。