Spring IOC 入门简介【自定义容器实例】

这篇具有很好参考价值的文章主要介绍了Spring IOC 入门简介【自定义容器实例】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

相关导读

1. Maven专栏系列文章

2. Mybatis专栏系列文章

3. Spring系列专栏文章

前言

Spring简介

Spring体系结构

一、IOC控制反转思想

二、IOC自定义对象容器

1. 创建实体类,Dao接口,实现类

2. 创建配置文件bean.properties

3. 创建容器管理类

4. 创建StudentService类

5. 测试方法

6. 测试结果


相关导读

        大家如果对于本期内容有什么不了解的话也可以去看看往期的内容,下面列出了博主往期精心制作的Maven,Mybatis等专栏系列文章,走过路过不要错过哎!如果对您有所帮助的话就点点赞,收藏一下啪。其中Spring专栏有些正在更,所以无法查看,但是当博主全部更完之后就可以看啦。

1. Maven专栏系列文章

Maven系列专栏 Maven工程开发
Maven聚合开发【实例详解---5555字】

2. Mybatis专栏系列文章

Mybatis系列专栏 MyBatis入门配置
Mybatis入门案例【超详细】
MyBatis配置文件 —— 相关标签详解
Mybatis模糊查询——三种定义参数方法和聚合查询、主键回填
Mybatis动态SQL查询 --(附实战案例--8888个字--88质量分)
Mybatis分页查询——四种传参方式
Mybatis一级缓存和二级缓存(带测试方法)
Mybatis分解式查询
Mybatis关联查询【附实战案例】
MyBatis注解开发---实现增删查改和动态SQL
MyBatis注解开发---实现自定义映射关系和关联查询

3. Spring系列专栏文章

Spring系列专栏 Spring IOC 入门简介【自定义容器实例】
IOC使用Spring实现附实例详解
Spring IOC之对象的创建方式、策略及销毁时机和生命周期且获取方式
Spring DI简介及依赖注入方式和依赖注入类型
Spring IOC相关注解运用——上篇
Spring IOC相关注解运用——下篇
Spring AOP简介及相关案例
注解、原生Spring、SchemaBased三种方式实现AOP【附详细案例】
Spring事务简介及相关案例
Spring 事务管理方案和事务管理器及事务控制的API
Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

前言

Spring简介

        Spring是一个开源框架,为简化企业级开发而生。它以IOC(控制反转)和AOP(面向切面)为思想内核,提供了控制层SpringMVC、数据层SpringData、服务层事务管理等众多技术,并可以整合众多第三方框架。Spring将很多复杂的代码变得优雅简洁,有效的降低代码的耦合度,极大的方便项目的后期维护、升级和扩展。
Spring官网地址:https://spring.io/

Spring官方网站:

Spring IOC 入门简介【自定义容器实例】

Spring体系结构

        Spring框架根据不同的功能被划分成了多个模块,这些模块可以满足一切企业级应用开发的需求,在开发过程中可以根据需求有选择性地使用所需要的模块。

  1. Core Container:Spring核心模块,任何功能的使用都离不开该模块,是其他模块建立的基础。
  2. Data Access/Integration:该模块提供了数据持久化的相应功能。
  3. Web:该模块提供了web开发的相应功能。
  4. AOP:提供了面向切面编程实现
  5. Aspects:提供与AspectJ框架的集成,该框架是一个面向切面编程框架。
  6. Instrumentation:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。
  7. Messaging:为Spring框架集成一些基础的报文传送应用
  8. Test:提供与测试框架的集成

一、IOC控制反转思想

        控制反转就是让框架创建对象

        IOC(Inversion of Control) :程序将创建对象的权利交给框架。之前在开发过程中,对象实例的创建是由调用者管理的,代码如下:

public interface StudentDao {
  // 根据id查询学生
  Student findById(int id);
}

public class StudentDaoImpl implements StudentDao{
  @Override
  public Student findById(int id) {
    // 模拟从数据库查找出学生
    return new Student(1,"程序员","北京");
 }
}

public class StudentService {
  public Student findStudentById(int id){
    // 此处就是调用者在创建对象
    StudentDao studentDao = newStudentDaoImpl();
    return studentDao.findById(1);
 }
}

这种写法有两个缺点:

  • 浪费资源:StudentService调用方法时即会创建一个对象,如果不断调用方法则会创建大量StudentDao对象。
  • 代码耦合度高:假设随着开发,我们创建了StudentDao另一个更加完善的实现类StudentDaoImpl2,如果在StudentService中想使用StudentDaoImpl2,则必须修改源码。

        而IOC思想是将创建对象的权利交给框架,框架会帮助我们创建对象,分配对象的使用,控制权由程序代码转移到了框架中,控制权发生了反转,这就是Spring的IOC思想。而IOC思想可以完美的解决以上两个问题。

二、IOC自定义对象容器

Spring IOC 入门简介【自定义容器实例】

        接下来我们通过一段代码模拟IOC思想。创建一个集合容器,先将对象创建出来放到容器中,需要使用对象时,只需要从容器中获取对象即可,而不需要重新创建,此时容器就是对象的管理者。

1. 创建实体类,Dao接口,实现类

Student实体类

package com.example.pojo;

public class Student {
    private int id;
    private String name;
    private String address;

    public Student(int id, String name, String address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

    public Student(){}

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Student[ " +
                "id=" + id +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                " ]";
    }
}

StudentDao接口

package com.example.dao;

import com.example.pojo.Student;

public interface StudentDao {
    // 根据id查询学生
    Student findById(int id);
}

StudentDao接口实现类1:StudentDaoImpl1

package com.example.dao;

import com.example.pojo.Student;

public class StudentDaoImpl1 implements StudentDao{

    public StudentDaoImpl1() {
    }

    public StudentDaoImpl1(int a){};
    @Override
    public Student findById(int id){
        return new Student(id,"程序员","北京");
    }
}

 StudentDao接口实现类1:StudentDaoImpl2

package com.example.dao;

import com.example.pojo.Student;

public class StudentDaoImpl2 implements StudentDao{

    @Override
    public Student findById(int id) {
        // 模拟根据ID查询学生
        System.out.println("新方法!!!");
        return new Student(id,"程序员","上海");
    }
}

2. 创建配置文件bean.properties

        该文件中定义管理的对象

studentDao=com.example.dao.StudentDaoImpl2

3. 创建容器管理类

package com.example;

import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class Container {
    static Map<String,Object> map = new HashMap<>();

    static {
        // 读取配置文件
        InputStream is = Container.class.getClassLoader().getResourceAsStream("bean.properties");
        Properties properties = new Properties();
        try{
            properties.load(is);
        }catch (Exception e){
            e.printStackTrace();
        }

        // 遍历配置文件的所有配置
        Enumeration<Object> keys = properties.keys();
        while(keys.hasMoreElements()){
            String key = keys.nextElement().toString();
            String value = properties.getProperty(key);
            try{
                Object o = Class.forName(value).newInstance();
                map.put(key,o);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    // 从容器中获取对象
    public static Object getBean(String key){
        return map.get(key);
    }
}

4. 创建StudentService类

package com.example.service;

import com.example.Container;
import com.example.dao.StudentDao;
import com.example.domain.Student;

public class StudentService {
    public Student findStudentById(int id){
        // 从容器中获取对象
        StudentDao studentDao = (StudentDao) Container.getBean("studentDao");
        System.out.println(studentDao.hashCode());
        return studentDao.findById(id);
    }
}

5. 测试方法

package com.example.test;

import com.example.Container;
import com.example.service.StudentService;

public class Test {
    public static void main(String[] args) {
        StudentService studentService = new StudentService();

        System.out.println(studentService.findStudentById(1));
        System.out.println(studentService.findStudentById(1));
    }
}

6. 测试结果

Spring IOC 入门简介【自定义容器实例】

         StudentService从容器中每次拿到的都是同一个StudentDao对象,节约了资源。
如果想使用StudentDaoImpl2对象,只需要修改bean.properties的内容为:

studentDao=com.itbaizhan.dao.StudentDaoImpl2

即可,无需修改Java源码。

        或者如果不想new StudentService,也可以在bean.properties加上一行:文章来源地址https://www.toymoban.com/news/detail-420511.html

studentService = com.example.service.StudentService

到了这里,关于Spring IOC 入门简介【自定义容器实例】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spring ioc容器

    ioc是 inversion of Control的简写,意为控制反转。通过其对所有的Java对象的实例化和初始化,控制对象与对象之间的依赖关系。 (1)控制反转是一种思想。 (2)控制反转是为了 降低程序耦合度,提高程序扩展力。 (3)控制反转,反转的是什么? 答:将对象的创建权利交出去

    2024年01月17日
    浏览(38)
  • Spring核心容器IOC案例讲解,带你理解IOC

    Universe Infinity inc. 什么是IOC容器,先把IOC给忽略到,其实就是个容器。 什么?容器又是个啥玩意?容器是用来放东西的东西啊。 各个领域都喜欢起一些专业术语,显得很高级。给你讲IOC是不是很高级,给你讲Map是不是就明白了。 bean对象最终存储在spring容器中,在spring源码底

    2024年01月24日
    浏览(37)
  • .net下优秀的IOC容器框架Autofac的使用方法,实例解析

    Autofac是一个功能强大的依赖注入容器,它提供了一种简单和灵活的方式来管理对象之间的依赖关系。下面是Autofac的一些优点: 简单易用:Autofac提供了一种直观和简洁的方式来注册和解析依赖项。它的API设计得非常易于理解和使用,使得开发人员可以轻松地配置和管理依赖关

    2024年02月05日
    浏览(55)
  • Spring——Spring是什么?IoC容器是什么?

    本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果你也对编程感兴趣的话,互关一下,以后互相学习,共同进步。这篇文章能够帮助到你的话,劳请大家点赞转发支持一下! 我们通常所说的 Spring 指的是 Spring Framework(Spring 框架) ,它是

    2024年02月15日
    浏览(39)
  • IOC使用Spring实现附实例详解

    目录 一、相关导读 1. Maven系列专栏文章 2. Mybatis系列专栏文章 3. Spring系列专栏文章 二、前言 Spring简介 Spring体系结构 三、Spring实现IOC 1. 创建Maven工程,引入对应依赖 2. 创建实体类,Dao接口及实现类 3. 编写xml配置文件 4. 测试从Spring容器获取对象 5. 测试结果 四、Spring容器类型

    2023年04月24日
    浏览(37)
  • Spring 6.X IoC 容器

    下面主要介绍 Spring 框架对控制反转 (IoC) 原理的实现 首先要说明的是:IoC 也称为依赖注入,这是一个过程。 其次依赖项的定义:对象仅通过构造函数参数、工厂方法的参数,或在构造对象实例、工厂方法返回后在对象实例上设置的属性来定义其依赖项(即它们使用的其他对

    2024年02月09日
    浏览(41)
  • 3、Spring 之IOC 容器 详解

    IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种 设计思想 ,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序。 Spring 通过 IoC 容器 来管理 所有 Java 对象的实例化和初始化 , 控制对象与对象之间的依赖关系 。我

    2024年02月09日
    浏览(40)
  • 【Spring篇】IOC相关内容

    🍓系列专栏:Spring系列专栏 🍉个人主页:个人主页 目录 一、bean基础配置 1.bean基础配置(id与class) 2.bean的name属性 3.bean作用范围scope配置 二、bean实例化 1.构造方法实例化 2.分析Spring的错误信息 3.静态工厂实例化 4.实例工厂 5.FactoryBean 三、bean的生命周期 1.环境准备 2.生命周期设

    2023年04月25日
    浏览(31)
  • Spring 核心之 IOC 容器学习二

    Annotation 的前世今生 定位 Bean 扫描路径 读取 Annotation 元数据 扫描指定包并解析为 BeanDefinition

    2024年01月19日
    浏览(50)
  • Spring 核心之 IOC 容器学习一

    1、BeanFactory 其中 BeanFactory 作为最顶层的一个接口类,它定义了 IOC 容器的基本功能规范,BeanFactory 有三个重要的子类:ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory。但是从类图中我们可以发现最终的默认实现类是 DefaultListableBeanFactory,它实现了所有的接口。 那

    2024年01月19日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包