谈对Spring框架的大策大悟

套用百度百科的:Spring框架

Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。

◆目的:解决企业应用开发的复杂性

◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能

◆范围:任何Java应用

Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。

 

Spring是一个十分庞大的体系,例如:

SpringFramework

SpringData

SpringSecurity

SpringBoot

SpringCloud

当然,除了这些之外,Spring还包括很多其他的项目。

其中介绍一下SpringFramework这个项目,它是一个开源的Java/JavaEE全栈的应用程序,SpringFramework提供了一个简易的开发方式,这种开发方式可以避免使用那些可能会导致底层源代码变得繁杂混乱的大量的属性文件和帮助类。

在SpringFramework架构体系包括以下部分:

 

然后,在Spring的核心概念中:

1.Bean管理

2.依赖注入(DI),控制反转(IOC)

3.面向切面编程(AOP)

 

那么我们来细致说一下这几个概念:

1.Bean管理:

在Spring中,是将对象的创建交给Spring容器来管理的,也就是说只有将类放入Spring容器中,Spring才会对其进行一系列操作。且在实际开发中,我们通常使用配置文件来声明Bean对象。

但是再Spring是如何具体获取的类得对象?在Spring容器,有一个BeanFactory(Bean工厂)对象,是Spring容器的根接口,ApplicationContext是它的子接口,通常用它的子接口ApplicationContext来进行对Spring容器的访问。

其中BeanFactory和ApplicationContext的主要区别就是一个为即使加载和延迟加载(懒加载),具体如何表现我这里就不特地说明了,不清楚大家可也了解一下。

在ApplicationContext子接口常用的四个实现类:

1.ClassPathXmlApplicationContext从classpath加载出Spring的配置文件。

2.FileSystemApplicationContext从系统文件中加载Spring的配置文件。

3.AnnotationConfigApplicationContext获取基于注解的Spring容器对象。

4.XmlWebApplicationContext在web环境中获取Spring容器对象。

Spring通过BeanFactory来获取这些类的对象,在配置文件中通过<bean/>节点来讲类交给Spring容器进行关联(这点,我上面也说明了通常使用配置文件进行配置,但是也可以使用注解进行配置声明),ApplicationContext的实现类通过使用其getBean()方法来从Spring容器中获取对象,默认是为单例的(也就是说不是拿一次对象就创建一次对象);

 

2.依赖注入和控制反转

在市面上的介绍中,依赖注入和控制反转到底是不是同一个概念呢?其实可以将其两者认为是两种角度评判同一件的,形成的两种描述:依赖注入就是同应用程序角度来叙述,应用程序在依赖容器创建的时候并且注入它所需要的外部资源,例如参数之类的;而控制反转就是从Spring容器角度来叙述:通过Spring容器来控制应用程序,由容器反向的向应用程序中注入应用程序所需的外部资源进行系列操作。

目的就是降低程序的耦合性。具体可以这样理解:假设一个电脑对象,键盘对象和鼠标对象,那么如果要使用到电脑对象的打字方法,就需要引用到键盘对象和鼠标对象,那么这个现象就可以称电脑对象依赖到键盘和鼠标对象,并创建,这是一种依赖关系,就是一种耦合性,而且这种现象会影响到整个应用程序的生命周期,并且会带来相对较高的耦合度,不易于开发维护且违背了开发规范(如果电脑鼠标坏了,那么电脑也不能工作了,还得重新连接新鼠标),那么需要通过一个中间件来降低这种耦合性(不可以断开)。

因此就引发出一种著名的设计原则:依赖注入,控制反转。它的核心原理就是将具体实体类之间的依赖关系,尽可能的转换为一种抽象的依赖关系(将电脑依赖鼠标转换为电脑依赖外设,依赖一种抽象,非实体的对象),那这个时候就与Java的特性相呼应了,抽象和接口就是这样功能,至于他两的区别,其他博文有细说。

小结:对于IOC和DI对于开发的最大优势,不是从开发编码上,而是从编程思想上,产生了一种将控制权转换为被动权。原本程序是想要什么类,依赖什么类自己直接获取就是了,现在IOC/DI思想中,一切变为被动,被动的等待IOC/DI容器来创建并注入它所需要的资源。有效的分离了对象和它所需要的外部资源,降低了结构的耦合度,增加了功能的复用性,使得整个程序的体系机构灵活,利于后期维护。

 

3.面向切面编程(AOP,全称为Aspect Oriented Programming)

先说下什么是面向切面编程:定义一个切面,从二维方向的纵向定义处理方法,处理完成之后,回到横向进行处理业务逻辑。

AOP是在Spring框架中被作为核心组成部分之一,解耦式开发,将程序进行模块化。在Spring中,AOP的确发挥强大的思想,最好体现的就是事务控制,通过Spring,进行对全局代码块的事务控制,这也是Spring的一大亮点。

对于面向对象大家都熟悉,OOP是从静态角度考虑程序结构,但是AOP是从动态角度考虑程序运行过程。对于两者,可以认为AOP是OOP的完善和补充。在OOP中造成了大量重复代码块,而AOP是一种横切技术。

 

posted @ 2019-02-23 21:54  CHANGEMAX  阅读(104)  评论(0编辑  收藏  举报