spring
1、什么是spring?
spring是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的免费开源框架。是为java应用程序提供基础性服务的一套框架,目的是用于简化企业应用的开发,使开发者只需要关心业务需求。
优点:
- spring是一个免费开源框架(容器)
- spring是一个轻量级、非入侵的框架
- 控制反转(IOC)和面向切面编程(AOP)
- 支持事务的处理,对框架整合支持
组成:
- Spring Core:核心类库,提供IOC服务
- Spring Context:提供框架式的bean访问方式,以及企业级功能(JNDI,定时任务)
- Spring AOP:AOP服务
- Spring DAO:对jdbc的抽象,简化了数据访问异常的处理
- Spring ORM:对现有的ORM框架的支持
- Spring Web:提供了基本的面向web的综合特性,例如多方文件上传
- Spring MVC:提供面向web应用的model-view-controller实现
2、什么是AOP?
当我们需要为分散的对象引入公共行为的时候,oop就显得无能为力了,oop允许你定义从父类到子类的关系,非子类的话,oop就不管用了。比如日志功能,日志代码往往散布在所有对象层次中,但是它又和这些对象的核心功能无关。
所以有了AOP,将程序中的公共业务逻辑封装成一个切面,然后注入到目标对象。
AOP代理主要分为静态代理(AspectJ)和动态代理(Spring AOP)
AspectJ就是AOP框架会在编译阶段生成AOP代理类,因此也称编译时增强,他会在编译阶段将AspectJ注入到字节码中,运行的时候就是增强的AOP对象了。性能更高,但需要特定的编译器。
Spring AOP就是AOP框架不会去修改字节码,而是每次运行的时候在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。更方便,无需特定编译器。
3、什么是IOC?
IOC本身就是一个容器,实际上就是一个map,里面存的是各种对象(xml里配置的bean节点、@repository@service@controller@component),项目启动的时候就会读取这些配置或者扫描这些注解然后通过反射创建对象放到map中, 当我们的代码里需要这些对象的时候,然后在通过@autowired、@resource等注解,或者xml里的bean节点的ref属性注入对象。
控制反转:将对象的控制权转移给spring容器,并由容器根据配置文件去创建实例和管理实例之间的关系。
3种注入方式:构造器注入、setter方法注入、根据注解注入。
4、BeanFactory和ApplicationContext有什么区别?
ApplicationContext:是IOC容器另一个重要接口, 它继承了BeanFactory的基本功能, 同时也继承了容器的高级功能,如:MessageSource(国际化资源接口)、ResourceLoader(资源加载接口)、ApplicationEventPublisher(应用事件发布接口)等。
(1)MessageSource, 提供国际化的消息访问
(2)资源访问,如URL和文件
(3)事件传播特性,即支持aop特性
(4)载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
BeanFactory采用的是延迟加载形式来注入bean,只有在使用到某个bean的时候才会对该bean加载实例化,这样我们就无法发现一些存在的Spring的配置问题,直到项目启动以后,第一次调用getbean方法才会抛出异常。
ApplicationContext是预加载方式注入bean,是在容器启动时就一次性创建了所有bean(占用内存,启动慢),这样可以发现Spring的配置问题,当需要使用的这个bean的时候不需要等待。
5、Spring Bean的生命周期
主流程还是四个实例化>属性赋值>初始化>销毁
1、实例化
首先解析类得到BeanDefintion,如果有多个构造方法,则要推断构造方法,确定好构造方法后,进行实例化得到一个对象
2、属性赋值
对象中加入了@Autowire注解的属性进行属性填充
3、初始化
- 然后回调xxxAware方法,比如实现了BeanNameAware就会调用它的setBeanName方法传递spring配置文件的id值、BeanFactoryAwire会调用它实现setBeanFactory方法,传递spring工厂本身、ApplicationContextAwire,则会调用setApplicationContext方法,传入spring上下文
- BeanPostProcessor前置处理,如果想对Bean进行一些自定义的处理,就可以让Bean实现BeanPostProcessor接口,那样将会调用PostProcessorAfterInitialization(Object obj,String s)方法
- 是否实现InitializingBean接口和init-method,如果自定义了init-method属性,则会自动调用其配置的初始化方法
- BeanPostProcessor后置处理,Bean初始化结束是会调用PostProcessorAfterInitialization方法
4、销毁
当Bean不再需要时进入清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的Destroy方法,如果Bean的Spring配置配置了destroy-method属性,则会自动调用其配置的销毁方法。
6、Spring支持的几种作用域
Spring容器中的bean可以分为五个范围
- singleton:单例,默认作用域(每个容器中只有一个bean实例,由BeanFactory自身来维护)
- prototype:原型,每次创建一个新的对象(为每一个bean请求提供一个实例)
- request:请求,每次Http请求创建一个新对象,适用WebApplicationContext环境(为每一个网络请求出创建一个实例,请求完成后,bean随之失效)
- session:会话,同一个会话共享一个实例,不同会话不同实例(会话结束,实例随之失效)
- global-session:全局会话,所有会话共享一个实例
7、Spring框架的单例bean是线程安全的嘛?
是不安全的,Spring本身并没有对bean做一些线程安全的操作,所以如果bean没有去操作数据,那么它就是安全的,如果去操作数据,那它就是不安全的。
8、Spring框架中用到了哪些设计模式?
- 简单工厂:BeanFactory就是简单工厂模式体现,根据传入的一个唯一标识来获得bean对象,但是是否在传入的时候前后穿件要根据具体情况
- 工厂模式:实现FactoryBean接口的bean是一类叫做Factory的bean。其特点是spring会在使用getbean()调用获得该bean时,会自动调用该bean的getobject()方法,所以返回的不是factory的bean,而是bean.getobject方法的返回值
- 单例模式:spring的bean默认都是单例的,而且提供了全局访问点beanfactory。
- 适配器模式:spring MVC中定义了handlerAdpter适配器,使得每一种controller有一种对应的适配器实现类,让适配器代替controller执行相应方法。这样在扩展Controller时,只需要增加一个适配器类就完成了SpringMVC的扩展装饰
- 装饰器模式:动态给对象添加一些职责,Spring所有xxWrapper、XXDecorator类都用了装饰器模式
- 动态代理模式:Spring AOP会根据目标对象动态的创建一个代理对象
- 观察者模式:spring的监听器
- 策略模式:Spring的资源访问Resource接口是,会根据不同的文件用不同的Resource去访问
9、Spring事务的实现方式和原理以及隔离等级?
两种编程式(手动用代码api去控制)和声明式(使用注解@Transaction)
当我们在一个方法中加入了@Transaction注解以后,spring会根据这个类生成一个代理对象,当代理对象使用这个方法时,会将事务的自动提交设置为false,如果方法执行抛出了异常(没有try catch),则会将事务进行回滚。
隔离级别就是数据库的隔离级别外加一个默认级别,读未提交,读已提交,可重复读,可串行化,如果spring和数据库的隔离级别有异,以spring配置为主,如果配置的隔离级别数据库不支持,则效果取决于数据库。
10、Spring事务传播机制
@Transaction里设置了枚举类型的事务参数A:主方法,B:被调用方法
- REQUIRED(默认):A无事务,B新建一个事务;A有事务,B加入到A事务
- SUPPORTS:A无事务,B以非事务方法执行;A有事务,B加入A事务
- MANDATORY:A无事务,B抛出异常;A有事务,B加入A事务
- REQUIREDS_NEW:B只用自己的事务
- NOT_SUPPORTED:B不用事务
- NEVER:A有事务就抛异常(自己不用,调用者也不让用)
- NESTED:B事务嵌套在A事务(B用自己的事务,但是A事务回滚,B也要跟着一起回滚)
11、Spring事务什么时候会失效
Spring的事务原理是AOP,那么由于方法都是在代理对象中进行执行。
- 不要用this进行自调用
- 只用public方法
- 数据库不支持事务
- 没有被spring管理
- 异常被catch
12、什么是bean的自动装配,有哪些方式?
在xml配置文件的时候<bean>中加上autowire属性,有五种方式
- no,通过ref属性手动设定
- byname,根据名称自动装配(setter方法)
- byType,根据类型自动装配(setter方法)
- constructor,类似于根据类型装配(构造器,参数不对则抛出异常)
- autodetect,有构造器用constructor,否则用不用type
13、Spring MVC的工作流程
- 用户发送请求给前端控制器(DispatcherServlet)
- 前端控制器收到请求调用handleMapping处理器映射器
- 处理器映射器根据配置找到具体的处理器,返回给前端控制器
- 前端控制器调用HandleAdapter处理器适配器
- 处理器适配器经过适配调用具体的处理器(controller)
- controller执行完成返回ModelAndView
- 处理器适配器将ModelAndView返回给前端控制器
- 前端控制器将ModelAndView传给ViewReslover视图解析器
- 视图解析器解析后返回具体的View给前端控制器
- 前端控制器根据View渲染视图
- 前端控制器响应用户
14、Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。
(1)加载:Servlet容器(Tomcat)通过类加载器加载servlet文件(.class)
(2)创建:通过调用servlet构造函数创建一个servlet对象
(3)初始化:调用init方法初始化
(4)处理客户请求:每当有一个客户请求,容器会创建一个线程来处理客户请求
(5)卸载:调用destroy方法让servlet自己释放其占用的资源
servlet是由Servlet容器负责加载Servlet类,创建Servlet对象并实例化,然后调用Servlet的init方法,进行初始化,之后调用Service方法。实例化和初始化不同。先实例化,再初始化。
15、Spring MVC怎么设置重定向和转发
转发:在返回值前加“forward”
重定向:在返回值前redirect
16、Spring常用注解有哪些?
@RequestMapping:用于处理请求URL映射
@RequestBody:注解实现接收http请求的json数据,将json数据转化为java对象
@ResponseBody:注解实现将controller方法返回对象转化为json形式响应给用户
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App