Spring框架概述

什么是Spring

Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。任何 Java 应用都可以从 Spring 中受益。Spring 的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring 是一个分层的 JavaSE/EE full-stack(一站式) 轻量级开源框架

  • 1、轻量级:与EJB对比,依赖资源少,销毁的资源少。
  • 2、一站式,每一个层都提供的解决方案

Spring核心

Spring 面向方面编程(AOP)控制反转 (IOC) 容器

Spring优点

  • 1、方便解耦,简化开发 (高内聚低耦合),使用Spring的IOC容器,将对象之间的依赖关系交给Spring,让我们更专注于应用逻辑
  • 2、Spring就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给Spring管理
  • 3、对主流的框架提供了很好的集成支持,如Hibernate,Struts2,JPA等
  • 4、Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
  • 5、Spring的高度可开放性,并不强制依赖于Spring,开发者可以自由选择Spring部分或全部

Spring体系结构

Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图所示。

组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

  • 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
  • Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
  • Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
  • Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
  • Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
  • Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
  • Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

看了 Spring 是什么,我们再来看看 Spring 的两大核心。

Spring 两大核心 IOC 跟 AOP

Spring依赖注入和控制反转的理解

Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。

理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”

谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。

DI—Dependency Injection,即“依赖注入”:由容器动态的将某个依赖关系注入到组件之中。

理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”

谁依赖于谁:当然是应用程序依赖于IoC容器;

为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;

谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;

注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

2004年,大师级人物 Martin Fowler 给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。

当初学习 Spring 的时候看过很多对 Spring 的 IOC 的理解的文章,官方文档也看过。实际上开发过程中自己是实操过,但是对这个控制反转还是一头雾水,在慕课上看了一篇学习笔记,对作者的这种解释比较满意,清楚的解释了什么是控制,什么是反转,谁依赖谁,谁注入谁。

面向切面编程AOP

什么是AOP呢?

我们常说:“这件事情要从几个方面来看待”,往往意思是:需要从不同的角度来看待同一个事物。这里的“方面”,指的是事物的外在特性在不同观察角度下的体现。而在AOP中,Aspect的含义,可能更多的理解为“切面”比较合适。这在程序开发上就是:通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

主要功能:
日志记录,性能统计,安全控制,事务处理,异常处理等等。

什么时候用到AOP呢?

拿我前面做过的一个项目举个例子吧,做的是一个公司的订餐系统,这个系统需要用到Shiro鉴权。
项目里面很多的接口,但是有的接口不需要鉴权就可以访问了,是开放的。
但是还有一些接口,需要特定权限的用户才能访问,比如说公司的领导的权限跟员工的权限不一样,还有系统管理员。

如果要用 OOP 处理的话,必须在对应的接口代码里面,一个一个写上鉴权的代码。

但是如果使用了AOP之后,写一个接口,在需要鉴权的接口上面添加一个注解即可解决了。这样的做法,对原有代码毫无入侵性,这就是AOP的好处了,把和主业务无关的事情,放到代码外面去做。

上面的例子。给 listCanteenOrders() 方法加入鉴权采用了代理模式。代理模式就是:写了新的接口,去代理一个一个鉴权的代码鉴权。

代理分为静态代理和动态代理,静态代理,顾名思义,就是你自己写代理对象,动态代理,则是在运行期,生成一个代理对象。

Spring AOP就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象。

AOP常用的还有在日志打印跟事务处理方面应用的比较多。

AOP的优点

  • AOP 是一个概念,一个规范,本身并没有设定具体语言的实现,这实际上提供了非常广阔的发展的空间。
  • AOP 同时还可以让我们层次化功能性而不是嵌入功能性,从而使得代码有更好的可读性和易于维护。
  • AOP 让我们在进行系统架构和模块设计的时候多了新的选择和新的思路。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值