Spring概述和IoC创建对象解析

Spring

文章目录

  • Spring
    • 1 Spring 框架概述
    • 2 Spring 特点
    • 3 入门案例
    • 4 原理探究
    • 5 IoC 接口
      • 5.1 BeanFactory
      • 5.2 ApplicationContext
      • 5.3 关于 ApplicationContext 的实现类

1 Spring 框架概述

  Spring 是分层的 Java SE/EE 应用 full-stack(全栈) 轻量级开源框架,以 IoC(Inverse Of Control,反转控制)和 AOP(Aspect Oriented Programming,面向切面编程)为内核,提供了展现层 SpringMVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的 Java EE 企业应用开源框架。百度百科

总而言之:

  • Spring 是开源的轻量级J2EE框架。

    • 轻量级:Jar数量少,体积比较小。不需要依赖其他组件就可以单独使用。
  • Spring 是解决企业应用开发的复杂性的框架。

  • Spring 的两个核心部分:IoC 和 AOP

  • IoC:控制反转,把创建对象的过程交给 spring 进行,以往是用 new 的方式创建对象。

  • AOP:面向切面,不修改源代码的条件下,进行功能增强。

2 Spring 特点

  • 方便解耦,简化开发:IoC解耦,简化开发
  • 支持 AOP 编程
  • 方便程序测试:支持 JUnit4,方便测试 Spring 程序。
  • 方便和其他框架进行整合。
  • 方便进行事务操作
  • 降低 API 开发难度
  • Java 源码有高深的造诣(设计巧妙)

关于耦合扩展知识:

百度百科

分类 描述
内容耦合 一个模块可以直接修改或操作另一个模块的数据
公共耦合 多个模块引用一个全局数据项
外部耦合 一组模块都访问同一全局简单变量,且不是通过参数列表传递。
控制耦合 一个模块通过接口向另一个模块传递一个控制信号,接受信号的模块根据信号值而进行适当的动作
标记耦合 若一个模块 A 通过接口向两个模块 B 和 C 传递一个公共参数,那么称模块 B 和 C 之间存在一个标记耦合
数据耦合 模块之间通过参数来传递数据
非直接耦合 两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。
  • 程序设计追求 低耦合、高内聚,如果模块间必须存在耦合,就尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,尽量避免使用内容耦合。
  • 内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。

3 入门案例

  • 第一步:下载 spring5 的 Jar 包

    • jar包下载地址:https://repo.spring.io/libs-release-local/org/springframework/spring/
      Spring概述和IoC创建对象解析_第1张图片
    • 下载后解压文件即可。,然后在 libs 文件夹中找到对应 Jar 复制粘贴到 Java 项目中。
  • 第二步:创建一个普通 Java 项目

  • 第三步:导入核心 Jar 包,加载 Jar 包。( IDEA 中直接右键 Jar 包,选择 Add as Library 即可加载)
    Spring概述和IoC创建对象解析_第2张图片

    • 其中 commons-logging 是 Spring 所依赖的日志 Jar 包,不加的话会出现如下错误:
      在这里插入图片描述
    • 可以去阿里云云效 Maven 搜索下载
  • 第四步:创建普通类

public class User {

    public void testUser(){
        System.out.println("对象被创建了。。。");
    }
}

  • 第五步:创建 Spring 配置文件(命名可以自定义,我这里命名为bean.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.xsd">

    
    <bean id="user" class="com.jc.spring5.User">bean>
beans>
  • 第六步:测试代码
public class TestSpring {
	// 在IDEA中,光标移动到 @Test 使用 alt + 回车键可以导入 Junit 测试单元
    @Test
    public void testUser(){
        //1 加载 spring 配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        //2 获取配置创建的对象
        User user = context.getBean("user", User.class);
        System.out.println(user);
        user.testUser();
    }
}

结果:

com.jc.spring5.User@fe18270
对象被创建了。。。

4 原理探究

问题提出:在 A 类中调用 B 类中的属性或方法。

  • 原始方法

    • 直接在 A 类中 new 出 B 类对象,然后通过 B 类对象来调用方法。(耦合度高)
      Spring概述和IoC创建对象解析_第3张图片
  • 普通工厂模式解耦

    • 在工厂 BFactory 类 中创建出 B 类对象,A 类可以通过 BFactory 类来创建 B类,降低了 A 类与 B 类之间的硬耦合。
    • 需要注意的是,这里的解耦体现在:当 B 的路径发生改变时,所有创建 B 类的其他类都需要改变,而通过第三方工厂来创建的对象,只需要改变工厂中的对应部分即可。
    • 如果只是单个对象之间的调用,大可不必使用工厂模式。
      Spring概述和IoC创建对象解析_第4张图片
  • IoC 解耦

1 在 xml 配置文件中,配置要创建的对象。

<bean id="user" class="com.jc.spring5.User">bean>

2 创建工厂类

class BFactory{
    public static User getUser(){
        String classValue = class属性;			// 1 通过 xml 解析得到
        Class cls = Class.forName(classValue);	// 2 通过反射得到字节码文件
        return (B)cls.newInstance();     		// 3 创建对象,强制转换
    }
}

从 Spring 的配置 xml 文件中获取配置类的属性,然后通过反射去创建出对象。

5 IoC 接口

  • IoC 思想基于 IoC 容器完成,IoC 容器底层就是对象工厂。

  • Spring 提供了 IoC 容器实现的两种方式(两种接口):BeanFactoryApplicationContext

5.1 BeanFactory

  • BeanFactory 是 Ioc 容器基本实现方式,是Spring 的原始接口。

  • 特点:加载配置文件的时候,不会创建对象,在调用 getBean() 方法时才会去创建对象,是一种懒加载的方式。无法支持 Spring 的许多插件,如 AOP、Web应用等功能。

5.2 ApplicationContext

  • ApplicationContextBeanFactory 接口的子接口,也是 Spring 应用程序中的中央接口,提供更多更强大的功能。

  • 特点是:加载配置文件的时候,就会创建配置中的对象。(饿汉式单例模式)

需要注意的是:

  • BeanFactory 接口会节约资源,由于懒加载机制,只有需要调用对象的时候才会创建对象。
  • ApplicationContext 接口在服务器启动时就会创建对象,相对浪费存储,但这样可以将耗时耗资源的操作都交给服务器处理,用户访问服务器时可以直接获取对象数据,而不需要等到服务器创建对象,能有更好的体验,所以 ApplicationContext 是更常用的接口。

5.3 关于 ApplicationContext 的实现类

入门案例的测试代码中:

//1 加载 spring 配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
  • 这里用到的是 ClassPathXmlApplicationContext 这个实现类,参数为配置文件的 相对路径 ,相对于 src 文件夹。如果你打开源码看的话,可以发现有很多构造,也就是说可以传多个参数,同时创建多个对象。可以参考下面这篇博客:
    Spring 中 ClassPathXmlApplicationContext 类的简单使用
    Spring概述和IoC创建对象解析_第5张图片

  • FileSystemXmlApplicationContext这个实现类也是加载配置文件,不同的是参数为配置文件的 绝对路径

  • ApplicationContext 的实现类图如下:

Spring概述和IoC创建对象解析_第6张图片
上面这个图是我直接截的IDEA里面的,下面这个链接的图片可能会更清楚一点(看着眼睛疼~):

ApplicationContext 继承关系图

以上就是 Spring 学习的初体验了,后面的路还长。

你可能感兴趣的:(SSM框架)