Java全栈面试题(四)--Spring框架

本文详细介绍了Spring的核心组件,包括IoC容器、AOP框架和MVC框架,阐述了IOC和AOP的概念及其在实际应用中的优势。此外,文章讨论了Spring MVC的工作流程和常用注解,以及Spring如何解决循环依赖问题。同时还涵盖了Spring事务管理、声明式事务的使用,以及Spring Boot和Spring Cloud的区别。最后,文章提到了MyBatis的相关内容,如#{}和${}的区别、缓存机制以及分页实现。
摘要由CSDN通过智能技术生成

Spring的核心组件

        IoC容器(Inversion of Control):实现了对象的创建、管理和装配的功能,负责对象的实例化和依赖注入,它可以将我们编写的业务逻辑代码和控制流程解耦,提高代码的可重用性和可维护性。

        AOP框架(Aspect-Oriented Programming):基于动态代理实现,可以实现对系统中各个模块的横向逻辑进行统一处理,如事务管理、异常处理等。

        MVC框架(Model-View-Controller):Spring提供了一套轻量级的MVC框架,可以帮助我们更加方便地实现视图层、控制层和模型层的解耦,实现Web应用程序的快速开发。

        JDBC模块:Spring提供了一套JDBC模块,它封装了JDBC操作中的冗余代码,使得数据库操作变得更加简单和高效。

        集成模块:Spring提供了一些集成模块,可以帮助我们更加方便地将Spring集成到其他框架中,如与Struts、Hibernate等框架进行整合。

Spring MVC的核心组件

        DispatcherServlet:Spring MVC最核心的组件,基于Servlet容器实现。它是整个Spring MVC中的请求派发器,负责接收请求并将请求分发给不同的处理器进行处理。

        HandlerMapping:用来映射请求和处理器,DispatcherServlet会根据请求信息来查找合适的HandlerMapping,并将请求分发给相应的Handler进行处理。

        HandlerAdapter:指定如何执行处理器方法并将其结果返回给DispatcherServlet。一个处理器可能有多个HandlerAdapter,用来支持不同的方法返回类型。

        ViewResolver:负责将逻辑视图名称解析为View对象,Spring MVC框架默认提供了多种ViewResolver实现,如InternalResourceViewResolver、JstlView等。

        ModelAndView:包含处理器返回结果以及视图名称等信息,被DispatcherServlet使用来选择对应的视图渲染器进行渲染。

Spring两大核心技术是什么

        IOC和AOP

简单描述对IOC和AOP的理解

        IOC/DI:即控制反转,是一种设计模式,它可以通过将对象之间的依赖关系交给容器来管理,实现松耦合和模块化,使得代码的可维护性和可测试性得到大幅度提升。

        AOP:即面向切面编程,是一种编程思想,它能够将程序中的横切关注点(如日志、事务、安全等)与业务逻辑进行有效的解耦,提高代码的可维护性、可拓展性和可重用性。

        松耦合是指组件之间的关系程度较低,相互之间的耦合度小,彼此之间的影响较少。在程序设计中,松耦合可以提高系统的灵活性、可扩展性和可维护性。

        具体来说,松耦合可以表现为组件之间接口简单、互相独立、修改某一个组件不会影响到其他组件的运行等特点。相反,紧耦合则表示组件之间关系紧密,一旦其中一个组件发生改变,就会直接影响到其他的组件,导致系统的可维护性、可扩展性较差。

AOP能解决那些问题

        可以解决程序中的横切关注点问题,如日志、事务、安全等。

AOP的优点

     横向抽取机制:AOP能够将与业务无关的横切关注点(如日志、安全等)从业务逻辑中分离出来,形成独立的模块。这样可以降低代码的冗余度,提高代码的可维护性和可测试性。

        松耦合:使用AOP可以让各模块之间实现松耦合,即模块之间的依赖关系较弱,修改某一个模块不会影响到其他模块的运行,从而提高了系统的灵活性和可扩展性。

        集中处理:通过AOP,可以将相同的逻辑集中在一起处理,避免了代码的分散和重复,减少了代码的工作量和复杂度。

        代码重用:AOP中的切面可以被多个对象共享,这样就可以减少代码的复制和粘贴,提高代码的重用性和可维护性。

        总的来说,AOP可以使程序的设计更加模块化和可维护,提高代码的可重用性和可扩展性,对于大型复杂的应用程序设计非常有帮助。

AOP是如何实现的

        动态代理实现,AOP是通过将程序的关注点切面化,并在运行时动态地织入切面来实现的。这种方式使得程序各模块之间的耦合度降低,代码的可维护性和可扩展性提高。

        AOP是通过将程序的关注点切面化来实现的。具体来说,AOP将程序中的关注点分为两个维度:横向关注点和纵向关注点。横向关注点是指程序中多个模块都会用到的功能,如日志、事务、安全等;纵向关注点是指程序中某一个模块内部的逻辑关系,如业务逻辑、数据权限等。

        AOP通过给程序添加一组切面来解决横向关注点的问题。切面是一组横切逻辑,与程序的其他逻辑相互独立,可以被多个程序模块共享。在AOP中,切面可以被动态地织入weave)到程序的不同模块中,从而实现对横向关注点的统一处理。

        AOP的实现方式有多种,其中基于动态代理和字节码增强的方式比较常见。在这些实现方式中,程序的字节码会被修改,在运行时生成一个代理对象或修改原对象的字节码,从而在不修改源代码的情况下实现切面的织入。

        织入(weave)是AOP中的一个术语,指将横向关注点(如日志、事务、安全等)的处理逻辑动态地添加到程序的纵向逻辑中。织入可以发生在编译时、类加载时或运行时,其中运行时织入最为常见。

        在AOP中,织入是通过代理对象或修改字节码实现的,它可以在目标对象的方法执行前后插入特定操作,比如记录日志、进行安全检查或开启事务等。因此,织入使得不同模块之间的关注点得到了统一处理,提高了系统的可维护性和可扩展性。

        对于代理对象,织入通常发生在被代理对象的方法调用前后;对于通过修改字节码实现的增强,则是在目标对象的字节码中插入新的指令以实现织入逻辑。在织入时,需要注意不影响目标对象原有的业务逻辑,并且确保织入的逻辑和顺序正确,否则可能会引起意外错误。

        织入是AOP的核心概念,使得AOP框架能够透明地处理系统的各种横向关注点,提高了系统的可读性、可维护性和可拓展性。

简述Spring中常用的几种Advice注解

        @Around:唯一可以使ProceedingJoinPoint参数来控制流程的advice,在方法执行前拦截,可以在切面逻辑中手动释放拦截,且可以在其后加入逻辑代码,该代码段会在方法执行后执行。

        @Before:在目标方法执行前执行,可以用于实现权限控制、事务管理等。

        @After:在目标方法在目标方法执行后无论是否抛出异常都执行,可以用于释放资源、清理缓存等。

        @AfterReturning:在目标方法执行后返回结果时执行,可以用于修改返回值,记录日志等

        @AfterThrowing:在目标方法抛出异常时执行,可以用于统一处理异常,进行资源回收等。

CGLIB代理和JDK代理的区别

        JDK代理只能对实现接口的类生成代理,JDK代理使用的是反射机制实现AOP动态代理。

        CGLIB是针对类实现代理,对指定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式。CGLIB代理使用字节码处理框架ASM,通过修改字节码生成子类。

@Autowired和@Resource注解的区别

        @Autowired属于Spring框架,默认使用类型(byType)进行注入,按照类型匹配失败,在按照名字ByName匹配;

        @Resource是Java的注解,Spring支持@Resource。而@Resource首选按byName自动注入,如果匹配失败再按照类型byType匹配注入。

        @Resource的作用相当于@Autowired。 @Autowired首选按byType自动注入,而@Resource首选按byName自动注入。

Spring如何解决循环依赖问题

       Spring解决循环依赖的机制基于两个核心原理,提前暴露对象和三级缓存机制。这些机制可以帮助Spring在Bean的创建过程中暴露尚未完成实例化的Bean实力,并通过缓存机制协助完成Bean实例创建的过程,从而解决循环依赖问题。具体处理流程如下:

        1.Spring IoC容器在创建Bean实例时,如果发现存在循环依赖关系,则将正在创建的Bean实例暴露给提前暴露对象的机制,从而提前暴露还未完成实例化的Bean实例

        2.当Bean实例被暴露后,Spring会将其放入三级缓存中的ObjectFactory对象集合中的第一级缓存中

        3.如果依赖于当前Bean实例的其他Bean已经创建,且已经完成属

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值