Spring
# 单例Bean是线程安全
Bean单例还是多例可以通过@Scope
指定
singleton
: bean在每个Spring IOC容器中只有一个实例;
prototype
:一个bean定义可以有多个实例。
Spring 框架默认使用的单例Bean模式,不是线程安全的。但是一般Spring 中的bean都是无状态的对象,没有线程安全的问题。如果bean中定义了可修改的成员变量,是要考虑线程安全问题的。
# AOP
面向切面编程,一般用于将那些与业务无关的代码,公共的,将其抽取出来作为一个模块,这一个模块称为切面,可以将其嵌入到需要的地方。
- 记录操作日志
- 缓存处理
- Spring 中内置的事务处理
记录日志,定义切点(监控的范围,方法),对切点定义行为,使用前置通知方式方式,预先拦截一下方法的参数,获取需要记录的部分,然后保存到数据库。
@Transaction
声明式事物,使用AOP将事务处理的功能编织到拦截的方法中
# 事务失效
异常捕获处理
在try中出现异常,并在catch中处理了异常,就事务失效了。需要在catch中throw new RuntimeException(e)。
抛出检查异常
如果出现异常,只会回滚非检查异常。可以配置rollbackFor = Excetion.class,所有异常都回滚。
非public方法
spring为该方法创建代理,需要该方法是public的。
# Spring bean的生命周期
Spring在容器初始化过程中,会将xml配置的<bean>
的信息封装成一个BeanDefinition对象,Spring根据BeanDefinition创建Bean对象,BeanDefinition有很多属性来描述Bean。
- beanClassName
- initMethodName
- properryValues
- scope
- lazyInit
# 循环依赖
一级缓存,单利池,存放已经初始化完成的bean对象
二级缓存,缓存声明周期还没进行完的bean对象
三级缓存,缓存的是,ObjectFactory对象工厂,用来创建对象。
二级缓存解决循环依赖
三级缓存解决循环依赖
A依赖B,B依赖A的代理对象
# 构造方法循环依赖
public A(@Lazy B b){
System.out.println("A的构造方法执行了...");
this.b = b;
}
# Spring MVC执行流程
- 视图JSP
- 前后端分离
# Spring Boot自动配置
@SpringBootApplication
注解中有以下三个注解
@SpringBootConfiguration
配置类,与Configuration相同
@EnableAutoConfiguration
实现自动配置
@ComponentScan
组件扫描
# Spring 常见注解
注解 | 说明 |
---|---|
@Component、@Controller、@Service、@Repository | 使用在类上用于实例化Bean |
@Autowired | 使用在字段上用于根据类型依赖注入 |
@Qualifier | 结合@Autowired一起使用用于根据名称进行依赖注入 |
@Scope | 标注Bean的作用范围 |
@Configuration | 指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解 |
@ComponentScan | 用于指定 Spring 在初始化容器时要扫描的包 |
@Bean | 使用在方法上,标注将该方法的返回值存储到Spring容器中 |
@Import | 使用@Import导入的类会被Spring加载到IOC容器中 |
@Aspect、@Before、@After、@Around、@Pointcut | 用于切面编程(AOP) |
# Spring MVC注解
@RequestMapping | 用于映射请求路径,可以定义在类上和方法上。用于类上,则表示类中的所有的方法都是以该地址作为父路径 |
---|---|
@RequestBody | 注解实现接收http请求的json数据,将json转换为java对象 |
@RequestParam | 指定请求参数的名称 |
@PathViriable | 从请求路径下中获取请求参数(/user/{id}),传递给方法的形式参数 |
@ResponseBody | 注解实现将controller方法返回对象转化为json对象响应给客户端 |
@RequestHeader | 获取指定的请求头数据 |
@RestController | @Controller + @ResponseBody |
# Mybatis执行流程
# 延迟加载
查询用户的时候,把用户中的订单信息也查询出来,这是立即加载。
查询用户时,仅查询用户表信息,当访问orderList时,再查询订单表,这是延迟加载。
# 缓存
- 本地缓存,
PerppetualCache
,是基于HashMap实现的。- 一级缓存:作用域是session级别
- 二级缓存:作用域是namespace和mapper的作用域,不依赖与session
注意事项
- 当缓存的数据更新了,该作用域下所有select中的缓存将被clear
- 缓存的数据需要实现Serializable接口
- 只有会话提交后者关闭后,一级缓存中的数据才会转移到二级缓存中。