Spring知识要点

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

Spring由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器。是为了解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架 。
核心特性IOC和AOP。通过IoC容器管理POJO对象以及他们之间的耦合关系;通过AOP以动态非侵入的方式来增强服务。


提示:以下是本篇文章正文内容,下面案例可供参考

一、spring的启动流程?

1.创建容器。DefaultListableBeanFactory
2.读取配置。通过BeanDefinitionReader加载配置,转化成BeanDefinition。
3.调用后置处理器,BeanFactoryPostProcessor
4.创建对象,从map中取出BeanDefinition,通过反射的方式创建对象,最终将对象放到一级缓存singletonObjects

二、bean的生命周期

从单例工厂getBean-》没有找到则createBeanInstance创建实例-》populateBean填充属性-》初始化bean执行initMethod等

1.通过反射的方式实例化bean
2.通过populateBean()方法填充bean的属性
3.对实现了aware接口检查
4.BeanPostProcessor前置处理器
5.调用initmethod方法
6.BeanPostProcessor后置处理器
7.获取到完整对象,可以通过getBean来获取
8.销毁,实现DispoableBean接口,destroyMethod方法

三、spring的循环依赖

多个bean相互持有对方的引用,则叫循环依赖。
spring提供了三级缓存来解决循环依赖问题。但是基于构造注入、多例Bean是无法解决循环依赖的。
在这里插入图片描述
一级缓存存放的完整对象、二级缓存存放的早期的对象、三级缓存存放的是(工厂对象)beanName的ObjectFactory的lambda表达式,在调用getObject执行lambda表达式内容在这里插入图片描述
执行流程:
1.先从singletonObjects找
2.没找到再到earlySingletonObjects找
3.没找到再到singletonFactories找,调用getObject执行lambda表达式内容
() -> {return this.getEarlyBeanReference(beanName, mbd, bean);}
4.将lambda表达式返回的对象,放到二级缓存
5.对依赖对象重复12步骤,将依赖对象实例化后放到singletonObjects
6.再对依赖对象进行初始化,最终都放到singletonObjects

四、Spring AOP

Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。

Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:

1、JDK动态代理只提供接口的代理,不支持类的代理。核心InvocationHandler接口和Proxy类,InvocationHandler 通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy利用 InvocationHandler动态创建一个符合某一接口的的实例, 生成目标类的代理对象。

2、如果代理类没有实现 InvocationHandler 接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

五、SpringBoot自动装配原理

自动装配:自动去把第三方组件的bean装载到ioc容器里面,不需要开发人员再去写bean相关的配置。
在启动类上加上@SpringBootApplication就能实现自动装配。@SpringBootApplication是一个符合注解,真正实现自动装配的注解叫@EnableAutoConfiguration。
1.引入starter启动依赖组件,这个组件里面必须要包含一个@Configuration配置类,这个配置类里面需要通过@Bean注解声明要装配到ioc容器里的bean对象。
2.这个配置类放在第三方jar中下,通过spring boot中约定优于配置的理念,去把这个配置类的全路径放在classpath:/META-INF/spring.factories,这样spring就可以知道第三方jar包里这个配置类的位置。这步骤通过SpringFactoriesLoader来完成。
3.spring拿到第三方jar中的配置类后,通过ImportSelector这个接口来实现这些配置类的动态加载,从而来实现自动装配。

注:约定优于配置是一种软件设计范式。本质上是说,系统、类库或框架应该假定合理的默认值,而非要求提供不必要的配置。例如SpringBoot会自动读取application.yml文件,port默认值8080等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值