Spring框架引言、作用以及核心思想之一IOC(以及IOC补充的DI)

 2023-01-23
原文作者:嘿_鱼骨头 原文地址:https://juejin.cn/post/7088436112972054541

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

String-day01

1. Spring框架的引言

spring (春天),生于2002年,由 Rod Johnson 创作。Spring框架是一个集众多设计模式于一身的 开源的轻量级项目管理 框架。致力于JAVAEE轻量级解决方案。相对于原来学过的mybatis 框架有了本质的区别,不是替换原来的某个框架,而是对其进行 整合管理

轻量级解决方案 :提供一个以简单的、统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合糅合在一起建立一个连贯的体系。

2. Spring框架的作用

Spring框架用来 管理 [ 创建 | 使用 | 销毁 ] 项目中的组件,由于spring框架可以帮我们生产 项目中 组件对象,因此也习惯成spring是一个 工厂 | 容器

组件 :项目中的service,dao,action,都是项目中的组件

注意 :spring框架通常 不管理实体类对象创建

202301012026048601.png

3. 环境搭建

202301012026057182.png

202301012026066643.png

202301012026070484.png

202301012026074955.png

202301012026079966.png

202301012026084887.png

下面是一个平常使用时的例子,这里我们先不用考虑包以及类放在哪些包下

202301012026090468.png

202301012026096669.png

2023010120261021710.png

2023010120261077211.png

这是在没有使用spring的时候我们是这么去管理组件对象的,通过new去创建,拿到对象之后去调用方法。

2023010120261143712.png

项目中有一个天生就是用来做项目管理的spring,我们接下来来学习一下如何使用spring来进行上面组件的创建、删除和销毁。

  1. 引入spring框架的依赖

2023010120261214413.png

2023010120261275314.png

2023010120261333215.png

spring的设计和曾经mybatis的设计不一样,spring的设计是基于一个一个的小模块进行管理,所以在用的时候必须把它依赖的这些模块以及核心模块全部给引入进去。

    注意:引入spring核心模块以及依赖模块
    
    spring - core	核心依赖
    
    spring - context 
    
    spring - jdbc
    
    spring - web
    
    spring - expression
    
    spring - aspects
    
    spring - beans
    
    spring - context - supports

引入依赖

    <!--spring核心及相关依赖-->
    <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
          <version>4.3.2.RELEASE</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
          <version>4.3.2.RELEASE</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
          <version>4.3.2.RELEASE</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-expression</artifactId>
          <version>4.3.2.RELEASE</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aop</artifactId>
          <version>4.3.2.RELEASE</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>4.3.2.RELEASE</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context-support</artifactId>
          <version>4.3.2.RELEASE</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aspects</artifactId>
          <version>4.3.2.RELEASE</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>4.3.2.RELEASE</version>
      </dependency>

2023010120261401616.png

  1. 引入spring框架配置文件
    # 配置文件名称: 任意名称 
    # 配置文件位置: 项目中根下任意位置
    # 配置文件的内容:
    	<?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-3.2.xsd ">
        </beans>

2023010120261494617.png

2023010120261596718.png

2023010120261687819.png

  1. 通过spring管理组件
    <!--通过spring管理组件
        bean:   用来管理组件对象的创建
        class:  用来指定管理组件对象的全限定名 包.类
        id:     用来指定spring框架创建的当前组件对象在spring(容器|工厂)中唯一标识 全局唯一
    -->
    <bean class="init.UserDAOImpl" id="aa"></bean>

2023010120261771420.png

  1. 启动工厂,获取对象进行测试
    public class TestSpring {
    
        public static void main(String[] args) {
            // 启动工厂
            // 通过resources目录下xml去构建工厂
            ApplicationContext context = new ClassPathXmlApplicationContext("init/spring.xml");
    
            // 获取工厂中创建好的对象 参数:获取工厂中指定对象的唯一标识
            UserDAO userDAO = (UserDAO) context.getBean("aa");
            System.out.println(userDAO);
            userDAO.save("xiaochen");
        }
    }

2023010120261849121.png

总结:

2023010120261989622.png

另外

标签的id建议写成指定组件对象的名字,其中首字母小写

    <!--通过spring管理组件
        bean:   用来管理组件对象的创建
        class:  用来指定管理组件对象的全限定名 包.类
        id:     用来指定spring框架创建的当前组件对象在spring(容器|工厂)中唯一标识 全局唯一
    			 推荐:id推荐写成接口的名字,首字母小写
    -->
    <bean class="init.UserDAOImpl" id="userDAO"></bean>

4. spring框架中核心思想

    spring框架中核心思想
    	IOC	  AOP	两个思想	IOC思想	AOP
    	IOC:	控制反转| 反转控制
    	AOP:	面向切面的编程
    	
    	
    	IOC:	Inversion(反转)	Of		Controll	控制反转 | 反转控制
    	
    		  定义:所谓控制反转其实指的是控制权力的反转
    		  
    		  通俗定义:就是将原来手动通过new关键字创建对象的权利交给spring,通过在配置文件中配置bean标签形式创建对象,交给
    		  		   spring由spring创建对象的过程
    		  		   
     	DI:  Denpendcy	Injection	依赖注入	(在IOC的基础上又提出的一个补充概念)
        	  定义:为组件中的成员变量完成赋值的过程  这个过程就称之为依赖注入
        	  语法:
        	  		1.组件对象中需要哪个组件|谁	 将谁声明为成员变量并提供公开的SET方法...
        	  		2.在spring的配置文件中对应的组件标签内使用property标签去完成属性的赋值操作
        	  		
        	  		
       	IOC 全部概述:控制反转  就是将原来手动通过new关键字创建对象的权利交给spring,由spring工厂创建对象的过程,
       						 当然spring不仅要创建对象还要在创建对象的同时通过DI的方式维护组件与组件的调用关系
       						
                            
    2.DI基本语法
    
    	DAO组件:
    		public class DeptDAOImpl implements DeptDAO{
                @Override
                public void save(String name) {
                    System.out.println("DAO   name:" + name);
                }
            }
            
       Service组件:
            //service组件
            public class DeptServiceImpl implements DeptService{
    
                // 需要DAO组件对象  依赖DAO组件
                private DeptDAO deptDAO;
    
                // 公开的SET方法
                public void setDeptDAO(DeptDAO deptDAO) {
                    this.deptDAO = deptDAO;
                }
    
                @Override
                public void save(String name) {
                    System.out.println("deptService name:" + name);
                    deptDAO.save(name);
                }
            }
       配置文件赋值:
    
        <!--管理DAO组件-->
        <bean class="di.DeptDAOImpl" id="aa"></bean>
    
        <!--管理Service组件-->
        <bean class="di.DeptServiceImpl" id="deptService">
            <!--依赖的注入
                property:用来给组件中的属性进行赋值操作
                name    :用来指定给组件中哪个属性名进行赋值
                ref     :用来指定赋值对象在工厂中唯一标识 bean的id
            -->
            <property name="deptDAO" ref="aa"/>
        </bean>
        
        启动工厂测试:
            // 启动工厂
            ApplicationContext context = new ClassPathXmlApplicationContext("di/spring.xml");
    
            // 获取deptDAO
            DeptService deptService = (DeptService) context.getBean("deptService");
            deptService.save("百知教育");

DI操作第一步:

组件对象中需要哪个组件|谁 将谁声明为成员变量并提供公开的SET方法...

2023010120262069823.png

DI操作第二步:

在spring的配置文件中对应的组件标签内使用property标签去完成属性的赋值操作

2023010120262180724.png

测试:

    public class TestSpring {
        public static void main(String[] args) {
            // 启动工厂
            ApplicationContext context = new ClassPathXmlApplicationContext("di/spring.xml");
    
            // 获取deptDAO
            DeptService deptService = (DeptService) context.getBean("deptService");
            deptService.save("百知教育");
        }
    }

结果:

2023010120262281925.png

4.1 IOC(控制反转)

  • IOC(inversion of controll)控制反转
        # 1.定义
            将对象的创建由原来(new)的方式转移到配置文件中,交给spring工厂来创建对象
  • DI(Denpendcy)依赖注入
        # 1.定义
            spring不仅要创建对象,还要建立类与类之间的关系,
            因此在控制反转的基础上又提出了依赖注入的概念。