100个高频Spring面试题,和快手大佬的技术面谈

25、什么是Spring中的依赖注入?


依赖注入是控制反转(IOC)的一个方面,是一个通用的概念,它有很多种表达的方式。这个概念意思你不创建你的对象,但描述他们应该如何创建。你不会在代码中直接将组件和服务耦合在一起,而是描述配置文件中的哪些组件需要哪些服务。然后由一个容器(IOC容器)负责将它们关联起来。

26、紧耦合和松耦合有什么区别?


紧耦合:

  • 紧密耦合是指类之间高度依赖。

松耦合:

  • 松耦合是通过促进单一职责和关注点分离的设计来实现的。

27、IOC(依赖注入)有哪些不同类型?


  • 构造方法注入:基于构造方法的依赖注入是在容器调用一个带有多个参数的类构造方法时完成的,每个参数都表示对其他类的依赖。

  • Setter注入:Setter注入是由容器在调用无参数构造方法或无参数静态工厂方法实例化Bean后调用Bean的Setter方法来实现的。

28、你建议使用构造方法注入还是Setter注入?


可以同时使用构造方法注入和Setter注入。最好的解决方案是对强制依赖项使用构造方法注入,对可选依赖项使用setter方法注入。

C.Spring Beans

================================================================================

29、Spring beans是什么?


Spring bean是构成Spring应用程序主干的Java对象。它们由springioc容器实例化、组装和管理。这些bean是使用提供给容器的配置元数据创建的,例如,XML中形式定义。

spring框架中定义的bean是单例bean。bean标记中有一个名为“singleton”的属性,如果指定为true,则bean为单例;如果设置为false,则bean将成为prototype bean。默认设置为true。所以,spring框架中的所有bean默认都是单例bean。

30、Spring bean定义包含什么?


Spring bean的定义包含容器如何创建Bean、其生命周期及其依赖关系所需的所有配置元数据。

31、如何向Spring容器提供配置元数据?


向Spring容器提供配置元数据有三种重要方法:

32、怎么定义bean的作用域?


在Spring中定义时,我们还可以为bean声明一个作用域。它可以通过bean定义中的scope属性来定义。例如,当Spring每次需要生成一个新的bean实例时,这个bean的scope属性就是prototype。另一方面,当Spring每次需要时都必须返回同一个bean实例时,bean scope属性必须设置为singleton。

33、说明Sprig支持的bean作用域


  • singleton:Spring将bean定义的范围限定为每个Spring IOC容器只有一个单实例。

  • prototype:单个bean定义有任意数量的对象实例。

  • request:作用域为一次http请求,该作用域仅在基于web的Spring ApplicationContext情形下有效。

  • session:作用域为HTTP Session,该作用域仅在基于web的Spring ApplicationContext情形下有效。

  • global-session:作用域为全局的HTTP session。该作用域也是仅在基于web的Spring ApplicationContext情形下有效。

默认的作用域是singleton。

34、单例作用域是线程安全的吗?


不,单例bean在Spring框架中不是线程安全的。

35、解释Spring Bean的声明周期


  • Spring容器 从XML 文件中读取bean的定义,并实例化bean。

  • Spring填充bean定义(DI)中指定的所有属性。

  • 如果bean实现了BeanNameAware接口,spring会将bean的id传递给setBeanName()方法。

  • 如果有任何BeanBeanPostProcessor与该bean关联,Spring将调用postProcesserBeforeInitialization()方法。

  • 如果bean实现了IntializingBean,则调用其afterPropertySet()方法。如果bean声明了init方法,则调用指定的init方法。

  • 如果有任何与bean关联的beanPostProcessor,则将调用它们的postProcessAfterInitialization()方法。

  • 如果bean实现l了DisposableBean,它将调用destroy()方法。

36、有哪些重要的bean生命周期方法?你能重写它们吗?


有两个重要的生命周期方法。

第一个是setup,当bean加载到容器中时调用它。第二个方法是teardown方法,当bean从容器中卸载时调用该方法。

bean标签有两个重要的属性(init-method和destroy-method),可以用它们定义自己的自定义初始化和销毁方法。还有相应的注解(@PostConstruct和@PreDestroy)。

37、Spring的内部bean是什么?


当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean,为了定义内部bean,在Spring 的 基于XML的 配置元数据中,可以在 < property/ >或 < constructor-arg/ > 元素内使用< bean/ > 元素,内部bean通常是匿名的,它们的作用域一般是prototype。

38、如何在Spring中注入Java集合?


Spring提供以下几种集合的配置元素:

  • 类型用于注入一列值,允许有相同的值。

  • 类型用于注入一组值,不允许有相同的值。

  • 类型用于注入一组键值对,键和值都可以为任意类型。

  • 类型用于注入一组键值对,键和值都只能为String类型。

39、什么是Spring Bean装配?


装配,或bean 装配是指在Spring 容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起。

40、什么是Bean自动装配?


Spring 容器能够自动装配自动关联的bean,这意味着,通过检查BeanFactory的内容,而不使用

41、解释不同类型的自动装配


自动装配有五种模式,可用于指示Spring容器使用autowiring进行依赖注入:

  • no:默认的方式是不进行自动装配,通过显式设置ref 属性来进行装配。

  • byName:通过参数名 自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。

  • byType:过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出异常。

  • constructor:这个方式类似于byType, 但是要提供构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。

  • autodetect:首先尝试使用constructor来自动装配,如果不行,则使用byType方式。

42、自动注入有限制吗?


自动注入的限制:

  • 重写: 你仍可以用 < constructor-arg >和 < property > 配置来定义依赖,这些配置将始终覆盖自动注入。

  • 基本数据类型:不能自动装配简单的属性,如基本数据类型、字符串和类。

  • 模糊特性:自动装配不如显式装配精确,如果有可能尽量使用显示装配。

43、你能在Spring中注入null和空字符串吗?


是的,可以。

D.Spring注解

============================================================================

44、有哪些重要的Spring注解?


我在项目中使用的一些Spring注解:

  • @Component:用于指示类是组件。这些类用于自动注入,并在使用基于注解的配置时配置为bean。

  • @Controller:是一种特定类型的组件,用于MVC应用程序,主要与@RequestMapping注解一起使用。

  • @Repository:用于表示组件用作存储库和存储/检索/搜索数据的操作。我们可以将此注解应用于DAO实现类。

  • @Service:用于指示类是服务层。

  • @Required:此注解简单地说明作用的bean属性必须在配置时通过bean定义中的显式属性值或通过自动注入填充。如果作用的bean属性未填充,容器将抛出BeanInitializationException。

  • @ResponseBody:用于将对象作为response,通常用于将XML或JSON数据作为response发送。

  • @PathVariable:用于将动态值从URI映射到处理方法参数。

  • @Autowired:对自动注入的位置和方式提供了更细粒度的控制。它可以用于在setter方法上自动注入bean。就像@Required 注解一样,修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法。

  • @Qualifier:当有多个相同类型的bean并且只需要将一个bean自动注入时,@Qualifier注解与@Autowired注释一起使用,通过指定将连接哪个bean来消除歧义。

  • @Scope:配置Spring bean的作用域。

  • @Configuration:表示Spring IOC容器可以将该类用作bean定义的源。

  • @ComponentScan:应用此注解时,将扫描包下的所有可用类。

  • @Bean:对于基于java的配置,用@Bean注解修饰的方法将返回一个在Spring应用程序上下文中注册为Bean的对象。

  • 用于配置切面和通知、@Aspect、@Before、@After、@Around、@Pointcut等的AspectJ注解。

45、@RequestParam注解的作用是什么?


spring中的@RequestParam注解将查询字符串的参数值绑定到控制器的方法参数。

46、注解@Primary的重要性


当有多个相同数据类型的bean时,开发人员Spring的@Primary注解,它会自动为特定bean提供更高的优先级。这个注解可以用在任何直接或间接用@Component注解修饰的类上,也可以用在用@Bean注解修饰的方法上。

47、XML配置和注解之间有什么区别?


注解的优点:

  • 所有信息都在一个文件中

  • 当类更改了,不用修改xml配置文件

xml配置的优点:

  • POJO及其行为之间更清晰地分离

  • 当你不知道哪个POJO负责该行为时,更容易找到该POJO

48、@SpringBootApplication的作用是什么?


@SpringBootApplication注解是在springboot1.2.0中引入的,它支持自动配置特性。

此批注封装了三种不同注解的作用:

  • @Configuration:允许开发人员显式地注册bean

  • @ComponentScan:启用组件扫描,这样控制器类和其他组件将被自动发现并注册为Spring应用程序上下文中的bean

  • @EnableAutoConfiguration:启动SpringBoot的自动配置特性

此注解可以使用以下可选参数:

  • exclude:从自动配置中排除的类列表

  • excludeNames:从自动配置中排除完全限定类名的列表

  • scanBasePackage:其中提供了扫描程序包的列表

  • scanBasePackageClasses:提供必须应用于扫描的其他包中的类的列表

49、解释@InitBinder?


此注解修饰在声明日期格式的方法上,并且在整个类中,使用定义的日期格式。每当绑定作用在日期字段@InitBinder注解中时,说明使用CustomDateEditor,而CustomDateEditor则使用@InitBinder中声明的日期格式。

50、定义@ControllerAdvice


有@ControllerAdvice注解的类可以显式声明为Spring bean,或者通过类路径扫描自动注入。所有这样的bean都是通过AnnotationAwareOrderComparator排序的,即基于@Order和Ordered,并在运行时按该顺序调用。对于处理异常,将使用匹配的异常处理程序方法在第一个通知上选择一个@ExceptionHandler。对于模型属性和InitBinder初始化,@ModelAttribute和@InitBinder方法也将遵循@ControllerAdvice顺序。

51、我们可以将一个个对象作为控制器处理程序方法的响应吗?


是的,我们可以使用@ResponseBody注解在restful web服务中发送基于JSON或XML的响应。

52、解释@ModelAttribute?


@ModelAttribute注解引用模型对象的属性,用于准备模型数据。此注解将方法变量或模型对象绑定到命名的模型属性。此注解接受一个可选值,该值表示模型属性的名称。@ModelAttribute注解可以在参数级别或方法级别使用。在参数级别使用此注解是为了接受请求表单值,而在方法级别则是将默认值分配给模型。

53、@RequestMapping注解


@RequestMapping注解用于将web请求映射到处理程序类(即控制器)或处理程序方法上,它可以在方法级或类级使用。如果开发人员在类级别使用@RequestMapping注释,它将作为方法级路径的相对路径。

54、什么是spring中基于java的配置?给出一注解示例


基于Java的配置选项使你能够在不使用XML的情况下编写大多数Spring配置,但是需要一些基于Java的注释的帮助。

一个例子是@Configuration注释,它表示spring IOC容器可以将该类用作bean定义的源。另一个例子是@Bean注解的方法,该方法将返回一个对象,该对象应在Spring应用程序上下文中注册为bean。

55、什么是基于注解的容器配置?


XML配置之外的另一种选择是基于注解的配置,它依赖字节码元数据来装配组件,而不是尖括号声明。开发人员不使用XML来描述bean装配,而是通过在相关的类、方法或字段声明上使用注解将配置移动到组件类中。

56、如何打开注解装配?


默认情况下,Spring容器中的注解装配不会打开。为了使用基于注解的装配,我们必须在Spring配置文件中配置context:annotation-config/ 元素。

E.Spring 数据访问

===============================================================================

57、Spring JDBC API中有哪些类?


  • JdbcTemplate

  • SimpleJdbcTemplate

  • NamedParameterJdbcTemplate

  • SimpleJdbcInsert

  • SimpleJdbcCall

58、如何在Spring框架中更高效地使用JDBC?


使用SpringJDBC 框架,资源管理和错误处理的代价都会被减轻。所以开发者只需写statements 和 queries从数据存取数据,JDBC也可以在Spring框架提供的模板类的帮助下更有效地被使用,这个模板叫JdbcTemplate 。

59、JdbcTemplate


JdbcTemplate 类提供了很多便利的方法解决诸如把数据库数据转变成基本数据类型或对象,执行写好的或可调用的数据库操作语句,提供自定义的数据错误处理。

60、如何通过spring JdbcTemplate获取数据?


有两个接口可用于从数据库中获取数据:

61、NamedParameterJdbcTemplate的优点是什么?


NamedParameterJdbcTemplate是基于spring提供的JDBCTemplate构建的,用于与数据库的底层交互。它可以将SQL查询参数作为键值对传递。因此,与索引或“?”相比,程序代码的可读性要高得多,因此可以作为更好的标识“?“”占位符方法。特别是在参数数目庞大的情况下,后者更难跟踪。

62、什么是SpringJDBCTemplate类以及如何使用它?


JdbcTemplate类执行SQL查询、update语句和存储过程调用,对结果集执行迭代,并提取返回的参数值。它隐式处理资源的创建和释放,从而避免诸如忘记关闭连接之类的错误。它还捕获JDBC异常并进行包装。

63、 JDBC和Spring JDBC有什么区别?


Spring JDBC在JDBC的顶层提供数据操作:

1、定义连接参数

2、打开连接

3、指定语句

4、准备并执行语句

5、设置循环以迭代结果(如果有)

6、操作每个迭代

7、处理任何异常

8、处理事务

9、关闭连接

64、Spring DAO支持


Spring中对数据访问对象(DAO)的支持目的使人们更容易以一致的方式使用JDBC、Hibernate或JDO等数据访问技术。这使我们可以相当容易地在持久性技术之间切换,也可以不必担心捕捉每种技术特有的异常。

65、使用Spring访问Hibernate有哪些方式?


有两种方式使用Spirng访问Hibernate。

  • 使用Hibernate模板和回调进行控制反转。

  • 扩展HibernateDAOSupport并应用AOP拦截器节点。

66、Spring支持的ORM


Spring支持下面的ORM:

  • Hibernate

  • iBatis

  • JPA(Java持久化API)

  • TopLink

  • JDO (Java Data Objects)

  • OJB

67、如何使用HibernateDaoSupport集成Spring和Hibernate?


用Spring的 SessionFactory 调用 LocalSessionFactory。集成过程分三步:

  • 配置the Hibernate SessionFactory

  • 继承HibernateDaoSupport实现一个DAO

  • 在AOP支持的事务中装配

68、Spring支持的事务管理类型?


  • 编程式事务管理: 这意味你通过编程的方式管理事务,给你很大的灵活性,但是难维护。

  • 声明式事务管理: 这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。

69、Spring框架的事务管理有哪些优点?


  • 它提供了跨不同事务api(如JTA、JDBC、Hibernate、JPA和JDO)的一致编程模型。

  • 它为编程事务管理提供了比JTA等许多复杂事务API更简单的API。

  • 它支持声明式事务管理。

  • 它很好地集成了Spring的各种数据访问抽象。

70、哪种事务管理类型更可取?


大多数Spring框架的用户选择声明式事务管理,因为它对应用代码的影响最小,因此更符合一个无侵入的轻量级容器的思想。声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式允许你通过代码控制事务)少了一点灵活性。

F:Spring AOP

==============================================================================

71、解释AOP


面向切面编程,或AOP, 是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。

72、AOP有哪些优点?


a.它是非侵入性的

  • 你的service/domain类被切面通知,而无需在service/domain类中添加任何与spring aop相关的类或接口。

  • 允许开发人员专注于业务代码,而不是切点。

b.它是用纯Java实现的

  • 不需要特殊的编译单元或特殊的类加载器

c.它使用Spring的IOC进行依赖注入

  • 切面可以配置为普通的spring bean。

d.与任何其他AOP框架一样,它将横切关注点编织到类中,而不从这些类中调用横切关注点。

e.集中或模块化横切关注点

  • 易于维护和更改切面

  • 改变需要在一处进行。

  • 在你不希望有的类中有日志记录,可以通过修改相应切面(日志切面)中的切入点来轻松实现。所以你只需要在一个地方做出改变。

f.用于使用基于模式(XML配置)或@AspectJ基于注解的方式创建切面。

g.易于配置

73、AOP有哪些实现?


AOP实现:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后总结

ActiveMQ+Kafka+RabbitMQ学习笔记PDF

image.png

  • RabbitMQ实战指南

image.png

  • 手写RocketMQ笔记

image.png

  • 手写“Kafka笔记”

image

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦
的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-gXbwZNrJ-1711721644610)]
[外链图片转存中…(img-PcQ6aTlW-1711721644610)]
[外链图片转存中…(img-WBjDxrSA-1711721644610)]
[外链图片转存中…(img-2dASaIGe-1711721644611)]
[外链图片转存中…(img-wRBfK4Zs-1711721644611)]
[外链图片转存中…(img-LmatbE7h-1711721644611)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-MauJR2PK-1711721644612)]

最后总结

ActiveMQ+Kafka+RabbitMQ学习笔记PDF

[外链图片转存中…(img-103QRy74-1711721644612)]

  • RabbitMQ实战指南

[外链图片转存中…(img-vVHxGp51-1711721644612)]

  • 手写RocketMQ笔记

[外链图片转存中…(img-I6N564Ki-1711721644613)]

  • 手写“Kafka笔记”

[外链图片转存中…(img-GNxqjtI1-1711721644615)]

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值