【面试高高手】——Spring(13题)

1.Spring是什么?

Spring是一个开源的、轻量级的Java应用开发框架。通过依赖注入(Dependency Injection)和面向切面编程(Aspect-oriented Programming)等技术,使得开发者可以更加方便地开发可扩展模块化松耦合的应用程序,极大提高了开发效率。

2.为什么需要Spring?

Spring是一个开源的Java应用程序框架,它提供了一种构建和管理企业级应用程序的方式。Spring的存在有多种原因,它为Java开发者提供了许多重要的好处和功能,包括:

  • 简化开发:Spring框架大大简化了Java应用程序的开发。它提供了许多开箱即用的功能,如依赖注入、AOP(面向切面编程)、事务管理等,这些功能可以减少开发人员的工作量。

  • 松散耦合:Spring鼓励松散耦合的设计,使得组件之间的依赖性更低。这有助于提高代码的可维护性、可扩展性和可测试性。

  • 依赖注入:Spring框架支持依赖注入(DI),使得组件之间的依赖关系更容易管理。通过DI,您可以将对象的依赖关系委托给Spring容器,而不是在代码中硬编码。

  • 面向切面编程(AOP):Spring支持AOP,这允许您将横切关注点(如日志记录、安全性、事务管理)与主要业务逻辑分离开来,提高了代码的可重用性和清晰度。

  • 声明式事务管理:Spring提供了声明式事务管理的支持,使得管理数据库事务变得更加容易。这可以帮助确保数据的一致性和可靠性。

  • 集成各种技术:Spring可以与各种不同的技术集成,包括各种持久化框架(如Hibernate、JPA)、消息队列、Web框架(如Spring MVC)、安全框架等等。

  • 测试支持:Spring的设计使得单元测试和集成测试变得更加容易。您可以使用Spring的测试框架来编写和运行测试,以确保代码的质量和稳定性。

  • 模块化:Spring框架是模块化的,您可以选择只使用您需要的模块,而不必引入整个框架。这有助于减小应用程序的体积,并提高性能。

  • 社区支持:Spring拥有一个庞大的社区和活跃的开发团队,因此可以获得广泛的支持、文档和教程。

3.说下你对Spring的AOP、IOC的理解?

  • AOP:AOP的全称是Aspect Orient Programming,即面向切面编程。是对OOP(Object Orient Programming)的一种补充,专门用于处理一些具有横切性质的服务。常常用于日志输出、安全控制、错误处理、权限管理等。极大的降低了代码的冗余,提高代码的可维护性和可复用性。

  • IOC(Inversion Of Controll,控制反转):是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由给Spring框架来管理。对象与对象之间松散耦合,也利于功能的复用。

4.基于java的AOP实现有哪些?

AspectJ、Spring AOP、Cglib、JBoss AOP

5.AOP的原理?

  1. 核心概念
    横切关注点:这些是与主业务逻辑无关但又必需的功能,如日志记录、性能监控、安全验证等。这些关注点往往会散布在多个模块或类的不同方法中,导致代码冗余和难以维护。
    切面(Aspect):切面是一个跨越多个类、对象、方法的模块化单元,它定义了在什么时机、在哪些点上执行什么具体操作。切面可以横切多个对象,并且与主业务逻辑解耦。
  2. 实现机制
    动态代理技术:AOP的实现方式主要是通过动态代理技术,在运行时动态地创建目标对象的代理对象,并在代理对象中插入切面所定义的操作。这种方式不需要修改目标对象的源代码,具有更高的灵活性和动态性。
    静态织入与动态织入:
    静态织入:在编译时期将切面织入目标对象中,生成新的字节码文件。这种方式对目标对象的修改是静态的,不具备动态修改的能力。
    动态织入:在运行时通过代理机制动态地将切面织入目标对象中。这种方式更加灵活,是AOP常用的实现方式。
  3. 主要组件
    通知(Advice):定义了切面中的具体行为,即要执行的操作。根据执行时机的不同,通知可以分为前置通知、后置通知、环绕通知等。
    切入点(Pointcut):指定了通知应该应用于哪些连接点(Join Point)。连接点是应用执行过程中能够插入切面的点,如方法的执行点。
    连接点(Join Point):在Spring AOP中,连接点通常指的是方法的执行点。
    织入(Weaving):将切面与主业务逻辑结合的过程,即将通知应用到具体的连接点上。
  4. 优点
    提高代码复用性:通过将横切关注点封装在切面中,可以在多个地方重复使用这些关注点,减少代码冗余。
    降低耦合度:主业务逻辑与横切关注点解耦,使得系统结构更加清晰,易于维护和扩展。
    提高开发效率:开发人员可以更加专注于主业务逻辑的实现,而不用担心横切关注点的处理。
  5. 应用场景
    AOP广泛应用于日志记录、事务管理、安全控制、性能监控等场景,能够显著提高软件系统的质量和可维护性。

综上所述,AOP的原理是通过将横切关注点从主业务逻辑中分离出来,并通过动态代理技术在运行时将切面织入到主业务逻辑中,从而实现一种更为解耦和灵活的编程方式。

连接点(Join point):指程序运行过程中所执行的方法。在Spring AOP中,一个连接点总代表一个方法的执行。
切面(Aspect):被抽取出来的公共模块,可以用来会横切多个对象。Aspect切面可以看成 Pointcut切点 和 Advice通知 的结合,一个切面可以由多个切点和通知组成。在Spring AOP中,切面可以在类上使用 @AspectJ 注解来实现。
切点(Pointcut):切点用于定义 要对哪些Join point进行拦截。
通知(Advice):指要在连接点(Join Point)上执行的动作,即增强的逻辑,比如权限校验和、日志记录等。通知有各种类型,包括Around、Before、After、After returning、After throwing。
目标对象(Target):包含连接点的对象,也称作被通知(Advice)的对象。 由于Spring AOP是通过动态代理实现的,所以这个对象永远是一个代理对象。
织入(Weaving):通过动态代理,在目标对象(Target)的方法(即连接点Join point)中执行增强逻辑(Advice)的过程。
引入(Introduction):添加额外的方法或者字段到被通知的类。Spring允许引入新的接口(以及对应的实现)到任何被代理的对象。例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。

6.如何使用Java实现动态代理?

什么是动态代理?

动态代理是一种在运行时创建代理类和对象的技术。它允许在不修改原始类代码的情况下,向其添加额外的功能。在Java中,动态代理主要通过两种方式实现:JDK动态代理和CGLIB(Code Generation Library)代理。JDK动态代理是基于接口的代理,利用Java的反射机制来创建代理对象;而CGLIB代理则是基于子类的代理,适用于没有接口的类。

动态代理主要解决了以下几个问题:

代码解耦:通过动态代理,可以将横切关注点(如日志记录、事务管理等)从主业务逻辑中分离出来,降低代码的耦合度。
提高开发效率:开发人员可以更加专注于主业务逻辑的实现,而不用担心横切关注点的处理,从而提高开发效率。
增强功能:在不修改原始类代码的情况下,向其添加额外的功能,如权限校验、数据缓存等。
灵活性:动态代理可以在运行时动态地创建代理对象,因此可以根据需要灵活地添加或删除代理逻辑。、

如何实现动态代理?

(1)JDK动态代理:要求被代理类有接口,代理对象是基于接口动态生成的实现类。使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现。
(2)CGLIB:要求被代理类无接口且不能使用final修饰,代理对象是基于被代理对象动态生成的子对象。使用CGLIB库中的Enhancer类和MethodInterceptor接口来实现。

7. Spring AOP和AspectJ AOP有什么区别?

  • Spring AOP是属于运行时增强,基于代理。而AspectJ是编译时增强,基于字节码操作(Bytecode Manipulation)。
  • AspectJ相比于Spring AOP功能更加强大,
  • Spring AOP相对来说更简单。

8.SpringAOP通知类型?

  • 前置通知(Before Advice)
  • 后置通知(After Advice)
  • 环绕通知(Around Advice)
  • 返回通知(After Returning Advice)
  • 异常通知(After Throwing Advice)

9. springbean的生命周期

在这里插入图片描述
在这里插入图片描述

(1)Bean的创建和配置

Bean定义阶段:
  • 元信息配置:通过XML配置文件、注解(如@Component、@Service等)或Java配置类等方式定义Bean的元信息。
  • 元信息解析:Spring容器启动时,会解析这些配置信息,将Bean的定义转换为Spring内部的BeanDefinition对象。BeanDefinition包含了Bean的各种配置信息,如类名、作用域、依赖关系等。
  • Bean注册阶段:
    将解析后的BeanDefinition注册到Spring容器中,通常是通过BeanDefinitionRegistry接口实现的。
  • Bean实例化前阶段:
    在Bean实例化之前,Spring会进行一些准备工作,如合并BeanDefinition(如果有多个定义的话)、加载Bean的类定义等。
  • Bean实例化阶段:
    Spring容器通过反射机制创建Bean的实例。如果Bean实现了特定的接口(如FactoryBean),则可能通过该接口创建Bean的实例。

(2)Bean的初始化

  • 属性赋值阶段:
    Spring容器将Bean定义中声明的依赖关系注入到Bean的实例中。这通常是通过依赖注入(DI)实现的,包括构造函数注入、Setter方法注入等。
    在属性赋值过程中,Spring会检测Bean是否实现了特定的Aware接口(如BeanNameAware、BeanFactoryAware等),并调用相应的方法将容器信息注入到Bean中。
  • Bean初始化方法调用:
    在Bean的属性赋值完成后,Spring会调用Bean的初始化方法。这可以通过多种方式实现:
    实现InitializingBean接口的afterPropertiesSet()方法。
    使用@PostConstruct注解标注的方法。
    在XML配置文件中或通过@Bean注解的initMethod属性指定初始化方法。

(3)Bean的使用

  • Bean就绪使用阶段:
    经过上述步骤后,Bean已经完成了初始化,并处于就绪状态,可以被应用程序中的其他组件使用。

(4)Bean的销毁

  • Bean销毁前阶段:
    当Spring容器关闭时(例如,应用程序停止时),Spring会调用Bean的销毁方法,以进行资源清理等操作。

(5)Bean销毁阶段:

  • 销毁方法可以通过多种方式实现:
    实现DisposableBean接口的destroy()方法。
    使用@PreDestroy注解标注的方法。
    在XML配置文件中或通过@Bean注解的destroyMethod属性指定销毁方法。

10.什么是SpringMVC?

Spring MVC是Spring框架的一部分,它是一个用于构建Web应用程序的模块,提供了一个基于MVC(模型-视图-控制器)设计模式的框架,用于开发灵活、可维护和可扩展的Web应用程序。

11.SpringMVC的请求流程

![在这里插入在这里插入图片描述

12.SpringMVC的核心组件有哪些?

  • DispatcherServlet(前端控制器): DispatcherServlet是Spring MVC的前端控制器,它接收所有的HTTP请求并负责将请求分派给合适的控制器处理。DispatcherServlet还协调视图的渲染过程。

  • HandlerMapping(处理器映射器): HandlerMapping负责将HTTP请求映射到合适的控制器处理方法上。Spring MVC提供了多种HandlerMapping实现,包括RequestMappingHandlerMapping和BeanNameUrlHandlerMapping等。

  • Controller(控制器): 控制器是Spring MVC中的一个关键组件,它是处理HTTP请求的Java类。控制器包含处理方法,这些方法负责执行具体的业务逻辑,并返回模型数据和视图名称。

  • ModelAndView(模型和视图): ModelAndView是一个封装了模型数据和视图名称的对象。控制器方法通常返回一个ModelAndView,其中包含要传递给视图的数据和要渲染的视图的名称。

  • ViewResolver(视图解析器): 视图解析器负责将逻辑视图名称解析为实际的视图对象。Spring MVC支持多种视图解析器,如InternalResourceViewResolver用于解析JSP视图、ThymeleafViewResolver用于解析Thymeleaf模板等。

  • Interceptor(拦截器): 拦截器允许在请求处理过程中执行预处理和后处理操作。拦截器可以应用于整个应用程序或特定的处理器。它们可以用于实现日志记录、权限检查、国际化等功能。

  • HandlerAdapter(处理器适配器): HandlerAdapter负责将HTTP请求分派给相应的控制器方法,并负责调用控制器方法。不同类型的控制器方法需要不同的适配器来处理,Spring MVC提供了多种适配器。

  • DataBinder(数据绑定): 数据绑定是Spring MVC中的一个核心功能,它将HTTP请求参数绑定到控制器方法的参数上。数据绑定还支持数据验证和类型转换。

  • View(视图): 视图负责渲染模型数据,通常是HTML页面或其他响应内容。Spring MVC支持各种视图类型,包括JSP、Thymeleaf、FreeMarker、JSON视图等。

  • ExceptionResolver(异常解析器): 异常解析器负责捕获和处理应用程序中的异常,并返回适当的错误响应。Spring MVC提供了DefaultHandlerExceptionResolver和SimpleMappingExceptionResolver等异常解析器。

13.Spring的作用域有哪些?

(1)singleton(单例):默认的作用域。在singleton作用域下,Spring容器只会创建一个Bean实例,并在整个应用程序中共享该实例。无论多少次请求,都会返回同一个Bean对象。
(2)prototype(原型):在prototype作用域下,每次请求Bean时,Spring容器都会创建一个新的Bean实例。每个请求都会返回一个不同的Bean对象。
(3)request(请求):在web应用程序中,request作用域表示每个HTTP请求都会创建一个新的Bean实例。Bean将在请求处理期间保持活动状态,然后随请求的结束而销毁。
(4)session(会话):session作用域表示每个用户会话(通常是一个Web会话)都会创建一个Bean实例。Bean将在用户会话期间保持活动状态,然后随会话的结束而销毁。
(5)application(应用程序):application作用域表示在整个Web应用程序的生命周期内只创建一个Bean实例。它将在应用程序启动时创建,直到应用程序关闭时销毁。
(6)websocket(WebSocket):这是Spring 4.0后引入的作用域,用于WebSocket应用程序。它类似于session作用域,但专门用于WebSocket会话。
(7)custom(自定义):除了上述标准作用域之外,您还可以定义自己的自定义作用域,以满足特定的应用程序需求。

14.为什么会有Spring AOP的诞生?

Spring OAP是对 OOP的一个补充。
在面向对象编程(OOP)中,虽然可以通过封装、继承和多态等特性来构建软件,但随着软件规模的增大和复杂度的提升,OOP逐渐暴露出了一些局限性。特别是在处理横切关注点(cross-cutting concerns)时,如日志记录、事务管理、安全检查等,这些关注点往往会散布在多个模块或类的不同方法中,导致代码冗余和难以维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是江迪呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值