JAVA面试题合集六(Spring)

本文详细介绍了Spring框架的核心特性,包括依赖注入(DI)和面向切面编程(AOP)。Spring作为轻量级的Java开发框架,通过IOC容器管理对象的耦合,实现解耦合和对象的生命周期管理。文章还讨论了Spring的优缺点,如减少代码耦合、支持AOP事务管理,但也存在依赖反射带来的性能影响。此外,阐述了Spring的Bean定义、生命周期、不同类型的依赖注入方式,以及Bean的作用域。最后,提到了Spring的事务管理和AOP概念,如事务传播行为和隔离级别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是Spring?
Spring是一个轻量级的java开发框架,目的是解决企业级的业务逻辑和其他层的耦合问题.Spring负责基础架构,开发者可以专注应用程序的开发
Spring最基本的是解决企业应用开发的复杂性,简化java开发.
2个核心特性:依赖注入DI. 面向切面编程AOP
2.Spring框架的设计目标?设计理念?和核心是什么?
Spring开发设计目标: Spring为开发者提供一站式的轻量级应用开发平台

Spring设计理念:在javaEEz中提供POJO和Javabean开发方式,面向接口开发.,充分支持OO面向对象的设计,
Spring通过IOC容器实现对象的耦合关系管理.并实现依赖反转,将对象之间的依赖管理交给IOC 容器实现解耦

Spring框架的核心: IOC容器和AOP模块.
通过IOC容器管理POJO对象以及他们之间的耦合关系.
通过AOP动态非倾入的方式增加服务
IOC让相互协作的组件保持松耦合,AOP允许把遍布于应用各层的功能分离出来形成可重用的功能组件

3.Spring的优缺点是什么?
方便解耦.,简化开发
将对象的创建和依赖管理交给容器.
AOP 可以方便的实现对权限拦截,运行监控
声明式事务 只需要配置就可以完成对事物的管理
Spring支持Junit4…通过注解对Spring进行测试
Spring支持各种优秀的框架,其内部提供对各种优秀的框架支持

缺点:依赖反射,影响性能.使用门槛升高.入门Spring需要很长时间
4.Spring有哪些模块组成?
在这里插入图片描述
在这里插入图片描述
5.Spirng框架中都用到了哪些模式?
工厂模式 BeanFactory就是简单工厂模式实现,用来创建对象实例
单例模式 Bean默认单例
代理模式 Spring AOP 用到了CGLIB字节码代理和JDK动态代理
模板方法 用来解决代码的重复问题,RestTemplate
6.Spring context应用上下文核心容器?
在这里插入图片描述
7.Spring应用程序有哪些不同的组件?
接口 定义功能
Bean类 set,get函数等
Bean配置文件 包含类的信息以及如何配置他们
Spring面向切面编程 提高AOP功能
用户程序 他使用接口
8.什么是Spring IOC 容器?
控制反转: 对组件对象控制权的转移.从程序代码本身转移到了外部容器
Spring IOC 负责创建对象.管理对象.,通过依赖DI注入,装配对象,配置对象,并且管理这些对象的生命周期

  1. IOC代码量降低.单元测试.,松耦合,支持加载服务的饿汉式.和初始化的懒汉式
    容器管理者Bean的生命周期,控制着Bean的依赖注入 在这里插入图片描述
    10.BeanFactory和ApplicationContext有什么区别?
    BeanFactory 低级容器.,可以理解为就是一个hashmap.
    ApplicationContext 高级容器,应用上下文,子接口,继承了很多接口,
    在这里插入图片描述
    11.有哪些不同类型的依赖注入实现方式?
    接口注入.setter注入,构造器注入
    在这里插入图片描述
    12.什么是Spring Beans?
    是形成Spring的主干java对象.被IOC容器初始化,配置,管理.
    这些beans通过容器中配置的元数据创建.比如XML文件中的形式定义
    13.一个Spring Bean定义包含什么?
    一个Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。
    14.如何给Spring 容器提供配置元数据?Spring有几种配置方式
    XML配置文件。
    基于注解的配置。
    基于java的配置
    15.怎么样定义类的作用域?
    当Spring在需要的时候,每次都会产生一个新的bean实例@Scope 设置为prototype
    一个bean在每次使用的时候,都会返回同一个bean,这个bean的scope属性必须设置为singletion
    16.解释Spring支持几种bean的作用域?
    singletion
    prototype
    request 每次http请求都会创建一个bean,该作用域仅在web的Spring ApplicationContext下有效
    session 在一个Http Session,一个bean定义对应一个实例,该作用域仅在基于web的Spring ApplicationContext有效
    global-session 在一个全局Http Session,一个Bean定义对应一个实例
    在这里插入图片描述
    17.Spring框架中的单例bean是线程安全的吗?

默认单例,没有对单例bean进行多线程封装.
大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全的,
但如果 bean 有状态的话(比如 view model 对象),最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。
有状态就是有数据存储功能。
无状态就是不会保存数据

18.Spring如何处理线程并发问题?
在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,
因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题。

ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。
同步机制采用了“时间换空间”的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获得锁的线程则需要排队。
而ThreadLocal采用了“空间换时间”的方式。
ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。

19.解释SPring框架中bean的生命周期?
图为bean装载到Spring应用上下文的一个典型生命周期
在这里插入图片描述
Spring对bean进行实例化;
Spring将值和bean的引用注入到bean对应的属性中;
如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法;
如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;
如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来;
如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法;
如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。类似地,如果bean使用initmethod声明了初始化方法,该方法也会被调用;
如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法;
此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上
下文中,直到该应用上下文被销毁;
如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。
20.哪些是重要的bean生命周期方法? 你能重载它们吗?
有2个重要的bean生命周期方法,一个是setup,它是在容器加载bean的时候被调用
另一个是teardown,它是在容器卸载类的时候被调用

bean标签有2个重要的属性.init-method和destory-method方法,定义初始化和销毁方法.
它们也有相应的注解(@PostConstruct和@PreDestroy)。post后缀,pre前缀
21.在Spring中如何注入一个集合?
Spring提供以下几种集合的配置元素:
类型用于注入一列值,允许有相同的值。
类型用于注入一组值,不允许有相同的值。
类型用于注入一组键值对,键和值都只能为String类型。
22.什么是bean的自动装配?
Spring容器能够自动装配相互合作的bean 容器 不需要配置,能够通过BeanFactory自动处理bean之间的协作,.
23.使用@Autowired注解自动装配的过程是怎样的?
在启动Spring IOC时,容器自动装载了AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowired,@Resource,@Inject时,就会在IOC自动查找所需要的bean,并装配给该对象的属性.

在使用@Autowired时,首先在容器中查询对应类型的bean:
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;
如果查询的结果不止一个,那么@Autowired会根据名称来查找;
如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false。
24.你可以在Spring中注入一个null 和一个空字符串吗?
可以。
25.什么是基于Java的Spring注解配置? 给一些注解的例子?
以@Configuration 注解为例,它用来标记类可以当做一个bean的定义,被
Spring IOC容器使用。
另一个例子是@Bean注解,它表示此方法将要返回一个对象,作为一个bean注
册进Spring应用上下文。
26.怎样开启注解装配?
注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在Spring配置文件中配置元素。
27.在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
@Autowired注解,可用于构造函数,成员变量,setter方法 是按照类型匹配,默认情况下要求依赖对象必须存在,可以required=false
@Resource 是按照名称匹配.找不到与名称匹配的bean才会按照类型装配注入
28.Sprng解释对象/关系映射
对象关系映射ORM
29. Spring支持的事务管理类型?Spring事务实现方式有哪些?
Spring支持2种类型的事务管理方式
编程式事务 通过编程的方式管理事务
声明式事务 业务代码和事务管理相分离.使用注解和XML配置
30.说一下Spring的事务传播行为?
propagation_required
supports
mandatory
requires_new
not_supported
nerver
nested
在这里插入图片描述
31.说一下Spring的事务隔离级别?
Spring有5大隔离级别.默认有 ISOLATION_DEFAULT,其他的隔离级别和数据库一致
在这里插入图片描述
default
读未提交: 最低隔离级别,事务未提交时,就被其他事务读取 —>出现 脏读,幻读,不可重复读
读已提交 一个事务提交后背其他事务读取 -->幻读,不可重复读 sql_server默认级别
可重复度 保证多次读取到同一个数据时,和事务开始值一样,禁止读取到未提交的事务 -->出现幻读 mysql默认级别
序列化 代价最高,最可靠的隔离级别,防止3读

脏读 一个事务读取到另一个事务未提交的数据
不可重复度 在一个事务内,多次读取相同数据,
幻读 同一个事务内多次查询返回的结果集不一样 —>另一个事务新增或删除
32.什么是Spring AOP?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值