【SSM】初识Spring & 存取Bean对象

简介: 【SSM】初识Spring & 存取Bean对象

🤞目录🤞

💖1. 什么是Spring?

🥼1.1 什么是容器?

🥼1.2 什么是IoC?

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

🥼1.3 理解 Spring IoC

🥼1.4 DI 概念

💖2. 存储 Bean 对象

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

🥼2.2 添加注解存储 Bean 对象

2.2.1 @Controller (控制器存储)

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

2.3.1 类注解之间的关系

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

🥼3.1 属性注入

🥼3.2 构造方法注入

🥼3.3 Setter 注入


【大家好,我是爱干饭的猿,如果喜欢这篇文章,点个赞👍,关注一下吧,后续会持续分享每日一题和SSM其他重要知识点总结

上一篇文章:《【Linux】部署web项目》


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

        image.gif编辑

        规律:

          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>

            image.gif

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

            image.gif编辑

            🃏2.2 添加注解存储 Bean 对象

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

              1. 类注解:@Controller@Service@Repository@Component@Configuration
              2. 方法注解:@Bean

              2.2.1 @Controller (控制器存储)

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

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

              image.gif

              此时我们先使用之前读取对象的方式来读取上面的 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"); 
                  } 
              }

              image.gif

              其他注解方法类似

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

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

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

                比如:

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

                  程序的工程分层,调用流程如下:

                  image.gif编辑

                  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;
                        }
                    }

                    image.gif

                    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); 
                        } 
                    }

                    image.gif

                    获取 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()); 
                        } 
                    }

                    image.gif

                    🃏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); 
                        }
                    }

                    image.gif

                    🃏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);
                        }
                    }

                    image.gif


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

                    🏓🏓🏓

                    相关文章
                    |
                    2月前
                    |
                    存储 Java Spring
                    【Spring】获取Bean对象需要哪些注解
                    @Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
                    |
                    2月前
                    |
                    存储 Java 应用服务中间件
                    【Spring】IoC和DI,控制反转,Bean对象的获取方式
                    IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
                    |
                    2月前
                    |
                    XML Java 数据格式
                    Spring容器Bean之XML配置方式
                    通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
                    70 6
                    |
                    2月前
                    |
                    XML Java 数据格式
                    🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
                    本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
                    125 3
                    |
                    2月前
                    |
                    XML 安全 Java
                    Spring Boot中使用MapStruct进行对象映射
                    本文介绍如何在Spring Boot项目中使用MapStruct进行对象映射,探讨其性能高效、类型安全及易于集成等优势,并详细说明添加MapStruct依赖的步骤。
                    |
                    8月前
                    |
                    Java 开发者 Spring
                    解析Spring中Bean的生命周期
                    解析Spring中Bean的生命周期
                    68 2
                    |
                    8月前
                    |
                    XML druid Java
                    Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
                    Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
                    86 0
                    |
                    4月前
                    |
                    Java 开发者 Spring
                    Spring bean的生命周期详解!
                    本文详细解析Spring Bean的生命周期及其核心概念,并深入源码分析。Spring Bean是Spring框架的核心,由容器管理其生命周期。从实例化到销毁,共经历十个阶段,包括属性赋值、接口回调、初始化及销毁等。通过剖析`BeanFactory`、`ApplicationContext`等关键接口与类,帮助你深入了解Spring Bean的管理机制。希望本文能助你更好地掌握Spring Bean生命周期。
                    195 1
                    |
                    4月前
                    |
                    Java 开发者 Spring
                    Spring bean的生命周期详解!
                    本文详细介绍了Spring框架中的核心概念——Spring Bean的生命周期,包括实例化、属性赋值、接口回调、初始化、使用及销毁等10个阶段,并深入剖析了相关源码,如`BeanFactory`、`DefaultListableBeanFactory`和`BeanPostProcessor`等关键类与接口。通过理解这些核心组件,读者可以更好地掌握Spring Bean的管理和控制机制。
                    149 1
                    |
                    7月前
                    |
                    Java Spring 容器
                    Spring Boot 启动源码解析结合Spring Bean生命周期分析
                    Spring Boot 启动源码解析结合Spring Bean生命周期分析
                    127 11