Spring01——Spring简介、Spring Framework架构、Spring核心概念、IOC入门案例、DI入门案例

为什么要学

  • spring技术是JavaEE开发必备技能,企业开发技术选型命中率>90%
  • 专业角度
    • 简化开发:降低 企业开发的复杂度
    • 框架整合:高效整合 其他技术,提高开发与运行效率

学什么

  • 简化开发
    • IOC
    • AOP
      • 事务处理
  • 框架整合
    • MyBatis

怎么学

  • 学习Spring框架设计思想
  • 学习基础操作,思考:操作与思想之间的联系
  • 学习案例,熟练应用操作的同时体会思想

01-初识spring

  • 官网:https://spring.io/
  • Spring全家桶:Spring发展到今天已经形成了一种开发的生态圈,Spring提供了若干个项目,每个项目用于完成特定的功能
    • Spring Framework:全家桶中其他所有的技术都依赖于Spring Framework执行,底层设计性框架,所有技术都能在上面运行
    • Spring Boot:在Spring简化开发的基础上提高开发速度
    • Spring Cloud:分布式开发
      上述三个框架为主要的学习框架

02-Spring Framework系统架构

Spring Framework是Spring生态圈中最基础 的项目,是其他项目的根基

系统架构讲究上层依赖于下层

  1. Core Container:核心容器
    • 容器中放对象
  2. AOP:面向切面编程,不影响原始程序的基础上做增强功能
    • Aspect:AOP思想实现
  3. Data Access/Integration
    • Data Access:数据访问
    • Data Integration:数据集成
    • Transaction:事务
  4. Web:Web开发
    • springmvc相关
  5. Test:单元测试与集成测试

    学习路线

03-核心概念

代码书写现状:如果想更改数据层的实现,就还得更改业务层new的对象,源代码更改了,就需要重新编译、测试、部署、发布等

上述问题在于:在类中写了其他的实现,就导致了代码的耦合度偏高

解决方案:使用对象时,在程序中不主动使用new产生对象,转换为由外部 提供

上述思想即为:IOC (Inversion of Control) 控制反转

IOC (Inversion of Control) 控制反转

  • 即:使用对象时,由主动new产生对象转换为由外部 提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转

Spring与IOC的关系、Bean的概念

Spring技术对IOC思想进行了实现

  • Spring提供了一个容器,称为IOC容器 (亦称Spring容器),用来充当IOC思想中的"外部"
  • IOC容器负责对象的创建、初始化等过程,被创建或管理的对象 称为Bean

DI (Dependency Injection) 依赖注入

由于service依赖dao运行,所以在IOC容器中,也将service依赖于dao

  • 于是有:在容器中建立bean与bean之间的依赖关系的整个过程(绑定service与dao之间依赖关系的过程),称为依赖注入

如何实现的充分解耦

上述一系列的操作都是为了一个目标:充分解耦

  • 使用IOC容器管理bean (IOC)
  • 在IOC容器内将有依赖关系的bean进行关系绑定 (DI)
    最终效果
  • 使用对象时不仅可以直接从IOC容器中获取,并且获取到的bean已经绑定了所有的依赖关系

核心概念小结

重点要理解什么是IOC/DI思想、什么是IOC容器和什么是Bean:

  1. 什么IOC/DI思想?
    • IOC:控制反转,控制反转的是对象的创建权
    • DI:依赖注入,绑定对象与对象之间的依赖关系
  2. 什么是IOC容器?
    • Spring创建了一个容器用来存放所创建的对象,这个容器就叫IOC容器
  3. 什么是Bean?
    • 容器中所存放的一个个对象就叫Bean或Bean对象

04-IOC入门案例

IOC入门案例主要介绍:Spring到底是如何来实现IOC的

思路分析

  1. Spring是使用容器来管理bean对象的,那么管什么?
    • 主要管理项目中所使用到的类对象,比如(Service和Dao)
  2. 如何将被管理的对象告知IOC容器?
    • 配置文件
  3. 被管理的对象交给IOC容器,要想从容器中获取对象,就先得思考如何获取到IOC容器?
    • Spring框架提供的相应接口,即:ApplicationContext
  4. IOC容器得到后,如何从容器中获取bean?
    • 调用Spring框架提供对应接口中的方法
  5. 使用Spring导入哪些坐标?
    • 用什么,就在pom.xml中导入相应依赖

代码实现

需求分析:将BookServiceImpl和BookDaoImpl交给Spring管理,并从容器中获取对应的bean对象进行方法调用。

  1. 创建maven项目
  2. pom.xml添加Spring的依赖jar包(和junit测试)
xml 复制代码
<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
  1. 创建BookDao,BookDaoImpl,BookService和BookServiceImpl四个类
java 复制代码
@Override
    public void save() {
        System.out.println("book dao save");
    }
java 复制代码
public class BookServiceImpl implements BookService {
    private BookDao bookDao = new BookDaoImpl();

    @Override
    public void save() {
        System.out.println("book service save");
        bookDao.save();
    }
}
  1. 在配置文件中完成bean的配置
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<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-->
    <!--
      bean标签表示配置bean
      id属性表示给bean起名字
      class属性表示给bean定义类型
      得是具体的实现类而不是接口,要靠这个造对象的
      -->
    <bean id="bookDao" class="com.yolo.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="com.yolo.service.impl.BookServiceImpl"/>

</beans>
  1. 获取IOC容器并从容器中获取对象进行方法调用
    使用getBean(String name)方法,其name参数就是我们在bean配置的id,通过这个id来造对象
java 复制代码
public class APP {
    public static void main(String[] args) {
        // 获取IOC容器
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 获取bean对象
//        BookDao bookDao = (BookDao) ac.getBean("bookDao");
        // 获取到对象后就调用对象方法
//        bookDao.save();
        BookService bookService = (BookService) ac.getBean("bookService");
        bookService.save();
    }
}

运行结果

05-DI入门案例

DI入门案例主要介绍:Spring到底是如何来实现DI的

思路分析

  1. 要想实现依赖注入,必须要基于IOC管理Bean
    • DI的入门案例要依赖于前面的IOC入门案例
  2. Service中使用new形式创建的Dao对象是否保留?
    • 不保留,这样才能解耦合,最终要使用IOC容器中的bean对象(因为只要有new的实现类,耦合度必然高)
  3. Service中需要的Dao对象如何进入到Service中?
    • 在Service中提供一个方法(例如提供一个set方法),让Spring的IOC容器可以通过该方法传入bean对象,也就达到了不是自己new,而是外部提供
  4. Service与Dao之间的关系如何描述?
    • 使用配置文件

代码实现

需求:基于IOC入门案例,在BookServiceImpl类中删除new对象的方式,使用Spring的DI完成Dao层的注入

  1. 删除业务层中使用new的方式创建的dao对象
java 复制代码
// 删除业务层中使用new的方式创建的dao对象
        // private BookDao bookDao = new BookDaoImpl();
    private BookDao bookDao;
  1. 在业务层提供BookDao的setter方法
    我们在set方法中加一条输出语句,看看是否被调用了
java 复制代码
public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
        System.out.println("set方法被容器调用啦");
    }
  1. 在配置文件中添加依赖注入的配置
xml 复制代码
	<bean id="bookDao" class="com.yolo.dao.impl.BookDaoImpl"/>
    <!--主要变化在这里-->
    <bean id="bookService" class="com.yolo.service.impl.BookServiceImpl">
        <!--配置server与dao的关系-->
        <!--
            property标签表示配置当前bean的属性
            name属性表示配置哪一个具体的属性(这里是配置bookService的bookDao属性)
            ref属性表示参照哪一个bean(参照当前配置文件中的bookDao)
        -->
        <property name="bookDao" ref="bookDao"/>
    </bean>

注意:配置中的两个bookDao的含义是不一样的

name="bookDao"中bookDao的作用是让Spring的IOC容器在获取到名称后,将首字母大写,前面加set找对应的setBookDao()方法进行对象注入

ref="bookDao"中bookDao的作用是让Spring能在IOC容器中找到id为bookDao的Bean对象给bookService进行注入

  1. 运行程序调用方法
    运行结果
相关推荐
一只叫煤球的猫7 小时前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9658 小时前
tcp/ip 中的多路复用
后端
bobz9658 小时前
tls ingress 简单记录
后端
皮皮林5519 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
你的人类朋友9 小时前
什么是OpenSSL
后端·安全·程序员
bobz9659 小时前
mcp 直接操作浏览器
后端
前端小张同学12 小时前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook12 小时前
Manim实现闪光轨迹特效
后端·python·动效
武子康13 小时前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
该用户已不存在13 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net