SpringFramework简介--理解IoC/DI/Spring设计理念

1. Spring介绍

  1. Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层构架,分层构架允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。
  2. Spring 以 IoC、AOP 为主要思想,其中 IoC (Inversion of Control) 控制反转或反向控制。在 Spring 框架中我们通过配置创建类对象,由 Spring 在运行阶段实例化、组装对象。
  3. AOP (Aspect Oriented Programming) 面向切面编程,其思想是在执行某些代码前执行另外的代码,使程序更灵活、扩展性更好,可以随便地添加、某些功能。Servlet 中的 Filter 便是一种 AOP 思想的实现。
  4. Sring 同时也是一个“一站式” 框架,即Spring 在 Java EE 的三层架构表现层 (Web 层)、业务逻辑层 (Service 层)、数据访问层 (DAO 层) 中,每一层均提供了不同的解决技术。

备注:Spring 框架跟随着多年的发展,版本的升级,最近一次发布在5.x版本。这里是基于最后一个4.x版本进行介绍的。

1.1 Spring

如下图Spring框架提供的模块:
这里写图片描述

  • Core Container (核心容器):核心容器提供 Spring 框架提供的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
  • Context (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 和 Mybatis SQL Map 。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
  • Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于Web 的应用程序提供了上下文。
  • Spring 框架支持与 Jakarta Structs/Structs2 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
  • Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括JSP、Velocity、Tiles、iText 和 POI。

1.2 Spring 核心思想

1.2.1 基本概念

  • IoC (Inversion of Control):控制反转,控制权从应用程序转移到框架(如 IoC 容器),是框架共有特性。
  • IoC 容器:实现了 IoC 思想的容器就是 IoC 容器,比如:SpringFremework,Guice (Google 开源的轻量级 DI 框架)
  • DI:依赖注入 (Dependency Injection):用一个单独的对象(装配器)来装配对象之间的依赖关系。

1.2.2 了解 IoC 容器特点

  • 无需主动 new 对象;而是描述对象应该如何被创建即可,IoC 容器帮你创建,即被动实例化;
  • 不需要主动装配对象之间的依赖关系,而是描述需要哪个服务(组件),IoC 容器会帮你装配(即负责将它们关联在一起),被动接受装配;
  • 主动变被动,好莱坞法则:别打电话给我们,我们会打给你;
  • 迪米特法则(最少知识原则):不知道依赖的具体实现,只知道需要提供某类服务的对象(面向抽象编程),松散耦合,一个对象应当对其他对象有尽可能少的了解,不和陌生人(实现)说话。
  • IoC 是一种让服务消费者不直接依赖于服务器提供者的组件设计方式,是一种减少类与类之间依赖的设计原则。

1.2.3 理解 IoC 容器的关键问题

  • 谁控制谁?为什么叫反转?
  •  答:IoC 容器控制,而以前是应用程序控制,所以叫反转。
  • 控制什么?
  •  答:控制应用程序所需要的资源(对象,文件......)
  • 为什么控制?
  •  答:解耦组件之间的关系
  • 控制的哪些方面被反转了?
  •  答:程序的控制权发生了反转,从应用程序转移到了 IoC 容器

1.2.4 理解实现 IoC 思想的容器

容器:提供组件运行环境,管理组建生命周期(不管组件如何创建的以及组件之间关系如何装配的)。
IoC 容器不仅仅具有容器的功能,而且还具有一些其他特性,比如依赖装配。
由于控制反转概念太广泛,让人迷惑,后来Martin Fowler提出依赖注入概念(扩展阅读)

1.2.5 理解 DI 问题关键

  • 谁依赖于谁?
  •  答:应用程序依赖于 IoC 容器
  • 为什么需要依赖?
  •  答:应用程序依赖于 IoC 容器装配类之间的关系
  • 依赖什么东西?
  •  答:依赖了 IoC 容器的装配功能
  • 谁注入于谁?
  •  答:IoC 容器注入应用程序
  • 注入什么 东西?
  •  答:注入应用程序需要的资源(类之间的关系)

更能描述容器其特点的名字–“依赖注入”(Dependency Injection)。IoC 容器应该具有依赖注入功能,因此也可以叫 DI 容器。

1.2.6 理解 DI 优点

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

注意:使用DI的限制,组件和装配器(IoC容器)之间不会有依赖关系,因此组件无法从装配器那里获得更多服务,只能获得配置信息中所提供的那些。

1.2.7 思路改变

  • 应用程序不主动创建对象,但要描述创建它们的方式。
  • 在应用程序代码中不直接进行服务的装配,但要配置文件中描述哪一个组件需要哪一项服务。容器负责将这些装配在一起。

IoC/DI其原理是基于OO设计原则的The Hollywood Principle:Don‘t call us, we’ll call you (别找我,我会来找你的)。也就是说,所有的组件都是被动的(Passive),所有的组件初始化和装配都由容器负责。组件处在一个容器当中,由容器负责管理。

1.3 Spring 框架特点

  • spring 是最大的工厂
  • spring 负责业务逻辑组件的框架和生成, 并管理业务逻辑组件的生命周期
  • spring 可以生产所有实例, 从控制器、 业务逻辑组件、 持久层组件​

1.4 Spring 的设计哲学

当我们了解一个框架时,重要的是不仅要知道它做了什么,还要知道它遵循了什么原则。以下是Spring框架的指导原则:

  • 在每个层次都提供选择:Spring允许您尽可能推迟设计决策。例如,您可以在不更改代码的情况下通过配置切 换持久性提供者。对于许多其他基础设施问题,以及与第三方api的集成也是如此。
  • 容纳不同的观点:Spring拥抱灵活性,并不对事情应该如何做的而固执己见。它以不同的视角支持广泛的应 用程序需求。
  • 保持强烈的向后兼容性:突破性的变化。Spring支 持精心选择的JDK版本和第三方库,以促进依赖于Spring的应用程序和库的维护。
  • 关心API设计:Spring团队将大量的思想和时间投入到制作api中,这些api是直观的,并且在许多版本和许多年里都能保持。
  • 为代码质量制定高标准::Spring框架非常强调有意义的、当前的和准确的Javadoc。它是为数不多的几个能够声称干净的代码结构,并且在包之间没有循环依赖关系的项目之一。

2. Spring 生态

自2014年起Spring框架快速发展,目前已经成为企业级应用开发的主要框架,并且成为一个生态体系。 其一直遵循模块化的设计理念,生态体系中每一项目下会有各种不同的模块,致力解决企业应用所面临的问题。
比如:数据库的操作(关系型,非关系型),批处理,安全,社交网络,微服务,大数据,云存储,工程管理等等。
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
步骤: 1. 创建Maven项目 在IDEA中,选择File -> New -> Project,选择Maven,按照向导完成创建。 2. 导入Spring框架相关jar包 在pom.xml文件中添加如下依赖: ``` <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.2</version> </dependency> ``` 3. 编写applicationContext.xml文件 在src/main/resources目录下创建applicationContext.xml文件,添加如下配置: ``` <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> <!-- 配置bean --> <bean id="userService" class="com.example.UserService"> <property name="userDao" ref="userDao"/> </bean> <bean id="userDao" class="com.example.UserDao"/> </beans> ``` 4. 通过xml配置方式实现依赖注入 在UserService类中添加如下代码: ``` public class UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } } ``` 通过setUserDao方法注入UserDao对象。 5. 通过注解方式实现依赖注入 在UserDao类上添加如下注解: ``` @Component public class UserDao {} ``` 在UserService类中添加如下注解和代码: ``` @Service public class UserService { @Autowired private UserDao userDao; } ``` 通过@Autowired注解注入UserDao对象。 6. 测试 在测试类中创建ApplicationContext对象,加载applicationContext.xml文件,获取UserService对象,并调用相关方法。 参考资料: Spring官方文档:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans Spring注解:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-annotation-config

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值