【Spring我可以讲半小时】

简介: 【Spring我可以讲半小时】

Spring Bean的生命周期四个阶段

  1. 实例化 Instantiation
  2. 属性赋值 Populate
  3. 初始化 Initialization
  4. 销毁 Destruction

影响多个Bean的接口有二个,InstantiationAwareBeanPostProcessor作用于实例化阶段的前后,BeanPostProcessor作用于初始化阶段的前后。


只调用一次的接口,有Aware类型的接口和生命周期接口二种。

aware类型的接口可以分为二组:

Aware Group1


BeanNameAware

BeanClassLoaderAware

BeanFactoryAware


Aware Group2


EnvironmentAware

EmbeddedValueResolverAware能够获取Spring EL解析器,用户的自定义注解需要支持spel表达式的时候可以使用。

ApplicationContextAware(ResourceLoaderAware\ApplicationEventPublisherAware\MessageSourceAware)

ApplicationContext是一个复合接口,返回值都是当前的ApplicationContext对象。


生命周期的接口


InitializingBean:对应生命周期的初始化阶段,Spring将调用他们的afterPropertiesSet()方法。如果bean使用init-method声明了初始化方法,该方法也会被调用。

DisposableBean:对应生命周期的销毁阶段,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。

生命周期流程


Spring的自动装配

使用@Autowired注解自动装配指定的bean,在启动spring IoC时,容器自动加载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied的时候,就会在IoC容器自动查找需要的bean,并且注入对象的属性,使用@Autowired的时候,首先在容器中查询对应类型的bean,如果查询结果刚好为一个,就将这个bean装配给@Autowired指定的数据,如果查询的结果不止一个,那么@Autowired会根据名称来查找,如果上述查找的结果为空,那么会抛出异常,解决方法可以使用required=false。如果使用@Resource它默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。

Spring使用三级缓存解决循环依赖的过程

  1. 一级缓存存放实例化对象 。
  2. 二级缓存存放已经在内存空间创建好但是还没有给属性赋值的对象。
  3. 三级缓存存放对象工厂,用来创建提前暴露到bean的对象。
@Service
public class TestService1 {
    @Autowired
    private TestService2 testService2;
    public void test1() {
    }
}
@Service
public class TestService2 {
    @Autowired
    private TestService1 testService1;
    public void test2() {
    }
}


testService1先去一级缓存看有没有实例,发现没有,继续去二级缓存查看,发现没有,去三级缓存查看,发现没有实例就创建实例,在创建的过程中,提前暴露,添加到三级缓存里。


这个时候进行属性赋值,发现还有一个testService2,它没有赋值,是一个空的,就从一级缓存中去看testSerivce2有没有实例,发现没有,去二级查看发现没有,去三级缓存查看,发现没有,就创建实例,也提前暴露,添加到三级缓存里面。


这个时候testSerivce2对象里面发现testService1里面没有赋值,然后对testService1进行赋值,从一级缓存去查看,发现没有,去二级查看,发现没有,去三级查看,发现有,就把实例testService1从三级缓存添加到二级缓存里面,把实例testService1三级缓存的实例删除,这个时候,testService2里面有实例对象,对象里面的testService1也有值了,就是一个可以使用的实例对象了,就把这个对象移动到一级缓存里面,把三级缓存里面的testService2删除。


这个时候testService1里面的testService2属性就可以从一级缓存里面获取这个testService2实例了,把它进行赋值填充,testService1也完成了实例化,把testService1从二级缓存移动到一级缓存里面,把testService1在二级缓存的实例也删除。


Spring的事务与AOP实现原理

Spring事务属于AOP范畴,它的底层也是需要数据库的支持,初始化时会看目标类有没有实现InvocationHandler接口或者是Proxy类,如果实现了通过反射来接收被代理的类,如果没实现就利用cglib进行AOP动态代理,CGLIB是通过继承的方式做的动态代理,是一个代码生成的类库,可以在运行时动态的生成某个类的子类,将目标对象转变为代理对象对事务进行操作,通过代理对象对数据库的操作来进行事务处理,没有异常就进行事务提交,有异常就进行事务回滚。


Spring容器启动执行流程

部署一个web应用在web容器中,它会提供一个全局的上下文环境,这个上下文就是ServletContext,它为后面的IoC容器提供宿主环境,当web容器启动的时候,会执行web.xml中的ContextLoaderListener监听器初始化contextInitialized方法,调用父类的initWebApplicationContext方法,这个方法里面执行了三个任务:1.创建WebApplicationContext容器,2.加载context-param中spring配置文件,3.初始化配置文件并且创建配置文件中的bean。监听器初始化完毕后,开始初始化web.xml中配置的servlet ,用DispatcherServlet举例,它是一个前端控制器,用来转发、匹配、处理每个servlet 请求。DispatcherServlet上下文在初始化的时候会建立自己的上下文,先从ServletContext 中获取之前的WebApplicationContext作为自己上下文的父类上下文,有了这个父类上下文之后,再初始化自己持有的上下文,创建springmvc相关的bean,初始化处理器映射、视图解析等等,初始化完后,spring把Servlet的相关的属性作为属性key,存到servletcontext中,方便后面使用。这样每个Servlet 都持有自己的上下文,拥有自己独立的bean 空间,各个servlet 共享相同的bean,也就是根上下文定义的那些bean。web容器停止时候会执行ContextLoaderListener的contextDestroyed方法销毁context容器。


整个图片,歇歇眼,文章大多不换行,排版基本都是一块的,三千字,口速快的话,半个小时差不多可以讲完,这篇博文主要是针对面试口述的,备战面试。


相关文章
|
2月前
|
Java 应用服务中间件 数据库
死磕-Spring Boot(一)
死磕-Spring Boot(一)
死磕-Spring Boot(一)
|
2月前
|
消息中间件 Java 程序员
死磕-Spring Boot(二)
死磕-Spring Boot(二)
|
2月前
|
NoSQL Java Redis
死磕-Spring Boot(三)
死磕-Spring Boot(三)
|
Java Spring
三分钟了解Spring Boot启动原理
大家通常只需要给一个类添加一个@SpringBootApplication 注解,然后再加一个main 方法里面固定的写法 SpringApplication.run(Application.class, args); 那么spring boot 到底是如何启动服务的呢。 接下来咱们通过源码解析。 Spring Boot 的启动原理可以概括为以下几个步骤: 加载 Spring Boot 应用程序的启动类 根据启动类所在的包路径扫描相关的类 根据扫描到的类自动配置 Spring 应用程序 启动嵌入式的 Web 服务器 运行 Spring 应用程序
218 0
|
前端开发 Java 关系型数据库
《我要进大厂》- Spring/SpringBoot 常用注解 夺命连环11问,你能坚持到第几问?(Spring/SpringBoot注解篇)(二)
《我要进大厂》- Spring/SpringBoot 常用注解 夺命连环11问,你能坚持到第几问?(Spring/SpringBoot注解篇)
《我要进大厂》- Spring/SpringBoot 常用注解 夺命连环11问,你能坚持到第几问?(Spring/SpringBoot注解篇)(二)
|
安全 Java 应用服务中间件
Spring Boot学习第二天
Spring Boot学习第二天
118 0
Spring Boot学习第二天
|
开发框架 前端开发 Java
Spring Boot学习第一天
Spring Boot学习第一天
162 0
Spring Boot学习第一天
|
XML JSON 前端开发
《我要进大厂》- Spring/SpringBoot 常用注解 夺命连环11问,你能坚持到第几问?(Spring/SpringBoot注解篇)(一)
《我要进大厂》- Spring/SpringBoot 常用注解 夺命连环11问,你能坚持到第几问?(Spring/SpringBoot注解篇)
《我要进大厂》- Spring/SpringBoot 常用注解 夺命连环11问,你能坚持到第几问?(Spring/SpringBoot注解篇)(一)
|
SQL 前端开发 Java
Spring | 三分钟带你了解什么是Spring
三分钟带你了解什么是Spring
135 0
Spring | 三分钟带你了解什么是Spring
|
存储 JSON 安全
《我要进大厂》- Spring/SpringBoot 常用注解 夺命连环11问,你能坚持到第几问?(Spring/SpringBoot注解篇)(三)
《我要进大厂》- Spring/SpringBoot 常用注解 夺命连环11问,你能坚持到第几问?(Spring/SpringBoot注解篇)
下一篇
无影云桌面