Spring学习笔记-第一章-Spring之旅

第一部分:Spring的核心

  • 第一章:Spring之旅

    介绍Spring框架,包括Spring DI和AOP。

  • 第二章:装配Bean

    Spring的自动配置、基于Java的配置和XML配置。

  • 第三章:高级装配

    Spring的条件化配置,处理自动装配时的歧义性,作用域以及Spring表达式语言。

  • 第四章:面向切面的Spring

    展示如何使用Spring的AOP特性把系统级服务从它们所服务的对象中解耦出来。


第一章 Spring之旅

本章内容:

  • Spring的Bean容器
  • 介绍Spring的核心模块
  • 更为强大的Spring生态系统
  • Spring的新功能

创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB。相当于EJB来说,Spring提供了更加轻量级和更加简单的编程模型。


1.1 简化Java开发

1.1.1 Spring的非侵入式编程

在基于Spring构建的应用中,一般不会有任何痕迹表明你使用了Spring,最坏的场景是在一个类上使用了Spring注解,但是这个类依旧是一个Pojo类。

Spring的非侵入式编程模型意味着这个类在Spring应用还是在非Spring应用中都能发挥同样的作用。

package com.kotobuki;

/**
 * @author [email protected]
 * @since 2018/11/14 下午9:18
 */
public class HelloWorld {
    public String sayHello() {
        return "Hello world";
    }
}

1.1.2 依赖注入

在一个应用中通常会涉及到很多类,这些类需要相互协作来完成特定的功能,如果让每个类管理与自己协作的类,则会导致应用高度耦合。

依赖注入带来的最大好处就是松耦合。如果一个对象只通过借口来表明依赖关系,那么这种依赖就能够在对象毫不知情的情况下用不同的实现替换。

可以让对其他的类有依赖的类自动获得已经准备好的依赖。

一个送外卖的过程:当不是用DI的时候送餐员需要自己准备外卖,然后再配送。

package com.clerk;

import com.com.food.Dinner;

/**
 * @author [email protected]
 * @since 2018/11/15 下午8:31
 */
public class DeliveryWithoutDI implements Delivery {
    private Dinner dinner;

    public DeliveryWithoutDI() {
        this.dinner = new Dinner("rice");
    }

    @Override
    public void delivery() {
        System.out.println("delivery it on time.");
    }
}

当使用DI之后,当有外卖需要配送的时候,分配送餐员,送餐员会自动获得需要配送的外卖,需要做的只是负责配送,而不用关心其他事情。

package com.clerk;

import com.com.food.Dinner;

/**
 * @author [email protected]
 * @since 2018/11/15 下午8:24
 */
public class DeliveryClerk implements Delivery {
    private Dinner dinner;

    public DeliveryClerk(Dinner dinner) {
        this.dinner = dinner;
    }

    @Override
    public void delivery() {
        System.out.println("delivery on time.");
    }
}

1.1.3 应用切面

面向切面编程允许你把遍布应用各处的功能分离出来形成可重用的组件。

一个系统或应用由许多不同的组件构成,但是每一个组件在负责自己的功能之外,通常还要承担额外的责任。一些与核心业务无关的代码会融入到核心业务逻辑中。比如转账,除了发生金钱的转移之外,还要验证身份、记录账单以及给用户发送通知。这些会跨越系统的组件成为横切关注点。它们会使核心业务代码变得复杂。

Spring AOP

通过AOP,可以将与核心业务无关的代码分离出来。

1.1.4 使用模板消除样板式代码

使用JDBC访问数据库,会产生大量与查询语句无关的代码,还必须要捕捉异常,虽然无济于事。

Spring旨在通过模板封装来消除样板式代码。

Data Access with JDBC

1.2 容纳你的bean

在Spring应用中,你的应用对象生存于Spring容器中,Spring容器负责创建对象,装配并管理它们的整个生命周期。

使用应用上下文:

  • AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文。
  • AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载Spring Web应用上下文。
  • ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置文件中加载上下文定义。
  • FileSystemXmlApplicationContext:从文件系统下的一个或多个XML配置文件中加载上下文定义。
  • XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中还在上下文定义。

bean的生命周期:

bean的生命周期

Bean的生命周期

1.3 俯瞰Spring风景线

Spring的模块:

Spring模块

Core IoC container, Events, Resources, i18n, Validation, Data Binding, Type Conversion, SpEL, AOP.
Testing Mock objects, TestContext framework, Spring MVC Test, WebTestClient.
Data Access Transactions, DAO support, JDBC, ORM, Marshalling XML.
Web Servlet Spring MVC, WebSocket, SockJS, STOMP messaging.
Web Reactive Spring WebFlux, WebClient, WebSocket.
Integration Remoting, JMS, JCA, JMX, Email, Tasks, Scheduling, Cache.
Languages Kotlin, Groovy, Dynamic languages.