spring中的bean是线程安全的么
spring的bean大部分都是单例的
答案是否定的,绝对不是线程安全的。都不是线程安全的。
一般来说在springbean里很少放实例变量。
事务
实现原理
如果说加了@Transactional注解,Spring就是使用AOP思想,对你这个方法在执行前,先去开启事务,执行完毕后,根据你方法是否报错,来决定回滚还是提交事务。
传播机制
REQUIRED
REQUIRED_NEW
NESTED
SpringBoot核心架构
1.内嵌Tomcat
2.自动装配
比如我们引入mybatis,其实主要引入一个starter依赖,他会一定程度上自动完成mybatis的一些配置和定义,不需要我们手工去做大量的配置了。
bean的生命周期
2.设置对象属性(依赖注入)
这个bean依赖了哪个对象,就把依赖的bean也创建出来,进行注入。
3.处理Aware接口
如果Bean实现了ApplicationContextAware接口,spring容器就会调用我们的bean的setApplicationContext(ApplicationContext)方法,传入Spring上下文,把Spring容器传递给这个bean
把容器自己注入给bean,让bean能够拿到ApplicationContext
4.初始化前:BeanPostProcessor(postProcessBeforeInitialization)
如果我们想在bean实例构建好了以后并且依赖注入好,在这个时间点,我们如果想要对Bean进行一些自定义处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(Object obj,String s)方法。
5.初始化:InitializingBean与init-method:
如果Bean在Spring配置文件中配置了init-method属性,则会自动调用其配置的初始化方法
6.初始化后:BeanPostProcessor(postProcessAfterinitialization)
调用postProcessAfterinitialization(Object obj,String s)方法;由于这个方法是在Bean初始化结束时调用的,所以可以被应用于内存或缓存技术;
7.DisposableBean
当bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destory()方法;
8.destory-method
最后,如果这个Bean的Spring配置中配置了destory-method属性,会自动调用其配置的销毁方法。
SpringMVC
1.http请求走到tomcat的工作线程,<font color="#c41230">工作线程将其请求转交给spring mvc框架的DispatcherServlet</font>
2.DispatcherServlet查找@Controller注解的controller,我们一般会给controller加上@RequestMapping的注解,标注说哪些controller用来处理哪些请求,此时根据请求的uri去定位到找哪个controller去处理。
3.根据RequestMapping去查找使用这个controller内的哪个方法来进行请求的处理,对每个方法一般也会加@RequestMapping的直接
4.它会直接调用controller里的某个方法来处理
5.处理完毕后,controller方法会有一个返回值。以前的时候,一般来说还是走jsp,模版技术。我们还是会把前端页面放在后端的工程里面,返回一个页面模版的名字,spring mvc的框架使用模版技术,对html做一个渲染。但是现在一般前后端分离,返回一个json串,可能前段发送一个请求过来,我们只要返回json数据。<br>
6.再把渲染以后的html页面返回给浏览器去进行显示。前端负责把html页面渲染给浏览器就可以了。