spring

Spring

1、Spring、SpringMVC和SpringBoot的区别?

Spring是一个IOC容器,用来管理Bean,使用依赖注入实现控制反转,可以很方便的整合各种框架;提供AOP机制弥补OOP的代码重复问题,更方便将不同类不同方法中的共同处理抽取成切面、自动注入给方法执行,比如日志、异常等。

SpringMVC是Spring对Web框架的一个解决方案,提供了一个总的前端控制器Servlet,用来接收请求,然后定义了一套路由策略及适配执行handle,将handle结果使用视图解析技术生成视图展现给前端。

 

(SpringMVC的实现逻辑?===> 首先DispatcherServlet会接收到request请求信息,去头去尾得到映射地址,然后通过HandlerMapping查找到具体处理的Controller以及对应的方法。方法结束后会返回一个ModelAndView,里面包含的是返回的数据以及返回的视图。这个就会交给ViewResolver来处理。处理结束后就会跳转到相应的视图。)

SpringBoot是Spring提供的一个快速开发工具包,让程序员能更方便、更快速的开发spring+springMVC应用,简化了配置,整合了一系列的解决方案(starter机制)、redis、mongodb、es,可以开箱即用。

2、Spring是如何管理bean的?

  1. 读取配置文件bean.xml,并根据文件中bean的id,class属性实例化一个BeanDefinition,装入泛型集合中。

  2. 通过循环+反射,将List<BeanDefinition>中的bean加入到Map<String,Object>中,这里用反射将bean中的className属性转换为一个实例化的bean对象加入到了Map中。

  3. 提供一个对外的接口,通过传入参数获取该bean。

3、Spring容器启动流程是怎样的?

(1)首先会进行扫描,扫描得到所有的BeanDefinition对象,并存在一个Map中;

(2)然后筛选出非懒加载的单例BeanDefinition进行创建Bean,对于多例Bean不需要在启动过程中去进行创建,对于多例Bean会在每次获取Bean时利用BeanDefinition去创建;

(3)利用BeanDefinition创建Bean就是Bean的创建生命周期,这期间包括了合并BeanDefinition、推断构造方法、实例化、属性填充、初始化前、初始化、初始化后等步骤,其中AOP就是发生在初始后这一步骤中;

(4)单例Bean创建完了之后,Spring会发布一个容器启动事件;

(5)Spring启动结束;

(6)在源码中会更复杂,比如源码中会提供一些模板方法,让子类实现,比如源码中还涉及到一些BeanFactoryPostProcessor和BeanPostProcessor的注册,Spring的扫描就是通过BeanFactoryPostProcessor来实现的,依赖注入就是通过BeanPostProcessor来实现的。

(7)在Spring启动过程中还会去处理@Import等注解。

4、Spring事务?

Spring事务是Spring框架提供的一种机制,用于管理数据库操作的事务性。事务是一组数据库操作,要么全部成功提交,要么全部回滚,以保持数据的一致性和完整性。Spring 事务管理允许我们以声明式或编程式的方式管理务,从而确保在应用程序中执行的一系列操作被视为一个原子性的操作单元。

Spring 提供了多种事务管理策略,包括:

(1)声明式事务管理: 通过配置文件或注解来定义事务的范围和属性,将事务管理与业务逻辑分离,使代码更加清晰。

(2)编程式事务管理: 在代码中显式地控制事务的开始、提交和回滚,给开发者更大的灵活性。

Spring实现的事务,本质就是AOP完成的,对方法前后进行拦截,在执行方法之前开启事务,在执行完目标方法后根据执行情况提交或者回滚事务。

5、Spring事务传播机制?

多个事务方法相互调用时,事务如何在这些方法间传播,方法A是一个事务的方法,方法A执行过程中调用了方法B,那么方法B有无事务以及方法B对事务的要求不同都会对方法A的事务具体执行造成影响,同时方法A的事务对方法B的事务执行也有影响,这种影响具体是什么就由两个方法所定义的事务传播类型所决定。

(1)REQUIRED(Spring默认的事务传播类型):如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务。

(2)SUPPORTS:当前存在事务,则加入当前事务,如果当前没有事务,就以非事务方法执行。

(3)MANDATORY:当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常。

(4)REQUIRES_NEW:创建一个新事务,如果存在当前事务,则挂起该事务。

(5)NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,则挂起当前事务。

(6)NEVER:不使用事务,如果当前事务存在,则抛出异常。

(7)NESTED:如果当前事务存在,则在嵌套事务中执行,否则REQUIRED的操作一样(开启一个事务)。

6、Spring事务什么时候会失效?

Spring事务的原理是AOP,进行了切面增强,那么失效的根本原因是这个AOP不起作用了!常见情况有如下几种:

(1)发生自调用,类里面使用this调用本类的方法(this通常省略),此时这个this对象不是代理类,而是UserService对象本身!

解决方法很简单,让那个this变成UserService的代理类即可!

(2)方法不是public的:@Transactional只能用于public的方法上,事务不会失效,如果要用在非public方法上,可以开启AspectJ代理模式。

(3)数据库不支持事务。

(4)没有被Spring管理。

(5)如果方法上异常捕获处理,自己处理了异常,没有抛出,就会导致事务失效。所以,一般处理了异常之后,要记得抛出去。

(6)如果方法抛出检查异常,要是报错的话也会导致事务失效。所以,在Spring的事务注解上,也就是@Transactional上配置rollbackFor属性为Exception,这样不管是什么异常,都会回滚事务。

7、Spring中的事务是如何实现的?

(1)Spring事务底层是基于数据库事务和AOP机制的;

(2)首先对于使用了@Transactional注解的Bean,Spring会创建一个代理对象作为Bean;

(3)当调用代理对象的方法时,会先判断该方法上是否加了@Transactional注解;

(4)如果加了,那么则利用事务管理器创建一个数据库连接;

(5)并且修改数据库连接的autocommit属性为false,禁止此连接的自动提交,这是实现Spring事务非常重要的一步;

(6)然后执行当前方法,方法中会执行sql;

(7)执行完当前方法后,如果没有出现异常就直接提交事务;

(8)如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务;

(9)Spring事务的隔离级别对应的就是数据库的隔离级别;

(10)Spring事务的传播机制是Spring事务自己实现的,也是Spring事务中最复杂的;

(11)Spring事务的传播机制是基于数据库连接来做的,一个数据库连接一个事务,如果传播机制配置为需要新开一个事务,那么实际上就是先建立一个数据库连接,在此新数据库连接上执行sql。

8、transaction注解怎么实现原理AOP切面编程?动态代理如何实现?

  1. AOP 切面实现事务注解

    在 Spring 中,AOP 允许将横切关注点(如事务管理)从应用程序的业务逻辑中分离出来,以提高代码的模块化和可维护性。事务注解就是通过 AOP 切面来实现的。基本流程如下:

    a. 定义事务注解:我们可以使用 Spring 提供的 @Transactional 注解来标记需要事务管理的方法。

    b. 配置 AOP 切面:在 Spring 配置中,使用切面配置来指定在哪些方法上应用事务。这些切面可以使用 @Around 等注解定义切入点和增强逻辑。

    c. 事务管理器:Spring 会自动创建一个事务代理,该代理会拦截标记有 @Transactional 注解的方法的调用。在方法调用前后,事务管理器会开启、提交或回滚事务。

  2. 动态代理实现事务注解

    动态代理是实现 AOP 的一种方式,它可以在运行时动态地创建代理对象,将横切关注点注入到被代理对象的方法中。在 Spring 的事务管理中,动态代理用于在事务注解标记的方法上织入事务管理逻辑。基本流程如下:

    a. 创建代理对象:当一个 Spring Bean 标记有 @Transactional 注解时,Spring 将创建一个代理对象,该对象包装了原始的 Bean 对象。代理对象会截获方法调用,以实现事务管理。

    b. 方法调用拦截:当调用被代理对象的方法时,代理对象会截获方法调用,并在方法调用前后执行额外的逻辑,如开启事务、提交事务、回滚事务等。

    c. 事务管理器:动态代理会与事务管理器进行交互,根据方法的执行情况决定是否提交或回滚事务。

9、什么是AOP?

AOP是面向切面编程,在Spring中用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合,一般可以作为公共日志保存、事务处理等。

10、Spring用到了哪些设计模式?

(1)工厂模式:BeanFactory、FactoryBean、ProxyFactory。

(2)原型模式:原型Bean、PrototypeTargetSource。

(3)单例模式:单例Bean、SingletonTargetSource。

(4)构建器模式:BeanDefinitionBuilder、StringBuilder。

(5)适配器模式:ApplicationListenerMethodAdapter、AdvisorAdapter。

(6)访问者模式:PropertyAccessor、MessageSourceAccessor。

(7)装饰器模式:BeanWrapper、HttpRequestWrapper。

(8)代理模式:AOP、@Configuration、@Lazy。

(9)观察者模式:ApplicationListener、AdvisedSupportListener。

(10)策略模式:BeanNameGenerator、InstantiationStrategy。

(11)模板方法模式:AbstractApplicationContext。

(12)责任链模式:DefaultAdvisorChainFactory。

11、Spring中的Bean是线程安全的吗?

Spring本身并没有针对Bean做线程安全的处理,所以:

(1)如果Bean是无状态的,那么Bean则是线程安全的。

(2)如果Bean是有状态的,那么Bean则不是线程安全的。

另外,Bean不是线程安全的,跟Bean的作用域没有关系,Bean的作用域只是表示Bean的生命周期范围,对于任何生命周期的Bean都是一个对象,这个对象是不是线程安全的,还是得看这个Bean对象本身。

12、Spring中Bean创建的生命周期有哪些步骤?

首先会通过一个非常重要的类,叫做BeanDefinition获取bean的定义信息,这里面就封装了bean的所有信息,比如,类的全路径、是否是延迟加载、是否是单例等等这些信息。

(1)在创建bean的时候,第一步,调用构造函数实例化bean

(2)第二步,bean的依赖注入,比如一些set方法的注入、@Autowried自动注入等

(3)第三步,处理Aware接口,如果某一个bean实现了Aware接口,就会重写方法执行

(4)第四步,初始化前,执行bean的前置处理器,处理@PostConstrut注解

(5)第五步,初始化时,处理InitializingBean接口

(6)第六步,初始化后,执行bean的后置处理器,主要是对bean进行增强

(7)第七步,销毁bean。

13、Spring的优缺点是什么

方便解耦,简化开发。

通过Spring提供的IOC容器,可以集中管理对象,降低对象和对象之间的耦合度,方便维护对象。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。

AOP编程的支持。

在不修改代码的情况下可以对业务代码进行增强,减少重复代码,提高开发效率,维护方便。比如,事务处理、日志管理、权限控制等。

声明事务的支持。

提高开发效率,只需要一个简单注解@Transactional。

方便程序的测试。

Spring实现测试,可以结合junit非常方便测试Spring中的Bean、SpringMVC接口。

方便集成各种优秀框架。

拥有非常强大的粘合度,集成能力非常强,只需要简单配置就可以集成第三方框架。

降低Java EE API的使用难度。

简化了开发,帮我们封装了很多功能性代码,比如JDBC、JavaMail、远程调用等。

Java源码是经典学习范例。

学习Spring底层的实现、反射、设计模式,提供了非常多的拓展接口供外部进行拓展。

14、Spring IOC容器是什么?有什么作用?

UserService service = new UserService(); //耦合度太高,维护不方便

引入IOC,将创建对象的控制权交给Spring的IOC,以前由程序员自己控制对象创建,现在交给Spring的IOC去创建,如果要去使用对象需要通过DI(依赖注入)@Autowried自动注入 就可以使用对象。

优点:(1)集中管理对象,方便维护。(2)降低耦合度。

优点:(1)IOC容器支持加载服务时的饿汉式初始化和懒加载。

(2)最小的代价和最小的侵入性使松散耦合得以实现。

15、SpringBoot如何实现依赖注入?

1、使用 XML 配置依赖注入

在 Spring Boot 中,使用 XML 配置依赖注入(DI)时,需要使用<bean>元素来定义 bean,并使用<property>元素来为 bean 的属性注入值或依赖对象。

2、使用 Java 配置类实现依赖注入(推荐)

使用 Java Config 实现依赖注入可以通过@Configuration和@Bean注解来实现。

3、使用注解来进行依赖注入(推荐)

可以使用注解来进行依赖注入,常用的注解有@Autowired和@Qualifier

16、Spring IoC 的实现机制是什么?

Spring 中的 IoC 的实现机制就是工厂模式加反射机制。

17、IOC和DI的区别是什么?

IOC是依赖倒置原则的设计思想,而DI是具体的实现方式。

18、紧耦合和松耦合有什么区别?

紧耦合是指类之间高度依赖。

松耦合是通过促进单一职责、接口分离、依赖倒置的设计原则来实现的。

19、BeanFactory的作用?

• BeanFactory是Spring中非常核心的一个顶层接口。

• 它是Bean的工厂,主要的职责就是生产Bean。

• 它实现了简单工厂的设计模式,通过调用getBean传入标识生产一个Bean。

• 它有非常多的实现类、每个工厂都有不同的职责(单一职责)功能,最强大的工厂是:DefaultListableBeanFactory。Spring底层就是使用该实现工厂进行生产Bean的。

• BeanFactory也是容器。 Spring容器(管理Bean的生命周期)。

20、BeanDefinition的作用?

它主要负责存储Bean的定义信息:决定Bean的生产方式。

如:spring.xml

<bean class="com.tuling.User" id="user" scope="singleton" lazy="false" abstract="false" autowire="none">
   <property name="username" value="xushu">
</bean>

后续BeanFactory根据这些信息就能生产Bean,比如实例化,可以通过class进行反射进而得到实例对象,比如lazy,则不会在ioc加载时创建Bean。

posted @   守漠待花开  阅读(109)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
点击右上角即可分享
微信分享提示