【SSM】Spring 核心与设计思想 & 存取Bean对象

【大家好,我是爱干饭的猿,本文介绍Spring的核心与思想设计、IoC、DI、类注解、存取 Bean 对象的方法。

后续会继续分享Spring、SpringMVC、MyBatis及其他重要知识点总结,如果喜欢这篇文章,点个赞👍,关注一下吧】

上一篇文章:《【web】HTTP(s)协议详解(重点:HTTPS 的加密过程&浏览器中输入网址后,发生了什么?)》


SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容),常作为数据源较简单的web项目的框架。


🀄1. 什么是Spring?

我们通常说的 Spring 指的是 Spring Framework (Spring 框架)。

一句话概括Spring:Spring 是包含了众多工具方法的loC容器。

🃏1.1 什么是容器?

容器是用来容纳某种物品的(基本)装置。

例如:

  • List/Map -> 数据存储容器
  • Tomcat   -> Web 容器

🃏1.2 什么是IoC?

  • Spring -> IoC 容器

IoC (Inversion of Control) 指 “控制反转”,也就是说 Spring 是一个“控制反转”容器。

1.2.1 传统程序开发 & 控制反转式程序开发

假如,我们现在构建一辆“车”的程序,我们的实现思路是这样的:

  • 在传统的代码中对象创建顺序是:Car -> Framework -> Bottom -> Tire
  • 改进之后解耦的代码的对象创建顺序是:Tire -> Bottom -> Framework -> Car

【SSM】Spring 核心与设计思想 & 存取Bean对象编辑

规律:

  1. 传统代码是Car 控制并创建了 Framework,Framework 创建并创建了 Bottom,依次往下;
  2. 而改进之后的控制权发生的反转,不再是上级对象创建并控制下级对象了,而是下级对象把注入将当前对象中,下级的控制权不再由上级类控制 了,这样即使下级类发生任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想。

🃏1.3 理解 Spring IoC

既然 Spring 是一个 IoC(控制反转)容器,重点还在“容器”二字上,那么它就具备两个最基础的功能:

  • 将对象存入到容器
  • 从容器中取出对象

也就是说学 Spring 最核心的功能,就是学如何将对象存入到 Spring 中,再从 Spring 中获取对象的过程。

IoC 容器 和普通程序开发的区别:

将对象存储在 IoC 容器相当于将以后可能用的所有工具制作好都放 到仓库中,需要的时候直接取就行了,用完再把它放回到仓库。而 new 对象的方式相当于,每次 需要工具了,才现做,用完就扔掉了也不会保存,下次再用的时候还得重新做。

Spring 是一个 IoC 容器,说的是对象的创建和销毁的权利都交给 Spring 来管理了,它本身又具备了存 储对象和获取对象的能力。

🃏1.4 DI 概念

DI (Dependency Injection) 指的是“依赖注入”。

所谓依赖注入,就是 loC 容器在运行期间,动态地将某种依赖关系注入到对象之中。所以,依赖注入(DI)和控制反转(IoC)是从不同的角度的描述的同一件事情,就是指通过引入 IoC 容器,利用依赖关系注入的方式,实现对象之间的解耦。

IoC 是方法思想,DI 是具体实现。


🀄2. 存储 Bean 对象

🃏2.1 前置工作:配置扫描路径(重要)

注意:想要将对象成功的存储到 Spring 中,我们需要配置一下存储对象的扫描包路径,只有被配置的包下的所有类,添加了注解才能被正确的识别并保存到 Spring 中。

在 spring-config.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" 
xmlns:content="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context 
    https://www.springframework.org/schema/context/spring-context.xsd"

<content:component-scan base-package="com.bit.service"></content:component- scan> 
</beans>

其中标红的一行为注册扫描的包,如下图所示:

【SSM】Spring 核心与设计思想 & 存取Bean对象编辑

🃏2.2 添加注解存储 Bean 对象

想要将对象存储在 Spring 中,有两种注解类型可以实现:

  • 类注解:@Controller、@Service、@Repository、@Component、@Configuration。
  • 方法注解:@Bean。

2.2.1 @Controller (控制器存储)

使用 @Controller 存储 bean 的代码如下所示:

@Controller // 将对象存储到 Spring 中 
public class UserController {
    public void sayHi(String name) {
        System.out.println("Hi," + name);
    }
}

此时我们先使用之前读取对象的方式来读取上面的 UserController 对象,如下代码所示:

public class Application 
    public static void main(String[] args) {
        // 1.得到 spring 上下文 
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2.得到 bean 
        UserController userController = (UserController) context.getBean("userController");
        // 3.调用 bean 方法 
        userController.sayHi("Bit"); 
    } 
}

其他注解方法类似:

  • @Service(服务存储)
  • @Repository(仓库存储)
  • @Component(组件存储)
  • @Configuration(配置存储)

🃏2.3 为什么要这么多类注解?

就是让程序员看到类注解之后,就能直接了解当前类的用途

  • @Controller:表示的是业务逻辑层;
  • @Servie:服务层;
  • @Repository:持久层;
  • @Configuration:配置层。

    程序的工程分层,调用流程如下:
    【SSM】Spring 核心与设计思想 & 存取Bean对象编辑

2.3.1 类注解之间的关系

其实@Controller / @Service / @Repository / @Configuration 注解里面都有一个注解 @Component,说明它们本身就是属于 @Component 的“子类”。


🀄3. 获取 Bean 对象(对象装配)

获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注入。对象装配(对象注入)的实现方法以下 3 种:

  1. 属性注入
  2. 构造方法注入
  3. Setter 注入

🃏3.1 属性注入

属性注入是使用 @Autowired 实现的,将 Service 类注入到 Controller 类中。

Service 类的实现代码如下:

import org.springframework.stereotype.Service;
@Service 
public class UserService {
    public User getUser(Integer id) {
        // 伪代码,不连接数据库 User user = new User(); 
        user.setId(id);
        user.setName("Java-" + id); 
        return user;
    }
}

Controller 类的实现代码如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
    // 注入方法1:属性注入 
    @Autowired private UserService userService;
    public User getUser(Integer id) {
        return userService.getUser(id); 
    } 
}

获取 Controller 中的 getUser 方法:

public class UserControllerTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); 
        UserController userController = context.getBean(UserController.class)
        System.out.println(userController.getUser(1).toString()); 
    } 
}

🃏3.2 构造方法注入

构造方法注入是在类的构造方法中实现注入,如下代码所示:

@Controller public class UserController2 {
    // 注入方法2:构造方法注入 
    private UserService userService;
    @Autowired
    public UserController2(UserService userService) {
        this.userService = userService;
    }

    public User getUser(Integer id) 
        return userService.getUser(id); 
    }
}

🃏3.3 Setter 注入

Setter 注入和属性的 Setter 方法实现类似,只不过在设置 set 方法的时候需要加上 @Autowired 注解,如下代码所示:

@Controller
public class UserController3 {
    // 注入方法3:Setter注入 
    private UserService userService;

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public User getUser(Integer id) {
        return userService.getUser(id);
    }
}

本次分享就到这里,如果你喜欢这篇文章,请点赞加关注吧,或者如果你对文章有什么困惑,可以私信我。

🏓🏓🏓

原文始发于微信公众号(爱干饭的猿):【SSM】Spring 核心与设计思想 & 存取Bean对象

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/45819.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!