【2022最新】Spring核心概念面试题

在这里插入图片描述

Spring面试题

什么是Spring框架?Spring有哪些核心模块

  Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。Spring框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成Spring框架,不必担心Spring是如何在后台进行工作的。
  Spring框架至今已集成了20多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。
在这里插入图片描述

核心模块说明
Spring Core核心容器:核心容器提供Spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现。BeanFactory使用控制反转(IoC)模式将应用的配置和依赖性规范与实际的应用程序代码分开
Spring Context应用上下文: 是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,如JNDI、EJB、电子邮件、国际化、校验和调度功能
Spring AOP面向切面编程: 是面向对象编程的有效补充和完善,Spring的AOP是基于动态代理实现的,实现的方式有两种分别是Schema和AspectJ这两种方式
Spring DaoJDBC和Dao模块: JDBC、DAO的抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理,和不同数据库供应商所抛出的错误信息。异常层次结构简化了错误处理,并且极大的降低了需要编写的代码数量,比如打开和关闭链接
Spring ORM对象实体映射: Spring框架插入了若干个ORM框架,从而提供了ORM对象的关系工具,其中包括了Hibernate、JDO和 IBatis SQL Map等,所有这些都遵从Spring的通用事物和DAO异常层次结构。
Spring WebWeb模块: Web上下文模块建立在应用程序上下文模块之上,为基于web的应用程序提供了上下文。所以Spring框架支持与Struts集成,web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作
Spring Web MVCMVC模块:MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的。MVC容纳了大量视图技术,其中包括JSP、POI等,模型由JavaBean构成,存放于m当中,而视图是一个接口,负责实现模型,控制器表示逻辑代码,由c的事情。Spring框架的功能可以用在任何J2EE服务器当中,大多数功能也适用于不受管理的环境。Spring的核心要点就是支持不绑定到特定J2EE服务的可重用业务和数据的访问的对象,毫无疑问这样的对象可以在不同的J2EE环境,独立应用程序和测试环境之间重用。

在这里插入图片描述

使用Spring框架的好处有哪些?

序号好处说明
1轻量Spring 是轻量的,基本的版本大约2MB。
2控制反转Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,
而不是创建或查找依赖的对象们。
3面向切面编程(AOP)Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
4容器Spring 包含并管理应用中对象的生命周期和配置。
5MVC框架Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
6事务管理Spring 提供一个持续的事务管理接口,
可以扩展到上至本地事务下至全局事务(JTA)。
7异常处理Spring 提供方便的API把具体技术相关的异常
(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。
8最重要的用的人多!!!

BeanFactory和ApplicationContext有什么区别?

  在类图关系上BeanFactory是ApplicationContext接口的父接口
在这里插入图片描述
在这里插入图片描述

BeanFactory

  是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。

ApplicationContext

  ApplicationContext接口是由BeanFactory接口派生而来,因而具有BeanFactory所有的功能。ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继承,ApplicationContext包还提供了以下的功能

  1. MessageSource, 提供国际化的消息访问
  2. 资源访问,如URL和文件
  3. 事件传播
  4. 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层

其实通过上面的类图大家应该也能看的出来BeanFactory和ApplicationContext的区别的。

Spring有几种配置方式?

序号配置方式
1基于XML的配置
2基于注解的配置
3基于Java的配置

怎样用XML方式配置Spring?

1.创建xml配置文件

  在项目资源目录下创建applicationContext.xml文件,如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans.xsd">
 </beans>

2.加载容器

  如果是web项目的话,在web.xml文件添加如下配置:

 <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath:applicationContext.xml</param-value>
 </context-param>

 <listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

  如果是java项目可以通过BeanFactory或ApplicationContext来直接加载Spring容器

BeanFactory bf = 
	new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
// 或者
ApplicationContext = 
	new ClassPathXmlApplicationContext("applicationContext.xml");

怎样用注解的方式配置Spring?

1.配置文件中开启扫描

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	<!-- 开启注解 配置扫描路径 -->
	<context:component-scan base-package="com.dpb.javabean"/>
	<!-- 如果有多个路径 ,号隔开 
		<context:component-scan base-package="com.dpb.javabean,com.dpb.factory"/>
	-->
</beans>

2.加载容器

  如果是web项目的话,在web.xml文件添加如下配置:

 <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath:applicationContext.xml</param-value>
 </context-param>

 <listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

  如果是java项目可以通过BeanFactory或ApplicationContext来直接加载Spring容器

BeanFactory bf = 
	new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
// 或者
ApplicationContext = 
	new ClassPathXmlApplicationContext("applicationContext.xml");

如何用基于Java配置的方式配置Spring?

  Spring对Java配置的支持是由@Configuration注解和@Bean注解来实现的。

注解说明
@Bean由@Bean注解的方法将会实例化、配置和初始化一个新对象,这个对象将由Spring的IoC容器来管理 ,@Bean声明所起到的作用与<bean/> 元素类似
@Configuration表示该类是一个配置类。用来定义bean资源

1.创建配置类


@Configuration
public class AppConfig
{
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

2.加载容器

  如果是web项目的话,在web.xml文件添加如下配置:

 <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath:applicationContext.xml</param-value>
 </context-param>

 <listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

  如果是java项目可以通过ApplicationContext来加载

public static void main(String[] args) {
    ApplicationContext ctx = 
    			new AnnotationConfigApplicationContext(AppConfig.class);
    MyService myService = ctx.getBean(MyService.class);
    myService.doStuff();
}

ApplicationContext通常的实现是什么?

实现方式说明
FileSystemXmlApplicationContext此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数
ClassPathXmlApplicationContext此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置
WebXmlApplicationContext此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean

解释Spring支持的几种bean的作用域

Spring容器中的bean可以分为5个范围。:

作用域说明
singleton这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护
prototype原型范围与单例范围相反,为每一个bean请求提供一个实例,原型模式
request在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收
Session与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效
global-sessionglobal-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。全局作用域与Servlet中的session作用域效果相同。

Spring框架中的单例bean是线程安全的吗?

  肯定不是线程安全的,当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求多对应的业务逻辑(成员方法),此时就要注意了,如果该处理逻辑中有对该单列状态的修改(体现为该单列的成员属性),则必须考虑线程同步问题.

什么是Spring的内部bean?

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
	<bean id="CustomerBean" class="com.dpb.common.Customer">
		<property name="person" ref="PersonBean"/>
	</bean>
	
	<bean id="PersonBean" class="com.dpb.common.Person">
		<property name="name" value="波波烤鸭"/>
		<property name="address" value="深圳"/>
		<property name="age" value="17"/>
	</bean>
</beans>

改为内部bean的方式

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
	<bean id="CustomerBean" class="com.dpb.common.Customer">
		<property name="person">
			<bean class="com.dpb.common.Person">
				<property name="name" value="波波烤鸭"/>
				<property name="address" value="湖南"/>
				<property name="age" value="17"/>
			</bean>		
		</property>
	</bean>
</beans>

内部 bean 也支持构造器注入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
	<bean id="CustomerBean" class="com.dpb.common.Customer">
		<constructor-arg >
			<bean class="com.dpb.common.Person">
				<property name="name" value="波波烤鸭"/>
				<property name="address" value="湖南"/>
				<property name="age" value="17"/>
			</bean>		
		</constructor-arg>
	</bean>
</beans>

id 或 name 值在bean类是没有必要以一个内部 bean 呈现

在 Spring中如何注入一个java集合?

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

元素说明
<list>类型用于注入一列值,允许有相同的值。
<set>类型用于注入一组值,不允许有相同的值。
<map>类型用于注入一组键值对,键和值都可以为任意类型。
<props>类型用于注入一组键值对,键和值都只能为String类型。
<!-- 配置 student对象 -->
<bean class="com.dpb.javabean.Student">
	<property name="id" value="10"/>
	<property name="name" value="波波烤鸭"/>
	<!-- 对象注入 -->
	<property name="cat" ref="catId"></property>
	<!-- List集合注入 -->
	<property name="games">
		<list>
			<value>LOL</value>
			<value>DNF</value>
			<value>CS</value>
		</list>
	</property>
<property name="score">
	<map>
		<entry key="数学" value="99"/>
		<entry key="英语" value="78"/>
		<entry key="化学" value="84"/>
	</map>
</property>
<property name="props">
	<props>
		<prop key="userName">admin</prop>
		<prop key="password">123</prop>
	</props>
</property>

解释不同方式的自动装配

有五种自动装配的方式,可以用来指导Spring容器用自动装配方式来进行依赖注入。

装配类型说明
no默认的方式是不进行自动装配,通过显式设置ref 属性来进行装配
byName通过参数名 自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。
byType通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出错误。
constructor这个方式类似于byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
autodetect首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。

@Autowired 注解解释

 emsp;通过类型来实现自动注入bean。和@Qualifier注解配合使用可以实现根据name注入bean。

@Qualifier 注解解释

 emsp;和@Autowired一块使用,在同一类型的bean有多个的情况下可以实现根据name注入的需求

@Resource 注解解释

 emsp;默认是根据name注入bean的,可以通过设置类型来实现通过类型来注入

Spring支持的事务管理类型

Spring支持两种类型的事务管理:

  1. 编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
  2. 声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。

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

  1. 它为不同的事务API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一个不变的编程模式。
  2. 它为编程式事务管理提供了一套简单的API而不是一些复杂的事务API如它为编程式事务管理提供了一套简单的API而不是一些复杂的事务API如
  3. 它支持声明式事务管理。它支持声明式事务管理。
  4. 它和Spring各种数据访问抽象层很好得集成。它和Spring各种数据访问抽象层很好得集成。

你更倾向用哪种事务管理类型?

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

Spring框架使用了哪些设计模式

  1. 单例模式
  2. 原型模式
  3. 工厂模式
  4. 适配器模式
  5. 包装模式
  6. 代理模式
  7. 观察者模式
  8. 策略模式
  9. 模板模式

请解释Spring Bean的生命周期?

  1. Spring容器 从XML 文件中读取bean的定义,并实例化bean。
  2. Spring根据bean的定义填充所有的属性。Spring根据bean的定义填充所有的属性。如果bean实现了BeanNameAware 接口,Spring 传递bean 的ID 到 setBeanName方法。
    3. 如果Bean 实现了 BeanFactoryAware 接口, Spring传递beanfactory 给setBeanFactory 方法。
    4. 如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。
    5. 如果bean实现IntializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法。
    6. 如果有BeanPostProcessors 和bean 关联,这些bean的postProcessAfterInitialization() 方法将被调用。
    7. 如果bean实现了 DisposableBean,它将调用destroy()方法。
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
spring 的优点? 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 7.spring属于低侵入式设计,代码的污染极低 8.独立于各种应用服务器 9.springDI机制降低了业务对象替换的复杂性 10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部 什么是DI机制? 依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色 需要另外一个角色协助的时候,在传统的程序设计过程,通常由调用者来创建被调用者的实例。但在spring 创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者 因此也称为依赖注入。 spring以动态灵活的方式来管理对象 , 注入的两种方式,设置注入和构造注入。 设置注入的优点:直观,自然 构造注入的优点:可以在构造器决定依赖关系的顺序。 什么是AOP? 面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring主要表现为两个方面 1.面向切面编程提供声明式事务管理 2.spring支持用户自定义的切面 面向切面编程(aop)是对面向对象编程(oop)的补充, 面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。 AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象, 是对应用执行过程的步骤进行抽象,,从而获得步骤之间的逻辑划分。 aop框架具有的两个特征: 1.各个步骤之间的良好隔离性 2.源代码无关性 Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory 为什么要用: 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。 2. Hibernate是如何延迟加载? 1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection) 2. Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存,当程序真正对数据的操作时,对象才存在与内存,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 3.Hibernate怎样实现类之间的关系?(如:一对多、多对多的关系) 类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序把所有的表与类都映射在一起,它们通过配置文件的many-to-one、one-to-many、many-to-many、 4. 说下Hibernate的缓存机制 1. 内部缓存存在Hibernate又叫一级缓存,属于应用事物级缓存 2. 二级缓存: a) 应用及缓存 b) 分布式缓存 条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非 关键数据 c) 第三方缓存的实现 5. Hibernate的查询方式 Sql、Criteria,object comptosition Hql: 1、 属性查询 2、 参数查询、命名参数查询 3、 关联查询 4、 分页查询 5、 统计函数 6. 如何优化Hibernate? 1.使用双向一对多关联,不使用单向一对多 2.灵活使用单向一对多关联 3.不用一对一,用多对一取代 4.配置对象缓存,不使用集合缓存 5.一对多集合使用Bag,多对多集合使用Set 6. 继承类使用显式多态 7. 表字段要少,表关联不要
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

波波烤鸭

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

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

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

打赏作者

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

抵扣说明:

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

余额充值