1.Spring面试题(2)
文档中的知识点:
1.bean标签范围配置:singleton,prototype,request,session,global-session
***2.bean实例化的三种方式:
(1)使用无参构造方法实例化 (2)工厂静态方法实例化 (3)工厂实例方法实例化
3.bean的依赖注入方式:
(1)构造方法 (2)setter方法 / setter方法:P命名空间注入
4.bean的依赖注入的数据类型:基本数据类型,引用数据类型,集合数据类型
5.ApplicationContext的实现类:ClassPathXmlApplicationContext,FileSystemXmlApplicationContext,AnnotationConfigApplicationContext
Spring注解开发:
1.Spring原始注解:Spring原始注解主要是替代的配置
@Component:使用在类上用于实例化bean
@Controller:web层类上 @Service:service层类上 @Repository:dao层类上
@Autowired:使用在字段上根据类型依赖注入 @Qualifier:结合@Autowired一起使用,用于根据名称进行依赖注入 @Resource:相当于@Autowired+@Qualifier,根据名 称进行注入
@Value:注入普通属性(用于注入基本数据类型和String数据类型的属性)
@Scope:标注bean的作用范围
@PostConstruct:使用在方法上,标注该方法是bean的初始化方法 @PreDestroy:使用在方法上,标注该方法是bean的销毁方法
Spring AOP:
1.Spring AOP的底层实现:AOP的底层是通过Spring提供的动态代理技术实现的
2.Spring采用动态代理织入,而AspectJ采用编译器织入和类装载期织入
3.AOP底层实现:基于jdk的动态代理(接口的实现) 和 基于cglib的动态代理(类的继承)
4.基于xml的AOP开发和基于注解的AOP开发
一、Spring概述
1. 什么是spring?
Spring是一个开发web项目的框架,可以简化web项目开发过程,使得开发更加简单便捷
2. Spring框架的设计目标,设计理念,和核心是什么?
设计目标:简化web项目开发过程
设计理念:创建对象和依赖的维护交给框架,实现系统组件复用
核心:IOC和AOP
3. Spring的优缺点是什么?
优点:
(1)spring的DI机制将对象的控制权和对象之间的依赖关系交由Spring框架处理,降低了组件之间的耦合度;
(2)Spring提供了AOP技术,支持将一些通用任务,如事务、安全、日志、权限等进行集中式管理,从而提供更好的复用。
(3)spring对于主流的应用框架提供了集成支持。
×4. Spring有哪些应用场景
事务管理,安全监控,记录日志,权限控制
场景一: 记录日志
场景二: 监控方法运行时间 (监控性能)
场景三: 权限控制
场景四: 缓存优化 (第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象返回,不需要查询数据库 )
场景五: 事务管理 (调用方法前开启事务, 调用方法后提交关闭事务 )
说明:
jdk动态代理是接口的实现(适用于实现接口的类,spring aop的默认实现)
cglib动态代理是类的继承
提示:aop本质是动态对方法增强,避免代码入侵,优雅的实现横向扩展,是对oop的补充
5. Spring由哪些模块组成?
每个模块的功能:
Core,Context,AOP,DAO,Web,MVC,ORM
- 核心容器(Spring Core):提供了Spring 框架的核心功能。BeanFactory 是 Spring 核心容器的主要组件。它提供控制反转将应用程序的配置和依赖性规范与实际的应用程序代码分开,这是整个Spring的基础。
- Spring Context:提供配置文件,向 Spring 框架提供上下文信息。它构建在BeanFactory 之上,另外增加了国际化,资源访问等功能。
- Spring AOP:Spring 提供了面向切面编程的功能,因为Spring 的核心是基于控制反转的,Spring的依赖注入为AOP提供支持。
- Spring DAO:提供了一个简单有效的JDBC应用。
- Spring ORM:对其他一些ORM框架提供支持,如:JDO,Hibernate和iBatis等。
- Spring Web: 提供了简化的处理多部分请求以及将请求参数绑定到域对象的任务。
- Spring MVC:提供了MVC模式。
*6. Spring 框架中都用到了哪些设计模式?
Spring设计模式的详细使用案例可以阅读这篇文章:Spring中所使用的设计模式_张维鹏的博客-CSDN博客_spring使用的设计模式
(1)工厂模式:Spring使用工厂模式,通过BeanFactory和ApplicationContext来创建对象
(2)单例模式:Bean默认为单例模式
(3)策略模式:例如Resource的实现类,针对不同的资源文件,实现了不同方式的资源获取策略
(4)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术
(5)模板方法:可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中,用来解决代码重复的问题。比如RestTemplate, JmsTemplate, JpaTemplate
(6)适配器模式:Spring AOP的增强或通知(Advice)使用到了适配器模式,Spring MVC中也是用到了适配器模式适配Controller
(7)观察者模式:Spring事件驱动模型就是观察者模式的一个经典应用。
(8)桥接模式:可以根据客户的需求能够动态切换不同的数据源。比如我们的项目需要连接多个数据库,客户在每次访问中根据需要会去访问不同的数据库
7. 详细讲解一下核心容器(spring context应用上下文) 模块
这是基本的Spring模块,提供spring 框架的基础功能,BeanFactory 是 任何以spring为基础的应用的核心。Spring 框架建立在此模块之上,它使Spring成为一个容器。
Bean 工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从真正的应用代码中分离。最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory ,它根据XML文件中的定义加载beans。该容器从XML 文件读取配置元数据并用它去创建一个完全配置的系统或应用。
×8. Spring框架中有哪些不同类型的事件
Spring 提供了以下5种标准的事件:
(1)上下文更新事件(ContextRefreshedEvent):在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。
(2)上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。
(3)上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。
(4)上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
(5)请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件。
如果一个bean实现了ApplicationListener接口,当一个ApplicationEvent 被发布以后,bean会自动被通知。
9. Spring 应用程序有哪些不同组件?
同上
×10. 使用 Spring 有哪些方式?
使用 Spring 有以下方式:
作为一个成熟的 Spring Web 应用程序。
作为第三方 Web 框架,使用 Spring Frameworks 中间层。
用于远程使用。
作为企业级 Java Bean,它可以包装现有的 POJO(Plain Old Java Objects)
二、Spring控制反转(IOC)
1. 什么是Spring IOC 容器?
同上,上面有,No7
2. 控制反转(IoC)有什么作用
Spring IoC负责创建对象、管理对象(通过依赖注入(DI)、装配对象、配置对象,并且管理这些对象的整个生命周期。
控制反转的作用:将对象的控制权和依赖关系交给Spring框架,降低了对象之间的耦合度
3. IOC的优点是什么?
同上
4. Spring IoC 的实现机制
工厂模式加反射机制
AOP的实现机制:动态代理
*5. Spring 的 IoC支持哪些功能
Spring 的 IoC 设计支持以下功能:
依赖注入 依赖检查 自动装配 支持集合 指定初始化方法和销毁方法 支持回调某些方法(但是需要实现 Spring 接口,略有侵入) 其中,最重要的就是依赖注入,从 XML 的配置上说,即 ref 标签。对应 Spring RuntimeBeanReference 对象。
对于 IoC 来说,最重要的就是容器。容器管理着 Bean 的生命周期,控制着 Bean 的依赖注入。
*6. BeanFactory 和 ApplicationContext有什么区别?
区别一:他们属于不同的包
区别二:BeanFactory 和ApplicationContext都是属于Spring 下的顶级接口,其中 BeanFactory 提供了基础的访问容器的能⼒,ApplicationContext 属于BeanFactory 的子类,BeanFactory 所有的功能ApplicationContext 也是拥有,除此之外ApplicationContext还有用其他BeanFactory没有的功能,例如:对国际化的支持,支持资源的访问,支持事件的传播等。
区别三:对于执行性能来说,ApplicationContext是一次性加载并初始化所有的 bean的,所以它的启动过程可能比较慢,但是后续的执行比较快;而BeanFactory 是需要哪个类才去加载那个类,因此BeanFactory占用的系统资源更少,启动更快,但后续的执行可能会慢一些。
7. Spring 如何设计容器的,BeanFactory和ApplicationContext的关系详解
同上
8. applicationContext通常的实现是什么?
ClassPathXmlApplicationContext: 此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置。
FileSystemXmlApplicationContext : 此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数。
AnnotationConfigApplicationContext
9. 什么是Spring的依赖注入?
依赖注入:是指程序运行过程中,如果需要创建一个对象,无须代在码中new创建,而是依赖外部的注入
10. 依赖注入的基本原则
要在配置文件中配置好依赖关系
11. 依赖注入有什么优势
降低了开发难度,降低了对象之间的耦合度
12. 有哪些不同类型的依赖注入实现方式?
依赖注入有三种方式:
1:接口注入:指的就是在接口中定义要注入的信息,并通过接口完成注入。
2:set注入:指的就是在接受注入的类中定义一个set方法,并在参数中定义需要注入的元素。
3:构造注入:指的就是接受注入的类中定义一个构造方法,并在参数中定义需要注入的元素。
一般用的最多的是setter()方法注入的方式
13. 构造器依赖注入和 Setter方法注入的区别?
三、Spring Beans
1. 什么是Spring beans?
Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中<bean/>的形式定义。
Spring框架定义的beans都是单件beans。在beantag中有个属性”singleton”,如果它被赋为TRUE,bean就是单件,否则就是一个prototype bean。默认是TRUE,所以所有在Spring框架中的beans缺省都是单件。
2. 一个 Spring Bean 定义 包含什么?
一个Spring Bean的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。
。。。。。。。。
id,类型,属性,依赖关系
3. 如何给Spring 容器提供配置元数据?Spring有几种配置方式
(1)id,类型,属性,依赖关系 (2)两种:xml配置,注解配置
4. Spring配置文件包含了哪些信息
5. Spring基于xml注入bean的几种方式
实例化bean的三种方式:无参构造方法实例化bean,工厂静态方法,工厂实例方法
6. 你怎样定义类的作用域?
7. 解释Spring支持的几种bean的作用域
五种Scope:sington,prototype,request,session,global-session
8. Spring框架中的单例bean是线程安全的吗?
不是线程安全的
9. Spring如何处理线程并发问题?
尽量在对象中不定义可变变量,如果要用到可变变量,可以使用ThreadLocal
10. 解释Spring框架中bean的生命周期
创建,初始化,运行,销毁
11. 哪些是重要的bean生命周期方法? 你能重载它们吗?
12. 什么是Spring的内部bean?什么是Spring inner beans?
内部bean就是作为其他bean的属性的bean
13. 在 Spring中如何注入一个java集合?(注入指的就是依赖注入)
可以通过<list>,<set>,<map>,<props>等标签注入集合数据类型
14. 什么是bean装配?(和依赖注入有关)
装配,或bean 装配是指在Spring 容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起。
*15. 什么是bean的自动装配?
Spring自动装配:无需在Spring配置文件中描述javaBean之间的依赖关系(如配置<property>
、<constructor-arg>
)。 IOC容器会自动建立javaBean之间的关联关系。
在Spring框架中,只需要在中定义"autowire"属性,即可开启自动装配功能
autowire="byName/byType"
16. 解释不同方式的自动装配,spring 自动装配 bean 有哪些方式?
常用的:byName,byType。总共有5种
17. 使用@Autowired注解自动装配的过程是怎样的?
18. 自动装配有哪些局限性?
19. 你可以在Spring中注入一个null 和一个空字符串吗?
四、Spring注解
1. 什么是基于Java的Spring注解配置? 给一些注解的例子
注解配置用来代替xml配置。例子:@Component,@Controller,@Service,@Repository等等
2. 怎样开启注解装配?
??
3. @Component, @Controller, @Repository, @Service 有何区别?
用在类上,用于实例化bean;用在web层类上;用在dao层类上;用在service层类上
4. @Required 注解有什么作用
???
5. @Autowired 注解有什么作用
用在属性上,根据类型依赖注入(@Autowired和<bean>里的autowire=“ ”应该不一样,后面的才是自动装配)
6. @Autowired和@Resource之间的区别
根据类型依赖注入;根据名称依赖注入
7. @Qualifier 注解有什么作用
不能单独使用,结合@Autowired根据名称依赖注入
8. @RequestMapping 注解有什么用?
用于处理请求url和处理请求方法的映射
五、Spring数据访问
1. 解释对象/关系映射集成模块
要理解这个首先我们要明白一点:
编程语言--》面向对象,基本元素是对象
数据库---》基本元素是一条条数据
所以如果说想要将一个对象insert到数据库要把对象的值提取出来在一条条insert到数据库中,非常不方便。
对象/关系 映射就可以将对象的数据关系和数据库进行匹配,可以理解为程序中的一个对象对应数据库中的一张表,这样操作数据库也是面向对象的,像操作对象一样。添加数据时在service层直接向数据库添加对象,在操作数据库时根据对象和数据库表之间的对应关系进行增删改查操作。
2. 在Spring框架中如何更有效地使用JDBC?
使用 SpringJDBC 框架,资源管理和错误处理的代价都会被减轻。所以开发者只需写 statements 和 queries 从数据存取数据,JDBC 也可以在 Spring 框架提供的模板类的帮助下更有效地被使用,这个模板叫 JdbcTemplate
3. 解释JDBC抽象和DAO模块
通过使用 JDBC 抽象和 DAO 模块,保证数据库代码的简洁,并能避免数据库资源 错误关闭导致的问题,它在各种不同的数据库的错误信息之上,提供了一个统一 的异常访问层。它还利用 Spring 的 AOP 模块给 Spring 应用中的对象提供事务 管理服务。
4. spring DAO 有什么用?
Spring DAO(数据访问对象) 使得 JDBC,Hibernate 或 JDO 这样的数据访问技术更容易以一种统一的方式工作。这使得用户容易在持久性技术之间切换。它还允许您在编写代码时,无需考虑捕获每种技术不同的异常。
*5. spring JDBC API 中存在哪些类?
JdbcTemplate
SimpleJdbcTemplate
NamedParameterJdbcTemplate
SimpleJdbcInsert
SimpleJdbcCall
6. JdbcTemplate是什么
Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作
7. 使用Spring通过什么方式访问Hibernate?使用 Spring 访问 Hibernate 的方法有哪些?
我们可以通过两种方式使用 Spring 访问 Hibernate:
1、 使用 Hibernate 模板和回调进行控制反转
2、 扩展 HibernateDAOSupport 并应用 AOP 拦截器节点
8. 如何通过HibernateDaoSupport将Spring和Hibernate结合起来?
9. Spring支持的事务管理类型, spring 事务实现方式有哪些?
10. Spring事务的实现方式和实现原理
11. 说一下Spring的事务传播行为
12. 说一下 spring 的事务隔离?
13. Spring框架的事务管理有哪些优点?
14. 你更倾向用那种事务管理类型?
Spring面向切面编程(AOP)
1. 什么是AOP
面向切面编程,将业务模块的共有逻辑横向抽取出来,方便复用
2. Spring AOP and AspectJ AOP 有什么区别?AOP 有哪些实现方式?
3. JDK动态代理和CGLIB动态代理的区别
jdk动态代理基于接口的实现;cglib动态代理基于类的继承。
如果目标类实现了某一接口,则使用jdk动态代理;如果目标类没有实现接口,则使用cglib动态代理
4. 如何理解 Spring 中的代理?
将业务模块的共有逻辑抽取出来,形成切面类。在程序运行过程中通过动态代理生成代理对象,通过织入,对目标对象实现功能增强
5. 解释一下Spring AOP里面的几个名词
目标类,连接点
切面类,通知
代理类
6. Spring在运行时通知对象
7. Spring只支持方法级别的连接点
8. 在Spring AOP 中,关注点和横切关注的区别是什么?在 spring aop 中 concern 和 cross-cutting concern 的不同之处
9. Spring通知有哪些类型?
前置,后置,环绕,返回后,抛出异常后
10. 什么是切面 Aspect?
切面就是将业务模块的共有逻辑抽取出来形成的一个组件
11. 解释基于XML Schema方式的切面实现
12. 解释基于注解的切面实现
13. 有几种不同类型的自动代理?
1.AOP的代理有哪几种方式?
AOP思想的实现一般都是基于代理模式,在java中一般采用jdk动态代理模式,但是我们知道,jdk动态代理模式只能代理接口而不能代理类。因此,Spring AOP会按照下面两种情况进行切换,因为Spring AOP同时支持CGLIB、ASPECTJ、JDK动态代理。
(1)如果目标对象实现类实现了接口,Spring AOP将会采用jdk动态代理来生成AOP代理类;
(2)如果目标对象的实现类没有实现接口,Spring AOP将会采用CGLIB来生成AOP代理类。不过这个选择过程对开发者完全透明、开发者也无需关心
2.
- 在Spring的AOP编程中:
- 如果加入容器的目标对象有实现接口,用JDK动态代理
- 如果目标对象没有实现接口,用Cglib动态代理
3.Spring中单例bean的线程安全问题了解吗?
单例bean存在线程安全问题,主要是因为:当多个线程操作同一个对象时,对这个对象的非静态成员变量的写操作存在线程安全问题。常见的有两种解决办法:
(1)在bean中尽量不定义可变成员变量(不太现实)
(2)在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在ThreadLocal中(推荐的一种方式)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?