docs.spring.io网站谷歌机翻部分表达不明确仅供参考
spring
Spring 使创建 Java 企业应用程序变得容易。它提供了在企业环境中使用 Java 语言所需的一切,支持 Groovy 和 Kotlin 作为 JVM 上的替代语言,并且可以根据应用程序的需要灵活地创建多种架构。从 Spring Framework 5.1 开始,Spring 需要 JDK 8+ (Java SE 8+) 并为 JDK 11 LTS 提供开箱即用的支持。
“春天”这个词在不同的语境中有不同的含义。它可以用来指代 Spring Framework 项目本身,它是一切的起点。随着时间的推移,其他 Spring 项目已经建立在 Spring 框架之上。大多数情况下,当人们说“Spring”时,他们指的是整个项目系列。本参考文档侧重于基础:Spring 框架本身。
Spring Framework 分为模块。应用程序可以选择他们需要的模块。核心是核心容器的模块,包括配置模型和依赖注入机制。除此之外,Spring Framework 还为不同的应用程序架构提供基础支持,包括消息传递、事务数据和持久性以及 Web。它还包括基于 Servlet 的 Spring MVC Web 框架,以及并行的 Spring WebFlux 反应式 Web 框架。
一、IOC(容器) and DI依赖注入
源自spring2.0 和 2.5 的改进
-
DI 的意思是依赖注入,和控制反转是同一个概念的不同角度的描述,即应用程序在运行时依赖 Ioc 容器来动态注入对象需要的外部资源
-
IoC也称为依赖项注入(DI)。这个过程中,对象只能通过构造函数参数、工厂方法的参数或在对象实例被构造或从工厂方法返回后在对象实例上设置的属性来定义它们的依赖关系(即它们使用的其他对象)。然后,容器在创建bean时注入这些依赖项。这个过程基本上是bean本身的逆过程(因此得名为控制反转),通过使用类的直接构造或Service Locator模式等机制来控制其依赖项的实例化或位置 。
1、IOC概述
控制反转
控制反转 inverse of Control 创建对象的权限 ,java 程序中需要用到的对象不在由程序员创建而是交给
IOC容器来创建。
org.springframework.context.ApplicationContext接口表示 Spring IoC 容器,负责实例化、配置和组装 bean。容器通过读取配置元数据获取有关要实例化、配置和组装哪些对象的指令。配置元数据以 XML、Java 注释或 Java 代码表示。它允许您表达组成应用程序的对象以及这些对象之间丰富的相互依赖关系。
在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。bean 是由 Spring IoC 容器实例化、组装和管理的对象。否则,bean 只是应用程序中众多对象中的一个。Bean 以及它们之间的依赖关系反映在容器使用的配置元数据中。
扩展性增加
耦合度降低
二、 SpringAOP
Spring 的关键核心组件之一就是AOP 框架,AOP其实是一种编程思想,不是只有spring使用了AOP这个思想,很多框架也在用这个套路。
参考官网 AOP
面向切面编程(AOP),在面向对象编程(oop)思想中,我们将事物纵向抽成一个个的对象。
而在面向切面编程中,我们将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。
Spring AOP 是用纯 Java 实现的。不需要特殊的编译过程。Spring AOP 不需要控制类加载器层次结构,因此适合在 J2EE Web 容器或应用服务器中使用。
Spring AOP 的 AOP 方法和其他 AOP 框架不同。目的不是提供最完整的AOP实现(虽然Spring AOP相当能干);而是提供 AOP 实现和 Spring IoC 之间的紧密集成,以帮助解决企业应用程序中的常见问题。
1、SpringAOP概述
-
提供声明式企业服务,尤其是作为 EJB 声明式服务的替代品。此类服务中最重要的是声明式事务管理。
-
允许用户实现自定义方面,用 AOP 补充他们对 OOP 的使用。
直接方法
-
前置通知(Before Advice),在目标方法执行前拦截,并执行相关操作。
-
后置通知(After Advice),在目标方法执行后拦截,并执行相关操作。
-
返回通知(After-Returning Advice),在目标方法正常返回后拦截,并执行相关操作。
-
异常通知(After-Throwing Advice),在目标方法抛出异常时拦截,并执行相关操作。
-
环绕通知(Around Advice),在目标方法执行前后都可拦截,并执行相关操作。
包括但不限于
Authentication :权限Caching :缓存Context passing :内容传递Error handling :错误处理Lazy loading :懒加载Debugging :调试logging, tracing, profiling and monitoring :记录跟踪 优化 校准Performance optimization: 性能优化Persistence : 持久化Resource pooling: 资源池Synchronization: 同步Transactions: 事务
作者:悟纤
链接:https://www.zhihu.com/question/395001533/answer/1224416423
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2、Spring AOP 中的动态代理(简述)
GPT:AOP的底层原理是基于Java动态代理技术,具体来说,当使用AOP来拦截某个类的某个方法时,Spring底层会使用Java动态代理创建一个代理对象,该代理对象会与原始对象实现相同的接口或继承相同的父类,并且为被代理的方法提供额外的处理逻辑。
AOP 底层是动态代理,如果是接口采用 JDK 动态代理,如果是类采用CGLIB 方式实现动态代理。
主要有两种方式,JDK 动态代理
和 CGLIB 动态代理
:
- JDK 动态代理只提供接口代理,不支持类代理,核心 InvocationHandler 接口和Proxy 类,InvocationHandler 通过 invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起,Proxy 利用 InvocationHandler 动态创建一个符合某一接口的的实例, 生成目标类的代理对象。
- 如果代理类没有实现 InvocationHandler 接口,那么 Spring AOP 会选择使用
CGLIB 来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,
可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从
而实现 AOP。CGLIB 是通过继承的方式做的动态代理,因此如果某个类被标记为 final,
那么它是无法使用 CGLIB 做动态代理的