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已经创建,且已经完成属