Spring面试题系列-5

简介: Spring面试题系列-5


Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。

为什么要使用AOP?

使用AOP(面向切面编程)的原因可能包括以下几点:

  1. 分离关注点:AOP允许开发者将横切关注点(如日志记录、安全检查、事务管理等)从业务逻辑中分离出来,使得这些关注点的实现可以独立于业务逻辑进行。
  2. 代码重用:通过AOP,横切关注点的实现可以在多个地方重用,避免了重复编写相同功能的代码,提高了代码的复用性。
  3. 动态代理:AOP通常使用动态代理技术在不修改源码的基础上对已有方法进行增强,这样可以在运行时动态地添加或修改行为,增加了程序的灵活性。
  4. 提高可维护性:由于横切关注点的代码被集中管理,当需要修改或更新这些功能时,只需在一个地方进行修改,而不需要在散布于各处的业务逻辑代码中寻找和修改,大大提高了代码的可维护性。
  5. 设计更清晰:使用AOP可以使系统设计更加清晰,因为相关的代码被组织在一起,而不是分散在多个类或对象中。
  6. 减少模块间耦合:通过将横切关注点与业务逻辑分离,可以减少模块之间的耦合度,使得各个模块更加独立,易于理解和测试。
  7. 提升效率:在大型项目中,使用AOP可以节省大量的开发时间,因为开发者不需要手动在每个业务逻辑中添加横切关注点的代码。

综上所述,AOP是一种强大的编程范式,其可以提高代码的重用性、可维护性和清晰性,同时减少模块间的耦合,提高开发效率。是现代软件开发中不可或缺的工具之一。

AOP中的相关术语

AOP(面向切面编程)是一种编程范式,用于将横切关注点从业务逻辑中分离出来,以提高代码的可维护性和重用性。以下是一些与AOP相关的术语及其解释:

  • Joinpoint(连接点):指在程序执行过程中可以被AOP框架拦截的特定点,通常是指方法。
  • Pointcut(切入点):定义需要对哪些连接点进行拦截,是选择连接点的一种方式。
  • Advice(通知/增强):定义了在连接点被拦截后要执行的动作,包括前置、后置、异常、最终和环绕通知。
  • Introduction(引介):一种特殊类型的通知,可以在不修改类代码的情况下,为类动态添加方法或字段。
  • Target(目标对象):AOP代理的目标对象,即被AOP增强的原始对象。
  • Weaving(织入):将切面应用到目标对象上,创建出被通知(增强)的对象的过程。Spring采用动态代理织入,而AspectJ提供编译期和类加载期织入。
  • Proxy(代理):经过AOP织入增强后生成的对象。
  • Aspect(切面):包含切入点和通知的模块化关注点,它定义了在哪些点执行什么样的增强逻辑。

这些术语共同构成了AOP的核心概念,它们使得AOP能够通过声明式的方式实现横切关注点的模块化,从而在不改变原有业务逻辑代码的基础上,增加额外的行为或功能。

Spring选择那种方式代理?

Spring主要使用两种方式进行AOP代理:JDK动态代理和CGLIB代理

首先,当目标对象实现了一个或多个接口时,Spring AOP会使用JDK动态代理。这是因为JDK动态代理要求目标对象必须实现接口,它通过反射机制在运行时动态地创建一个代理类,该代理类实现了与目标对象相同的接口,并在调用接口方法时提供预先定义的增强逻辑。

其次,如果目标对象没有实现任何接口,或者需要代理的是final类,Spring AOP将使用CGLIB代理。CGLIB是一个第三方库,它可以在内存中动态创建新的类,这些类继承自目标类并实现了所需的增强功能。从Spring 4.3版本开始,CGLIB已经包含在Spring框架中,因此不需要额外导入。

总的来说,这两种代理方式都允许在不修改原有代码的基础上,为目标对象添加额外的行为或功能。代理技术是实现AOP的核心和关键技术,它使得可以在运行时对目标对象的特定方法进行增强处理,如日志记录、安全检查等横切关注点的处理。通过这种方式,Spring AOP能够提高代码的重用性和可维护性,同时减少了模块间的耦合度。

Spring引入外部配置文件的方式

Spring框架提供了多种方式来引入外部配置文件,这些方式包括但不限于命令行参数、环境变量以及使用注解等。具体来看:

  1. 命令行参数:可以通过命令行参数指定一个配置文件,这会使得默认的application.propertiesapplication.yml文件失效,即指定的配置文件将替换默认文件。
  2. 环境变量:Spring Boot 支持通过环境变量来进行配置,这是一种在不同环境下使用同一套应用程序代码的常用方法。
  3. **@PropertySource **:可以使用@PropertySource注解在类路径下指定一个或多个属性文件。
  4. spring.config.import:通过设置spring.config.import属性,可以导入classpath下任意目录的文件作为配置文件。
  5. **@ImportResource **:使用@ImportResource注解可以直接加载Spring的XML配置文件。
  6. 全注解方式:Spring还提供了全注解的方式来加载配置,这种方式不需要显式的配置文件,而是通过注解来指定配置信息。

以上这些方式为开发者提供了灵活的配置选择,可以根据实际项目的需要和开发环境来选择最合适的配置方式。

相关文章
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
96 2
|
1月前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
57 2
|
1月前
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
|
6月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
134 0
|
7月前
|
消息中间件 缓存 Java
Spring Boot最经典的20道面试题,你都会了吗?
Spring Boot最经典的20道面试题,你都会了吗?
252 0
|
3月前
|
设计模式 缓存 Java
面试题:谈谈Spring用到了哪些设计模式?
面试题:谈谈Spring用到了哪些设计模式?
|
3月前
|
Java 程序员 Spring
Spring事务的1道面试题
每次聊起Spring事务,好像很熟悉,又好像很陌生。本篇通过一道面试题和一些实践,来拆解几个Spring事务的常见坑点。
Spring事务的1道面试题
|
3月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
241 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
4月前
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
177 3
|
5月前
|
存储 缓存 Java
面试问Spring循环依赖?今天通过代码调试让你记住
该文章讨论了Spring框架中循环依赖的概念,并通过代码示例帮助读者理解这一概念。
面试问Spring循环依赖?今天通过代码调试让你记住
下一篇
开通oss服务