Spring 原理及知识点总结
1、Spring框架的优势****
1)Spring通过DI、AOP和消除样板式代码来简化企业级Java开发
除了 Spring 框架之外, 还有一个基于其核心框架构建起来的巨大生态系统. 该生态系统将支持 Spring 在多个应用场景中的应用, 包括 Web 服务应用, RESTful 服务接口, 移端开发以及与非关系型数据库的集成.
3)低侵入式设计,代码的污染极低
不依赖于任何应用服务器、遵循Spring框架构建的应用能够完美地实现Write Once,Run Anywhere承诺
Spring的IoC容器简化了业务对象替换过程的复杂度,并增强了组件之间的关联性。
Spring的AOP支持将一些通用功能如安全、事务管理和日志记录等整合处理,并进而实现了更高效的复用。
7)Spring的ORM和DAO支持了与第三方持久层框架的良好兼容性,并简化了底层数据库访问流程
8)Spring的开放特性并不强制要求完全依赖于Spring框架, 开发者可根据需求自由选择使用框架的部分或全部功能.
2、IOC和DI是什么?
在控制反转模式下,应用无需管理依赖对象的创建与维护;而这些职责则完全交由外部容器来完成。通过这种方式可以实现将原本属于应用的责任转移给外部容器的目标;这种责任转移过程即被定义为控制反转。
具体而言,在程序运行期间
3、描述下Spring IOC容器的初始化过程
Spring IOC容器的初始化简单的可以分为三个过程:
第一个步骤涉及对Resource资源的定位。该步骤关注的是BeanDefinition中的资源定位问题。这一机制类似于水桶装水时需要先找到水源的过程。
第二步是 BeanDefinition 的注入过程。在这个过程中,在 Ioc 容器中被转换为数据结构的形式,并且其中这种数据结构即为 BeanDefition。
第三个步骤是将这些BeanDefinitions注册到IOC container的过程;这个步骤的主要作用是实现存储管理功能。
4、BeanFactory 和 FactoryBean的区别?
BeanFactory 是一个工厂类(factory),也即 IOC 容器或对象工厂,在 Spring 中扮演着核心角色。所有需要管理的对象( beans)都必须通过该 BeanFactory( 也即 IOC 容器)来创建实例或获取现有实例的行为。该类承担着为各种 Bean 实现生命周期管理、配置管理和组件注入功能两大核心功能。
使用场景:
从Ioc容器中获取Bean(byName or byType)
检索Ioc容器中是否包含指定的Bean
判断Bean是否为单例
FactoryBean 属于JavaBeans接口家族中的一员。它并非普通的JavaBean类,而是能够创建或修饰用于生成特定对象的对象生成器这一特殊功能的类。其架构设计思路与创建型设计模式及装饰者模式不谋而合。
使用场景
ProxyFactoryBean
5、BeanFactory和ApplicationContext的异同

相同:
Spring将IOC容器分为两种不同的类型:包括BeanFactory以及ApplicationContext。这些容器均为java.beans.IFace接口,并且它们都实现了相应的API方法和行为规范。其中ApplicationContext作为高级版本,在其基础上进一步支持了一些高级功能特性如可列表性等,并因此能够实现更复杂的业务逻辑需求。
它们都可以用来配置XML属性,也支持属性的自动注入。
ListableBeanFactory继承于 BeanFactory,并且ApplicationContext 都提供了某种获取 Bean 的方式。通过调用 getBean("bean name")来获取所需 Bean 对象。
不同:
当您在调用getBean()方法时,在使用到该类的地方仅仅实现了 bean 的初始配置功能;与之不同的是,在启动容器的过程中会实现单例 bean 的初始化,并且这种初始化过程是无需等待该方法被调用后再进行的。
BeanFactory未提供国际化功能(即i18n),然而ApplicationContext通过实现了相应的接口来实现了对它的支持。
在BeanFactory和ApplicationContext之间的一个显著区别在于它们均具备将事件转发至已注册为监听器的Bean的能力。
基于核心功能的实现方案中,...的核心技术架构包括XMLBeanFactory和ClassPathXmlApplicationContext两种主要模式。其核心功能的实现方式包括采用...作为Web容器的基础架构,并在此基础上增加了getServletContext方法来支持服务容器环境配置的操作。
当采用自动注入策略并配合BeanFactory时,则需通过API注册相应的AutoWiredBeanPostProcessor类以便实现功能整合;而若选择基于ApplicationContext的方式,则建议采用通过XML文件的形式配置应用逻辑以确保灵活性与可维护性。
简单来说, BeanFactory支持基础的一类对象注入(IOC)和依赖注入(DI)功能, 而与之相比, ApplicationContext则提供了更为高级的功能. BeanFactory常用于测试环境及非生产场景的应用, 但与之相比, 在功能丰富程度上, ApplicationContext显然更胜一筹. 因此, 在大多数情况下,默认选择ApplicationContext会更加合适.
6、Spring Bean 的生命周期

总结:
(1)实例化Bean:
在Java beans生命周期管理中,在使用 BeanFactory 容器时,在客户端(即应用程序)请求一个尚未初始化的 bean 或在其进行初始化操作时(即需要注入另一个尚未初始化的依赖),系统会调用 createBean 方法进行实例化。而对于 Java beans 在应用环境中配置的应用 containers(ApplicationContext)来说,在其 bootstrapping 完成后(即完成 bootstrapping 过程),会根据 BeanDefinition 对象中的配置信息来生成所有 bean 实例。
(2)设置对象属性(依赖注入):
实例化后的对象被包装到BeanWrapper对象中。随后地(或接着),Spring基于BeanDefinition中的信息,并通过支持设置属性的接口来完成对实例化的依赖注入。
(3)处理Aware接口:
接着,Spring会识别该对象是否遵循了xxxAware接口,并将其相关的xxxAware实例注入给Bean
当该Java Bean实现了Java Bean Name Aware接口时,在满足条件的情况下系统将调用该接口提供的setBeanName(String beanId)方法,并将传递给此方法的参数解释为Spring配置文件中定义的该对象的ID值。
如果这个Bean已经实现了该接口(即BeanFactoryAware),则会调用该接口实现的setBeanFactory()方法,并且传递的是Spring工厂提供的实例。
如果该Bean已经实现了相应的接口(如{Math}),则将执行调用{set}{set}{Context}{Context}的方法,并传递给Spring上下文。
(4)BeanPostProcessor:
为了实现对 Bean 进行一些自定义处理的目的,则让该 Bean 类实现了 BeanPostProcessor 接口而导致该类将调用 postProcessBeforeInitialization(Object obj, String s) 方法。
(5)InitializingBean 与 init-method:
当Bean在Spring配置文件中设置了 init-method 属性时,则会触发其指定的初始化方法。
当该Bean实现了BeanPostProcessor接口时, 该类将执行postProcessAfterInitialization(Object obj, String s)方法. 因为该方法在Bean初始化完成后执行, 因此它适用于内存或缓存技术.
在完成了以上几个步骤后, 系统已经成功地实现了Bean的正确创建; 那么就可以利用这个Bean来进行后续操作.
(7)DisposableBean:
当一个对象不再被系统所需时,则会被发送到清理阶段;若该对象实现了DisposableBean这一接口,则该实现将会调用其自身的destroy()方法。
(8)destroy-method:
在最后部分提到的设置中,请注意当这个Bean的Spring配置中设置有destroy-method属性时,则会自动触发调用其配置所指定的销毁方法。
7、Spring AOP的实现原理?
在Spring AOP框架下采用动态代理方案,则意味着该技术不会直接修改程序的字节码文件。相反,在内存中临时创建并为每个需要切点增强的对象生成一个特殊的代理类。这种设计不仅包含目标对象的所有现有功能,在某些关键点还进行了强化处理,并会触发原对象的相关操作流程。
在Spring AOP框架中存在两种主要的动态代理模式:基于Java标准库(JDK)的(JDK)动态代理方案以及基于Commons Lang库(CGLIB)的动..态代..方案。该方案利用反射机制接收被 proxy 对象,并要求目标类必须实现所需 interface.其核心组件包括InvocationHandler 接口以及 Proxy 类.
当目标类未实现相关接口时
8、Spring 是如何管理事务的?
Spring事务管理主要包括3个接口,Spring的事务主要是由它们(PlatformTransactionManager,TransactionDefinition,TransactionStatus)三个共同完成的。
1. PlatformTransactionManager :事务管理系统--负责处理与平台相关的各种事务管理
主要有三个方法:
commit 事务提交;
rollback 事务回滚;
getTransaction 获取事务状态。
2. TransactionDefinition :事务定义信息项--用于定义事务相关属性的数据项,并为平台交易管理器PlatformTransactionManager提供所需的支持
这个接口有下面四个主要方法:
getIsolationLevel:获取隔离级别;
getPropagationBehavior:获取传播行为;
getTimeout:获取超时时间;
isReadOnly:是否可读性?当执行保存、更新或删除操作时(此时属性值设为false),表示该对象不可再被修改;而当执行查询操作时(此时返回true),则表示该对象处于只读状态。
事务管理器基于这个返回值进行优化,并且这些事务的配置信息均可以通过配置文件进行设置。
3. TransactionStatus :事务运行状态--在事务管理期间各个时间节点的状态信息。
例如它的几个方法:
hasSavepoint():返回这个事务内部是否包含一个保存点,
isCompleted():返回该事务是否已完成,也就是说,是否已经提交或回滚
isNewTransaction():判断当前事务是否是一个新事务
声明式事务的优缺点 :
优点明显在于业务逻辑代码中无需编排事务相关代码属于系统内部管理范畴而采用该方法可避免外部干预从而降低了技术实现难度
其弊端在于声明式事务对其实现的最小粒度进行操作。然而,在现有技术架构中若存在代码块同样需要事务管理的需求,则必须对其进行相应处理。
9、Spring 中用到了哪些设计模式
代理模式—在AOP中被用的比较多。
单例模式—在spring配置文件中定义的bean默认为单例模式。
模板方法主要用于应对代码重复的问题。例如:RestTemplate、JmsTemplate和JpaTemplate等即为其中的常见类型。
工厂模式—BeanFactory用来创建对象的实例。
适配器--spring aop
装饰器--spring data hashmapper
观察者-- spring 事件驱动模型
回调--Spring Aware回调接口
10、Spring如何解决循环依赖
https://www.cnblogs.com/xymchy/p/14980799.html
11、bean的作用域
singleton:默认情况下,在每个容器中只会存在一个bean实例,默认遵循单例模式管理。
(2)prototype:为每一个bean请求提供一个实例。
request:负责对每个网络请求生成一个实例,在处理完毕后将不再存活
会话:类似于请求范围的机制,在确保每个会话实例均绑定一个Bean对象实例的情况下,在达到时间限制时自动失效。
12、Spring框架中有哪些不同类型的事件
(1)ContextRefreshedEvent是一种用于表示上下文更新状态的事件:它会在ConfigurableApplicationContext 接口的refresh()方法被调用时被捕获。
当容器调用ConfigurableApplicationContext的Start()方法时(即启动/重新启动容器),会触发ContextStartedEvent。
(3)上下文停止事件(ContextStoppedEvent):当且仅当配置容器的Stop方法被调用时触发此特定事件。
在ApplicationContext关闭时会被触发的上下文关闭事件(ContextClosedEvent):当容器被关闭时,该事件被触发,并导致系统释放所有注册的单例Bean。
在Web应用中
13、Spring通知有哪些类型
前置通知(Before advice):这些指示是在某个连接点之前发出的,并且不会阻止该连接点之前的执行;然而,在触发异常时才会介入干预。
(2)返回后通知(After returning advice):当某个接合点顺利完成时所发出的通知:例如,在一个正常的处理流程中没有出现错误的情况下。
(3)当出现错误时会触发事件(After throwing advice):当方法调用导致错误并终止运行时会触发该事件。
后续告知(Upon final advice):在连接断开时发出的通知,无论是在正常关闭还是发生故障后进行处理。
在软件开发中,环绕通知(Around Advice)是一种旨在包裹连接点(join point)的通知机制,并常用于方法调用场景。这种机制允许开发者在任何情况下根据需求决定如何处理这些连接,并通过这种方式实现对关键业务逻辑的灵活控制能力。作为最强大的一种机制,在处理这些连接时它展现出卓越的能力,并且能够通过这种方式实现对关键业务逻辑的灵活控制能力
14、Spring的自动装配
在Spring框架中,默认情况下不需要实例自行查找或创建关联对象;依赖注入容器会自动管理各对象间的协作关系,并赋予必要的引用权限;通过配置自动注入模式实现组件之间的无缝集成。
在Spring框架xml配置中共有5种自动装配:
(1)不:常规做法是未采用自动化装配机制,在配置时需要通过设置ref属性来手动完成bean的装配过程。
(2)byName:依据bean名称实现自动生成;若有两个不同的bean拥有相同的属性值和名称,则会执行自动生成。
(3)byType:通过参数的数据类型进行自动装配。
(4)constructor:采用构造函数作为装配的主要手段,并且这些构造函数的参数将被指定为byType类型
autodetect: automatic detection of constructors. If a constructor exists, it will be assembled using the construct-based manner. Otherwise, the type-based approach will be employed.
基于注解的方式:
通过Autowired注解库实现对指定Bean的自动化配置。在前一步骤中需要在Spring框架中进行设置,$<context:annotation-config />。
在部署Spring IoC时,容器会集成一个AutowiredAnnotationBeanPostProcessor作为后续处理组件。当容器识别到@Autowied、@Resource或@Mirror等标记时,默认会在IoC中定位所需 beans。
为该对象赋值其属性。当采用Bean Autowiring时,请系统从容器中查找相应的Bean实例:
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;
如果查询的结果不止一个,那么@Autowired会根据名称来查找;
如果上述搜索无结果,则会导致异常发生。建议将此字段设置为required=false。
@Autowired可用于:构造函数、成员变量、Setter方法
注: @Autowired和@Resource之间的区别
通过@Autowired实现时,默认采用类型化的方式进行注入,在默认配置下,该机制要求依赖对象必须存在(可以设置其required属性为false)。
@Resource默认是通过名称来装配注入的,除非能够匹配到与名称对应的bean,否则就会按照类型来装配注入。
此只是学习过程中摘抄的笔记,方便后续复习时使用。
