Spring--概述及IOC导论

spring简介

  • Spring:轻量级框架,Java EE的春天,当前的主流框架,”一站式“的企业应用开发框架。
  • 2002年,首次推出了Spring框架的雏形:interface21框架!
  • Spring框架以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日,发布了1.0正式版。
  • Rod Johnson, Spring Framework创始人 ,著名作者。 很难想象Rod Johnson的学历,真的让好多人大吃一惊,他是悉尼大学的博士,然而他的专业不是计算机,而是音乐学。
  • Spring设计理念:Spring是面向Bean的编程,使现有的技术更加容易使用,本身是一个大杂烩。

spring官网:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html

GitHub下载地址:https://github.com/spring-projects/spring-framework

SSH:Struct2 + Spring + Hibernate!

SSM:SpringMVC + Spring + Mybatis! 我们要学的是这个!

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.3</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.3</version>
</dependency>

Spring的优点

  • 开源的免费的框架(容器)!
  • 轻量级的、非入侵式的框架!
  • 两大核心技术:
    • 控制反转(IOC:Inversion of Control) / 依赖注入(DI:Dependency Injection)
    • 面向切面编程(AOP:Aspect Oriented Programming)
  • 支持事务的处理,与第三方框架的良好整合.
  • 独立于各种应用服务器。
  • 依赖注入特性将组件关系透明化,降低了耦合度。
  • 面向切面编程特性允许将通用任务进行集中式处理。

总结:Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架!

Spring的组成

在这里插入图片描述

1. Data Access/Integration(数据访问/集成)

数据访问/集成层包括 JDBC、ORM、OXM、JMS 和 Transactions 模块,具体介绍如下。

  • JDBC 模块:提供了一个 JDBC 的抽象层,大幅度减少了在开发过程中对数据库操作的编码。
  • ORM 模块:对流行的对象关系映射 API,包括 JPA、JDO、Hibernate 和 iBatis 提供了的集成层。
  • OXM 模块:提供了一个支持对象/XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。
  • JMS 模块:指 Java 消息服务,包含的功能为生产和消费的信息。
  • Transactions 事务模块:支持编程和声明式事务管理实现特殊接口类,并为所有的 POJO。

2. Web 模块

Spring 的 Web 层包括 Web、Servlet

  • Web 模块:提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IoC 容器初始化以及 Web 应用上下文。
  • Servlet模块:包括 Spring 模型—视图—控制器(MVC)实现 Web 应用程序。
  • Struts 模块:包含支持类内的 Spring 应用程序,集成了经典的 Struts Web 层。
  • Portlet 模块:提供了在 Portlet 环境中使用 MV C实现,类似 Web-Servlet 模块的功能。

3. Core Container(核心容器)

Spring 的核心容器是其他模块建立的基础,由 Beans 模块、Core 核心模块、Context 上下文模块和 Expression Language 表达式语言模块组成,具体介绍如下。

  • Beans 模块:提供了 BeanFactory,是工厂模式的经典实现,Spring 将管理对象称为 Bean。
  • Core 核心模块:提供了 Spring 框架的基本组成部分,包括 IoC 和 DI 功能。
  • Context 上下文模块:建立在核心和 Beans 模块的基础之上,它是访问定义和配置任何对象的媒介。ApplicationContext 接口是上下文模块的焦点。
  • Expression Language 模块:是运行时查询和操作对象图的强大的表达式语言。

4. 其他模块

Spring的其他模块还有 AOP、Aspects、Instrumentation 以及 Test 模块,具体介绍如下。

  • AOP 模块:提供了面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分离,以降低耦合性。
  • Aspects 模块:提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。
  • Instrumentation 模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。
  • Test 模块:支持 Spring 组件,使用 JUnit 或 TestNG 框架的测试。

拓展

现代化的java开发!就是基于Spring开发!
在这里插入图片描述

Spring Boot与Spring Cloud

  • Spring Boot 是 Spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务;
  • Spring Cloud是基于Spring Boot实现的;
  • Spring Boot专注于快速、方便集成的单个微服务个体,Spring Cloud关注全局的服务治理框架;
  • Spring Boot使用了约束优于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置 , Spring Cloud很大的一部分是基于Spring Boot来实现,Spring Boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring Boot,属于依赖的关系。
  • SpringBoot在SpringClound中起到了承上启下的作用,如果你要学习SpringCloud必须要学习SpringBoot。

现在大多数公司都在使用SpringBoot进行快速开法,学习SpringBoot的前提,需要完全掌握Spring及SpringMVC!承上启下的作用!

弊端:发展太久了以后,违背了原来的理念!配置十分繁琐,人称“配置地狱!”

IOC理论推导

新建一个Maven项目,导入依赖

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.3</version>
    </dependency>
</dependencies>

导入这个包的好处是,它会附带spring的很多依赖,否则就得一个一个导

在这里插入图片描述

1、UserDao接口

public interface UserDao {
    
    
    void getUser();
}

2、UserDaoImpl实现类

public class UserDaoImpl implements UserDao {
    
    
    @Override
    public void getUser() {
    
    
        System.out.println("默认获取用户的数据");
    }
}

3、UserService业务接口

public interface UserService {
    
    
    void getUser();
}

4、UserServiceImpl业务实现类

public class UserServiceImpl implements UserService {
    
    
    private UserDao userDao = new UserDaoImpl();
    
    @Override
    public void getUser() {
    
    
        userDao.getUser();
    }
}

5、测试

public class MyTest {
    
    
    public static void main(String[] args) {
    
    
        //用户实际调用的是业务层,dao层它们不需要接触!
        UserService userService = new UserServiceImpl();
        userService.getUser();
    }
}

问题来了,现在增加一个Mysql的实现类UserDaoIMysqlImpl

public class UserDaoIMysqlImpl implements UserDao{
    
    
    @Override
    public void getUser() {
    
    
        System.out.println("Mysql获取用户数据");
    }
}

用户想要用Mysql,你就要修改业务层了!

public class UserServiceImpl implements UserService {
    
    
    private UserDao userDao = new UserDaoIMysqlImpl();//改成mysql的实现类
    
    @Override
    public void getUser() {
    
    
        userDao.getUser();
    }
}

那么用户现在又想用oracle了……你还得修改业务层代码


在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!代码量十分大,修改一次的成本代价十分昂贵!

  • 我们使用一个Set方法传入对象,已经发生了革命性的变化!
public class UserSerciceImpl implements UserService {
    
    
    private UserDao userDao;
    //利用set进行动态实现值的注入
    public void setUserDao(UserDao userDao) {
    
    
        this.userDao = userDao;
    }
    @Override
    public void getUser() {
    
    
        userDao.getUser();
    }
}
public static void main(String[] args) {
    
    
    //用户实际调用的是业务层,dao层它们不需要接触!
    UserService userService = new UserSerciceImpl();
    ((UserSerciceImpl)userService).setUserDao(new UserDaoImpl());//用什么传什么对象
    userService.getUser();
}

在这里插入图片描述

  • 之前,程序是主动创建对象!控制权在程序员手上!
  • 使用set注入之后,程序不再具有主动性,而是变成了被动的接受对象!

这种思想,从本质上解决了问题,我们程序猿不用再去管理对象的创建了。系统耦合性大大降低,可以更加专注在业务的实现上!这就是IOC的原型

IOC本质

控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。

  • 耦合的对象
    在这里插入图片描述

  • 解耦的过程
    在这里插入图片描述

  • 理想的系统
    在这里插入图片描述

采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。

控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。

猜你喜欢

转载自blog.csdn.net/weixin_45277249/article/details/112897004