01. Spring编程思想

Posted IT BOY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01. Spring编程思想相关的知识,希望对你有一定的参考价值。

目录

01 Spring编程思想

Pt1 Spring设计初衷

Pt2 一切从Bean开始

Pt3 Spring编程思想

Pt3.1 Bean设计理念(BOP)

Pt3.2 IoC(控制反转)和DI(依赖注入)

Pt3.3 BeanFactory设计理念

Pt3.4 AOP编程理念


01 Spring编程思想

Pt1 Spring设计初衷

我基本算是从Struts2时代开始软件开发的,虽然周围接触的还有很多Struts1时代遗留的产物,但是Struts2 + Hibernate已经成为了主流的搭配,后来没过多久Spring开始流行,MVC大行其道,SSH组合成为风靡一时的Java开发框架。那时候要在SSH框架中集成各种组件,都要自己进行装配,也没有JdbcTemplate,每个项目要自己写很多模板代码,更不用说用Servlet开发的年代了。

程序员不只要考虑业务代码的实现,还需要考虑大量通用技术问题,框架的融合,组件的引入和管理等。不像现如今的开发,集成框架提供大量通用问题的解决方案,程序员只需要关注业务的实现。而对各种组件、通用问题的解决中,Spring无疑是佼佼者。

 

在传统应用程序开发中,一个完整的应用是由—组相互协作的对象组成。所以开发一个应用除了要开发业务逻辑之外,最多的是关注如何使这些对象协作来完成所需功能,而且要低耦合、高内聚。

业务逻辑开发是不可避免的,那如果有个框架能帮我们创建对象及管理这些对象之间的依赖关系,就能释放大量的开发劳动力。可能有人说了,诸如"抽象工厂、工厂方法模式" 不也可以帮我们创建对象," 生成器模式" 帮我们处理对象间的依赖关系,不也能完成这些功能吗?可是这些又需要我们创建另一些工厂类、生成器类,我们又要而外管理这些类,同样增加了开发的负担,如果能有种通过配置方式来创建对象,管理对象之间依赖关系,我们不需要通过工厂和生成器来创建及管理对象之间的依赖关系,这样可以减少许多开发工作,加速了开发效能,节省出很多时间来处理业务逻辑。

Spring框架的设计初衷就是要完成这个目标的。

 

Spring除了能帮助我们管理对象及其依赖关系,还提供像通用日志记录、性能统计、安全控制、异常处理等面向切面的能力,还能管理最头疼的数据库事务。它本身提供了一套简单的JDBC访问实现,提供与第三方数据访问框架集成(如 Hibernate. JPA),与各种Java EE技术整合(如 Java Mail、任 务调度等等),提供一套自己的Web层框架Spring MVC、而且还能非常简单的与第三方Web框架集成。从这里我们可以认为Spring是一个超级粘合大平台,除了自己提供功能外,还提供粘合其他技术和框架的能力,从而使我们可以更自由的选择到底使用什么技术进行开发。而且不管是JAVASE ( C/S 架构)应用程序还是JAVA EE ( B/S架构)应用程序都可以使用这个平台进行开发。如今的Spring已经不再是一个框架,早已成为了一种生态。SpringBoot的便捷式开发实现了零配置,SpringCloud全家桶,提供了非常方便的解决方案。

 

总结来说,Spring是为解决企业级应用开发的复杂性而设计,她可以做很多事。但归根到底支撑Spring的仅仅是少许的基本理念,而所有的这些基本理念都能可以追溯到一个最根本的使命:简化开发。

这是一个郑重的承诺,其实许多框架都声称在某些方面做了简化,而 Spring则立志于全方面的简化Java开发。

对此,Spring主要采取了几个关键策略:

  1. 约定大于配置

  2. 基于POJO的轻量级和最小侵入性编程(BOP,面向Bean编程)。

  3. 通过依赖注入(DI)和面向接口编程实现松耦合。

  4. 通过切面(AOP)和惯性进行声明式编程。

  5. 通过切面(AOP)和模板减少样板式代码。

     


Pt2 一切从Bean开始

说到Bean这个概念,还得从Java的起源说起。

  • 早在1996年 ,Java还只是一个新兴的、初出茅庐的编程语言。人们之所以关注她仅仅是因为,可以使用Java的Applet来开发Web应用,作为浏览器组件。但开发者们很快就发现这个新兴的语言还能做更多的事情。与之前的所有语言不同,Java让模块化构建复杂的系统成为可能(当时的软件行业虽然在业务上突飞猛进,但当时开发用的是传统的面向过程开发思想,软件的开发效率一直踟蹰不前。伴随着业务复杂性的不断加深,开发也变得越发困难。其实,当时也是OOP思想飞速发展的时期,她在80年代末被提出,成熟于90年代,现今大多数编程语言都已经是面向对象的)。

  • 同年12月 ,Sun公司发布了当时还名不见经传但后来人尽皆知的JavaBean 1.00-A规范。早期的 Java Bean规范针对于Java,她定义了软件组件模型。这个规范规定了一整套编码策略,使简单的Java 对象不仅可以被重用,而且还可以轻松地构建更为复杂的应用。尽管JavaBean最初是为重用应用组件而设计的,但当时他们却是主要用作构建窗体控件,毕竟在PC时代那才是主流。但相比于当时正如日中天的Delphi. VB和 C++ ,它看起来还是太简易了,以至于无法胜任任何"实际的"工作需要。

  • 复杂的应用通常需要事务、安全、分布式等服务的支持,但 JavaBean并未直接提供。所以到了 1998 年 3 月 ,Sun公司发布了 EJB 1.0规范,该规范把Java组件的设计理念延伸到了服务器端,并提供了 许多必须的企业级服务,但他也不再像早期的JavaBean那么简单了。实际上,除了名字叫EJB Bean 以外,其他的和JavaBean关系不大了。

  • 尽管现实中有很多系统是基于EJB构建的,但 EJB从来没有实现它最初的设想:简化开发。EJB的 声明式编程模型的确简化了很多基础架构层面的开发,例如事务和安全;但另一方面EJB在部署描述符和配套代码实现等方面变得异常复杂。随看时间的推移,很多开发者对EJB已经不再抱有幻想,开始寻求更简洁的方法。

  • 现在Java组件开发理念重新回归正轨。新的编程技术AOP和 DI的不断出现,他们为JavaBean提 供了之前EJB才能拥有的强大功能。这些技术为POJO提供了类似EJB的声明式编程模型,而没有引入 任何EJB的复杂性。当简单的JavaBean足以胜任时,人们便不愿编写笨重的EJB组件了。

  • 客观地讲,EJB的发展甚至促进了基于POJO的编程模型。引入新的理念,最新的EJB规范相比之前的规范有了前所未有的简化,但对很多开发者而言,这一切的一切都来得太退了。到了EJB3规范发布时,其他基于POJO的开发架构已经成为事实的标准了,而Spring框架也就是在这样的大环境下出现的。

 


Pt3 Spring编程思想

Pt3.1 Bean设计理念(BOP)

Spring是面向Bean的编程(Bean Oriented Programming,BOP),Bean在Spring中才是真正的主角。Bean在Spring中作用就像Object对OOP的意义一样重要。同时,Spring提供了IOC容器通过配置文件或者注解的方式来管理Bean对象以及对象之间的依赖关系。

在典型的IOC场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法完成属性值的填充。

 

Pt3.2 IoC(控制反转)和DI(依赖注入)

控制反转(IoC)的基本概念是:不创建对象,只描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务,由容器负责创建对象。即“控制反转”是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

 

依赖注入(DI)的基本概念是:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

 

IoC是实现的目标,而DI是一种实现IoC的手段。但是实现IoC并不仅仅只能通过DI(依赖注入)实现,也可以通过依赖查找实现。但Spring通过DI实现了IoC控制反转。

 

Pt3.3 BeanFactory设计理念

Spring的最高级抽象是BeanFactory接口,它是工厂模式的实现,允许通过名称创建和索引对象。BeanFactory负责管理对象之间的关系。

BeanFactory底层支持两个对象模型:

  • 单例模型(默认):提供了具有特定名称的全局共享实例对象,可以在查询时对其进行检索。

  • 原型模型(可通过scope=prototype进行修改):确保每次检索都会创建单独的实例对象。在每个用户都需要自己独立的对象时,采用原型模型。

 

Pt3.4 AOP编程理念

面向切面编程,即AOP,是一种编程思想,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP的核心构造是切面,它将那些影响多个类的行为封装到可重用的模块中。

  1. AOP的核心构造是切面,它将那些影响多个类的行为封装到可重用的模块中。

  2. AOP和IoC是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中可能要将日志记录语句放在所有方法和Java类中才能实现日志功能。在AOP方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是Java类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用Spring AOP编写的应用程序代码是松散耦合的。

  3. AOP的功能完全集成到了 Spring事务管理、日志和其他各种特性的上下文中。例如,通过@Transactional注解可以轻松的实现事务的管理。

  4. AOP编程的常用场景有:Authentication权限认证)、Auto Caching(自动缓存处理)、Error Handling(统一错误处理)、Debugging(调试信息输出)、Logging(日志记录)、Transactions(事务处理)等。

 


参考学习资料和相关文章列表,请参照如下链接:

https://blog.csdn.net/moonlight821/article/details/116463513

以上是关于01. Spring编程思想的主要内容,如果未能解决你的问题,请参考以下文章

Spring学习:面向接口编程思想

重磅丨《Spring Boot编程思想(核心篇)》现已开启预售!

Spring核心思想:IOC(控制反转)DI(依赖注入)和AOP(面向切面编程)

SpringBoot编程思想

小马哥讲Spring核心编程思想 学成路更宽,吊打面试官

AOP思想(面向切面编程)