后端开发|青训营

66 阅读4分钟

后端开发知识框架汇总 Spring框架 Spring/Springboot/SpringMVC Spring ​ 其是一个引擎,众多衍生产品例如boot、security、jpa等等;但他们的基础都是Spring的ioc和 aop,ioc 提供了依赖注入的容器, aop解决了面向切面编程,然后在此两者的基础上实现了其他延伸产品的高级功能。 Springboot ​ 其是进一步实现了auto-configuration自动配置(另外三大神器actuator监控,cli命令行接口,starter依赖),降低了项目搭建的复杂度。它主要是为了解决使用Spring框架需要进行大量的配置太麻烦的问题。 SpringMVC ​ 其是spring基础之上的一个MVC框架,主要处理web开发的路径映射和视图渲染,属于spring框架中WEB层开发的一部分,其主要分为Model(模型)、VIew(视图)、Controller(控制器)三部分,具体的工作流程如下。 Spring的作用域 1、singleton ​ 保持容器中只存在唯一的单例。Controller亦采用的是单例模式,同时采用ThreadLocal的方式来解决可能存在的线程不安全的问题。 2、propetype ​ 为每个bean请求申请一个实例。申请之后不会再进行管理。 3、request ​ 对每一个网络请求,会申请一个对应的bean容器。 4、session ​ 会保证每个session中有一个对应的实例,在session失效后bean也会失效。 5、global-session ​ 其与portlet有关, IOC/DI(控制反转/依赖注入) ​ IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦,简单来说,**就是对象的创建不再有程序本身去创建,而是交给IOC容器去实现。**IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。Spring中实现依赖注入的主要方式是采用@Autowired的注释, AOP(面向切面编程) ​ AOP即面向切面编程,其最主要的实现方式是采用代理实现的。代理又主要分为两种:静态代理和动态代理。 静态代理主要是令代理人和被代理人共同实现一个类 JDK的动态代理和CGlib的动态代理。 JDK动态代理:JDK的动态代理主要通过代理类和被代理类实现同一个接口实现,同时采用反射的机制,调用对应类的接口实现的AOP。 CGlib动态代理: 底层实现与JDK的动态代理不同,其采用修改对应的ASM的字节码的方式实现。 @Transctional 注解:主要是通过反射获取bean的注解信息,利用AOP对编程式事务进行封装实现。? Springboot自动装配原理 ​ Springboot自动配置原理主要采用三个注解实现,其分别是: 1、EnableAutoConfiguration:该注解主要开启Springboot的自动配置功能。 ​ (1) @AutoConfigurationPackage:利用register注册对应的容器,将指定的一个包下的所有组件导入进来。(默认是main包下的所有组件。) ​ (2) @Import(AutoConfigurationImportSelector.class):底层采用工厂模式从配置文件中读取对应的组件(注意并不是全部加载,会对组件采用@ConditionOnMissingBean等条件进行判断 ) 2、SpringConfiguration,标示启动类是一个SpringConfiguration类,扫描并加载都容器中。 3、ComponetScan,指定对应的包扫描的路径。 Spring循环依赖 循环依赖–>循环引用—>即2个或以上bean 互相持有对方,最终形成闭环。eg:A依赖B,B依赖C,C又依赖A。 Spring循环依赖场景 ①:构造器的循环依赖。【这个Spring解决不了】 StudentA有参构造是StudentB。StudentB的有参构造是StudentC,StudentC的有参构造是StudentA ,这样就产生了一个循环依赖的情况,我们都把这三个Bean交给Spring管理,并用有参构造实例化。 ②【setter循环依赖】field属性的循环依赖【setter方式 单例,默认方式–>通过递归方法找出当前Bean所依赖的Bean,然后提前缓存【放入三层缓存中】。通过提前暴露 -->暴露一个exposedObject用于返回提前暴露的Bean。】Spring是先将Bean对象实例化【依赖无参构造函数】—>再设置对象属性的 原因:Spring先用构造器实例化Bean对象----->将实例化结束的对象放到一个Map中,并且Spring提供获取这个未设置属性的实例化对象的引用方法。结合我们的实例来看,,当Spring实例化了StudentA、StudentB、StudentC后,紧接着会去设置对象的属性,此时StudentA依赖StudentB,就会去Map中取出存在里面的单例StudentB对象,以此类推,不会出来循环的问题喽。