【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


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

                    🏓🏓🏓

                    相关文章
                    |
                    23天前
                    |
                    XML 安全 Java
                    |
                    6天前
                    |
                    XML Java 数据格式
                    Spring容器Bean之XML配置方式
                    通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
                    29 6
                    |
                    7天前
                    |
                    XML Java 数据格式
                    🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
                    本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
                    50 3
                    |
                    1月前
                    |
                    缓存 Java Spring
                    实战指南:四种调整 Spring Bean 初始化顺序的方案
                    本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
                    实战指南:四种调整 Spring Bean 初始化顺序的方案
                    |
                    21天前
                    |
                    安全 Java 开发者
                    Spring容器中的bean是线程安全的吗?
                    Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
                    30 1
                    |
                    13天前
                    |
                    XML 安全 Java
                    Spring Boot中使用MapStruct进行对象映射
                    本文介绍如何在Spring Boot项目中使用MapStruct进行对象映射,探讨其性能高效、类型安全及易于集成等优势,并详细说明添加MapStruct依赖的步骤。
                    |
                    2月前
                    |
                    XML Java 数据格式
                    Spring从入门到入土(bean的一些子标签及注解的使用)
                    本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
                    82 9
                    Spring从入门到入土(bean的一些子标签及注解的使用)
                    |
                    2月前
                    |
                    Java 测试技术 Windows
                    咦!Spring容器里为什么没有我需要的Bean?
                    【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
                    |
                    2月前
                    |
                    Java 开发者 Spring
                    Spring bean的生命周期详解!
                    本文详细解析Spring Bean的生命周期及其核心概念,并深入源码分析。Spring Bean是Spring框架的核心,由容器管理其生命周期。从实例化到销毁,共经历十个阶段,包括属性赋值、接口回调、初始化及销毁等。通过剖析`BeanFactory`、`ApplicationContext`等关键接口与类,帮助你深入了解Spring Bean的管理机制。希望本文能助你更好地掌握Spring Bean生命周期。
                    137 1
                    |
                    6月前
                    |
                    Java 开发者 Spring
                    解析Spring中Bean的生命周期
                    解析Spring中Bean的生命周期
                    60 2