栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Spring】(2)IoC控制反转:IoC是啥?容器又是啥?写一个简单的Spring程序瞧瞧!

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Spring】(2)IoC控制反转:IoC是啥?容器又是啥?写一个简单的Spring程序瞧瞧!

两个月前跟着b站动力节点王鹤老师的Spring框架教程视频学习完了Spring框架,在学习过程中我将视频中涉及的代码都一行一行手敲了一遍,并且把Spring入门相关的资料整理了一下,在这里记录一下我在Spring框架学习过程中的笔记和一些心得,希望能帮助到想要通过文字教程入门Spring这一框架的小伙伴哦!

视频地址:2020最新Spring框架教程【IDEA版】-Spring框架从入门到精通

文章目录
    • 1. IoC 简介
    • 2. Spring 程序初步
      • 1)创建 Maven 项目
      • 2)引入相关 Maven 依赖
      • 3)定义接口与其实现类
      • 4)创建 Spring 配置文件
      • 5)测试
    • 3. 容器接口和实现类
      • ApplicationContext 接口(容器)
        • 1)配置文件在类路径下
        • 2) ApplicationContext 容器中对象的装配时机
        • 3)使用 spring 容器创建的 java 对象

1. IoC 简介

控制反转(IoC,Inversion of Control),是一种设计思想,而不是一个具体的技术实现。指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对 对象控制权 的转移,从程序代码本身反转到了外部容器。通过容器实现对象的创建、属性赋值、依赖的管理。

不过, IoC 并非 Spirng 特有,在其他语言中也有应用。

控制:指的是对象创建(实例化、管理)的权力

反转:把原来的开发人员管理、创建对象的权限转移给代码之外的容器实现。由容器代替开发人员管理对象、创建对象、给属性赋值。

正转:由开发人员在代码中使用 new 构造方法创建对象,开发人员主动管理对象。
        public static void main(String args[]){
            Student student = new Student(); // 在代码中, 创建对象。--正转。
		}

容器:是一个服务器软件,一个框架(Spring)

为什么要使用 ioc : 目的就是减少对代码的改动,也能实现不同的功能,实现解耦合。

将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。 IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件 / 注解即可,完全不用考虑对象是如何被创建出来的。

在实际项目中一个 Service 类可能依赖了很多其他的类,假如我们需要实例化这个 Service,你可能要每次都要搞清这个 Service 所有底层类的构造函数,这可能会把人逼疯。如果利用 IoC 的话,你只需要配置好,然后在需要的地方引用就行了,这大大增加了项目的可维护性且降低了开发难度。

在 Spring 中, IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。

Spring 时代我们一般通过 XML 文件来配置 Bean,后来开发人员觉得 XML 文件来配置不太好,于是 SpringBoot 注解配置就慢慢开始流行起来。

java中创建对象有哪些方式:

  • 使用构造方法 , new Student()
  • 反射
  • 序列化
  • 克隆
  • IoC :容器创建对象
  • 动态代理

IoC 的体现:

servlet 中 1:创建类继承 HttpServlet
2:在 web.xml 注册 servlet ,使用

  myservlet 	                               
 com.kaho.controller.MyServlet

​ 3:使用 Servlet 的过程中没有创建 Servlet 对象, 即没有 MyServlet myservlet = new MyServlet();

​ 4:Servlet 是 Tomcat 服务器创建的。 Tomcat 也称为容器
​ Tomcat 作为容器:里面存放有 Servlet 对象、Listener、Filter 等对象

IoC 的技术实现:

IoC 技术的实现方式是 依赖注入(DI)

DI(Dependency Injection):依赖注入, 只需要在程序中提供要使用的对象名称就可以, 至于对象如何在容器中创建、赋值、查找都由容器内部实现。程序代码不做定位查询,这些工作由容器自行完成。程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。

Spring 是使用依赖注入(DI)实现了 IoC 的功能,Spring 底层创建对象,使用的是反射机制。

Spring 容器是一个超级大工厂,负责创建、管理所有的 Java 对象,这些 Java 对象被称为 Bean。Spring 容器管理着容器中 Bean 之间的依赖关系,Spring 使用**“依赖注入”**的方式来管理 Bean 之间的依赖关系。使用 IoC 实现对象之间的解耦合。

2. Spring 程序初步 1)创建 Maven 项目 2)引入相关 Maven 依赖

pom.xml:




  4.0.0

  com.kaho
  ch01-hello-spring
  1.0-SNAPSHOT

  
    UTF-8
    1.8
    1.8
  

  
    
      
      junit
      junit
      4.11
      test
    

    
    
      org.springframework
      spring-context
      5.2.5.RELEASE
    
  

  
    
      
      
        maven-compiler-plugin
        3.1
        
          1.8
          1.8
        
      
    
  

3)定义接口与其实现类

接口:

package com.kaho.service;

public interface SomeService {
    void doSome();
}

实现类:

package com.kaho.service.impl;

import com.kaho.service.SomeService;

public class SomeServiceImpl implements SomeService {
    public SomeServiceImpl(){
        super();
        System.out.println("SomeServiceImpl的无参数构造方法");
    }

    @Override
    public void doSome() {
        System.out.println("====业务方法doSome()====");
    }
}
4)创建 Spring 配置文件

在 src/main/resources/ 目录 创建一个 Spring 配置文件,具体步骤如下:

文件名可以随意,但 Spring 建议的名称为 applicationContext.xml。这里暂且先将其命名为 beans.xml

配置该文件的相关信息:




    
    
    
    
    

    
    
    

5)测试
package com.kaho;

import com.kaho.service.SomeService;
import com.kaho.service.impl.SomeServiceImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    @Test
    public void test01(){
        //传统构造对象方式
        SomeService service = new SomeServiceImpl();
        service.doSome();
    }

    
    @Test
    public void test02(){
        //使用spring容器创建的对象
        //1.指定spring配置文件的名称
        String config = "beans.xml";
        //2.创建表示spring容器的对象,ApplicationContext
        // ApplicationContext就是表示Spring容器,通过该容器获取对象
        // ClassPathXmlApplicationContext:表示从类路径中加载spring的配置文件
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);

        //从容器中获取某个对象,通过调用ApplicationContext对象的方法
        //getBean("配置文件中的bean的id值") 默认返回的是Object类型对象,所以要强转
        SomeService service = (SomeService) ac.getBean("someService");

        //使用spring创建好的对象
        service.doSome();
    }

    
    @Test
    public void test03(){
        String config = "beans.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);
        //使用spring提供的方法,获取容器中定义的对象的数量——getBeanDefinitionCount()
        int nums = ac.getBeanDefinitionCount();
        System.out.println("容器中定义的对象数量:" + nums);
        //容器中每个定义的对象的名称——getBeanDefinitionNames(),返回String型数组
        String[] names = ac.getBeanDefinitionNames();
        for (String name : names){
            System.out.println(name);
        }
    }
    
    //获取一个非自定义的类对象
    @Test
    public void test04(){
        String config = "beans.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);
        //使用getBean()
        Date date = (Date) ac.getBean("mydate");
        System.out.println("Date:" + date);
    }
}
3. 容器接口和实现类 ApplicationContext 接口(容器)

ApplicationContext 用于加载 Spring 的配置文件,在程序中充当“容器”的角色。其实现类有两个。

1)配置文件在类路径下

若 Spring 配置文件存放在项目的类路径下,则使用 ClassPathXmlApplicationContext 实现类进行加载。

@Test
    public void test02(){
        //spring配置文件在类路径下(classpath)
        //1.指定spring配置文件的名称
        String config = "beans.xml";
        //2.创建表示spring容器的对象
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);
        //从容器中获取某个对象,通过调用ApplicationContext对象的方法
        //getBean("配置文件中的bean的id值")
        SomeService service = (SomeService) ac.getBean("someService");
        service.doSome();
    }
2) ApplicationContext 容器中对象的装配时机

ApplicationContext 容器,会在容器对象初始化时,将其中的所有对象一次性全部装配好(spring创建对象:默认调用的是无参构造方法)。以后代码中若要使用到这些对象,只需从内存中直接获取即可。执行效率较高,但占用内存。

3)使用 spring 容器创建的 java 对象

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/298219.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号