目录
ApplicationContext和BeanFactory有什么区别
Spring Boot、Spring MVC 和 Spring 有什么区别
Spring是什么?
spring就是一个容器框架,主要就是IOC和Aop
谈谈你对AOP的理解
面向切面编程,我们可以将一些交叉业务封装成一个切面,注入到目标中。业务中会用来记录日志
谈谈你对IOC的理解
控制反转和依赖注入
控制反转:没有引⼊IOC容器之前,对象A依赖于对象B,那么对象A在初始化或者运⾏到某⼀点的时候,⾃⼰必须 主动去创建对象B或者使⽤已经创建的对象B。⽆论是创建还是使⽤对象B,控制权都在⾃⼰⼿上。引⼊IOC容器之后,对象A与对象B之间失去了直接联系,当对象A运⾏到需要对象B的时候IOC容器会主动创建⼀个对象B注⼊到对象A需要的地⽅依赖注⼊:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由⾃身管理变为了由IOC容器 主动注⼊。依赖注⼊是实现IOC的⽅法,就是由IOC容器在运⾏期间,动态地将某种依赖关系注⼊到对象 之中。
解释下Spring⽀持的⼏种bean的作⽤域。
● singleton:默认,每个容器中只有⼀个bean的实例,单例的模式由BeanFactory⾃身来维护。该对象的⽣命周期是与Spring IOC容器⼀致的(但在第⼀次被注⼊时才会创建)。● prototype:为每⼀个bean请求提供⼀个实例。在每次注⼊时都会创建⼀个新的对象● request:bean被定义为在每个HTTP请求中创建⼀个单例对象,也就是说在单个请求中都会复⽤这⼀个单例对象。● session:与request范围类似,确保每个session中有⼀个bean的实例,在session过期后,bean会随之失效。● application:bean被定义为在ServletContext的⽣命周期中复⽤⼀个单例对象。● websocket:bean被定义为在websocket的⽣命周期中复⽤⼀个单例对象。global-session:全局作⽤域,global-session和Portlet应⽤相关。当你的应⽤部署在Portlet容器中⼯作时,它包含很多portlet。如果你想要声明让所有的portlet共⽤全局的存储变量的话,那么这全局变量需要存储在global-session中。全局作⽤域与Servlet中的session作⽤域效果相同。
Spring事务的实现⽅式和原理以及隔离级别?
实现方式:
通过申明式事务@Transactional注解实现,如果事务要回滚就用rollbackFor属性回滚;
隔离级别:
读未提交
读已提交
可重复读
序列化
Spring事务传播机制
required(默认)若果不存在事务就新建一个事务,如果存在事务就加入
required_new 不管你有没有我都会新建一个事务,如果存在事务就给你挂起
support 存在就加入,不存在就以非事务形式执行
not_support 以非事务形式执行,存在事务就挂起
never 不支持事务,存在事务抛异常
Spring事务什么时候会失效?
1.没有交给spring进行管理
2.类里面使用了this自调用
3.方法不是public修饰
4.数据库不支持事务
5.事务默认情况下只在遇到RuntimeException及其子类时才会回滚,如果在事务中遇到了其他类型的异常并且没有进行适当的处理,可能会导致事务失效。
什么是bean的⾃动装配,有哪些⽅式?
@Autowired注解
和xml形式
Spring中的Bean创建的⽣命周期有哪些步骤
实例化(Instantiation):根据配置或代码创建Bean的实例。可以通过构造函数实例化对象,也可以通过工厂方法或者其他方式来创建。
属性赋值(Population):将配置文件或注解中定义的属性值赋给Bean实例。这可以通过构造函数、工厂方法、属性注入、注解等方式完成。
Aware接口回调(ApplicationContextAware等):如果Bean实现了Aware接口(如ApplicationContextAware、BeanNameAware等),容器会调用相应的回调方法,将容器上下文等信息注入到Bean中。
自定义初始化方法(Initialization):如果Bean定义中指定了初始化方法,容器会在属性赋值完成后调用该方法进行自定义的初始化逻辑。可以通过@Bean(initMethod="init")注解或者实现InitializingBean接口来定义初始化方法。
BeanPostProcessor的前置处理(PostProcessBeforeInitialization):在初始化方法调用之前,容器会调用注册的BeanPostProcessor的前置处理方法,可以对Bean进行自定义处理。
初始化方法调用(Initialization):调用Bean定义中指定的初始化方法。如果没有指定自定义初始化方法,则什么都不做。
BeanPostProcessor的后置处理(PostProcessAfterInitialization):在初始化方法调用之后,容器会调用注册的BeanPostProcessor的后置处理方法,可以对Bean进行自定义处理。
使用(Bean ready):至此,Bean已经被完全创建且初始化完成,可以被容器及其他Bean使用了。
销毁(Destruction):当容器关闭时,或者通过调用容器的destroy()方法销毁Bean时,容器会调用Bean定义中指定的销毁方法进行资源释放和清理操作。可以通过@Bean(destroyMethod="destroy")注解或者实现DisposableBean接口来定义销毁方法。
Spring中Bean是线程安全的吗
bean是否线程安全要看这个bean本身是不是线程安全
ApplicationContext和BeanFactory有什么区别
ApplicationContext和BeanFactory是Spring框架中的两个核心接口,它们之间存在以下区别:
功能:BeanFactory是Spring的基础设施,提供了IoC容器的基本功能,即管理和获取Bean实例。ApplicationContext是BeanFactory的子接口,提供了更多的企业级功能,如事件发布、国际化支持、资源加载、AOP等。
预加载和延迟加载:BeanFactory采用延迟加载策略,即在首次使用时才去初始化Bean实例,适用于系统启动时对资源要求较低的情况。而ApplicationContext在容器启动时就预加载所有的单例Bean,以提高应用程序的响应速度。
配置文件的读取:BeanFactory通过ResourceLoader来读取配置文件,支持多种资源格式,如XML、Properties、注解等。ApplicationContext在BeanFactory的基础上进一步封装,提供了更多的配置方式和更强大的功能,如自动装配、AOP代理等。
生命周期管理:ApplicationContext对Bean的生命周期进行主动管理,可以检测到Bean的初始化和销毁事件,并触发相应的回调方法。而BeanFactory则需要手动调用相应的方法来进行生命周期管理。
国际化支持:ApplicationContext提供了国际化支持的功能,可以方便地实现多语言环境的应用,读取和切换不同的资源文件。而BeanFactory本身不具备这个功能。
AOP支持:ApplicationContext内置了对AOP的支持,可以方便地应用切面编程,实现事务管理、日志记录等横切关注点的功能。而BeanFactory需要手动配置和管理AOP相关的组件。
综上所述,ApplicationContext是Spring的高级容器,提供了更多的企业级功能和扩展,适用于大多数应用场景。而BeanFactory则是Spring的基础设施,提供了基本的IoC容器功能,适用于资源要求较低的场景。如果需要使用Spring的高级功能,推荐使用ApplicationContext。
Spring中的事务是如何实现的
底层是aop
1. Spring事务底层是基于数据库事务和AOP机制的2. ⾸先对于使⽤了@Transactional注解的Bean,Spring会创建⼀个代理对象作为Bean3. 当调⽤代理对象的⽅法时,会先判断该⽅法上是否加了@Transactional注解4. 如果加了,那么则利⽤事务管理器创建⼀个数据库连接5. 并且修改数据库连接的autocommit属性为false,禁⽌此连接的⾃动提交,这是实现Spring事务⾮常重要的⼀步6. 然后执⾏当前⽅法,⽅法中会执⾏sql7. 执⾏完当前⽅法后,如果没有出现异常就直接提交事务8. 如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务9. Spring事务的隔离级别对应的就是数据库的隔离级别10. Spring事务的传播机制是Spring事务⾃⼰实现的,也是Spring事务中最复杂的11. Spring事务的传播机制是基于数据库连接来做的,⼀个数据库连接⼀个事务,如果传播机制配置为 需要新开⼀个事务,那么实际上就是先建⽴⼀个数据库连接,在此新数据库连接上执⾏sql
Spring中什么时候@Transactional会失效
2.类里面使用了this自调用
3.方法不是public修饰
4.数据库不支持事务
5.事务默认情况下只在遇到RuntimeException及其子类时才会回滚,如果在事务中遇到了其他类型的异常并且没有进行适当的处理,可能会导致事务失效。
Spring容器启动流程是怎样的
加载配置文件:Spring容器首先会读取配置文件,通常是XML格式的配置文件,如applicationContext.xml。也可以使用基于注解的配置或者Java Config方式进行配置。
创建容器实例:根据配置文件中的定义,Spring容器会创建相应的容器实例。最常用的容器实现是ApplicationContext,它是BeanFactory接口的具体实现,提供了更多的功能和扩展。
解析配置文件:容器会解析配置文件中定义的Bean定义和相关的配置元数据,包括Bean的名称、类型、属性、依赖关系等信息。
实例化Bean:根据解析得到的Bean定义,容器会实例化Bean对象。这可以通过构造函数实例化、工厂方法、通过代理创建等方式来进行。
设置Bean属性:容器会将配置文件中定义的属性值或引用设置到相应的Bean实例中。这可以通过setter方法注入、构造函数注入、注解等方式来完成。
处理依赖关系:容器会处理Bean之间的依赖关系,确保被依赖的Bean已经创建并可用。Spring使用依赖注入(Dependency Injection)方式来解决依赖关系,包括构造函数注入、属性注入和接口注入等。
调用初始化方法:一旦Bean实例化和属性设置完成,容器会调用初始化方法,如果Bean定义中指定了初始化方法的话。这可以通过@Bean(initMethod="init")注解或者实现InitializingBean接口来定义。
注册Bean和处理后置处理器:容器会将实例化、配置和初始化完成的Bean注册到容器中,以便后续的使用。同时,容器还会处理注册的BeanPostProcessor,执行相应的前置处理和后置处理方法。
容器就绪:经过上述步骤,容器已经完成了所有Bean的创建和初始化工作,并且就绪可以被外部使用了。
以上是Spring容器的简化启动流程,实际上还涉及更多的细节和功能,如AOP代理、事件发布、国际化支持等。整个启动过程是在容器启动时进行的,以确保所有的Bean在容器可用之前都已经正确地创建和初始化。
Spring⽤到了哪些设计模式
Spring Boot、Spring MVC 和 Spring 有什么区别
spring是一个容器
springMVC是spring对web框架的解决方法
springBoot是快速开发工具包
Spring MVC ⼯作流程
1 、用户发送出请求到前端控制器 DispatcherServlet ,这是一个调度中心
2 、 DispatcherServlet 收到请求调用 HandlerMapping (处理器映射器)。
3 、 HandlerMapping 找到具体的处理器 ( 可查找 xml 配置或注解配置 ) ,生成处理器对象及处理器拦截器( 如果有 ) ,再一起返回给 DispatcherServlet 。
4 、 DispatcherServlet 调用 HandlerAdapter (处理器适配器)。
5 、 HandlerAdapter 经过适配调用具体的处理器( Handler/Controller )。
6 、 Controller 执行完成返回 ModelAndView 对象。 7 、 HandlerAdapter 将 Controller 执行结果 ModelAndView 返回给 DispatcherServlet。
8 、 DispatcherServlet 将 ModelAndView 传给 ViewReslover (视图解析器)。
9 、 ViewReslover 解析后返回具体 View (视图)。
10 、 DispatcherServlet 根据 View 进行渲染视图(即将模型数据填充至视图
中)。
11 、 DispatcherServlet 响应用户。
Spring Boot ⾃动配置原理?
通过注解@SpringBootApplication
Spring Boot中常⽤注解及其底层实现
SpringBootApplication,@Controller,@Service,@ResponseBody,@Autowired
#{}和${}的区别是什么?
使⽤#{}可以有效的防⽌ SQL 注⼊, 提⾼系统安全性