谈谈自己对IOC容器的理解(一)

2023-10-31

初学Java时,了解到Java是一门面向对象的语言。我感觉Java这面向对象好废,啥都要我自己弄。这跟C语言有啥区别,感觉Java也就这样了,完全体会不到面向对象的感觉,处处都是“面向过程”。网上总说面向对象修房子是去找专门修房子的人来修,面向过程是自己亲力亲为的去修。可是去找修房子的人也得有个过程,不可能无缘无故的就来了一个修房子的吧!自从接触了Spring IOC,我才知道修房子的人也会自己找上门来,不要我去找了,真nice!

1.IOC基本概念

IOC全称为Inversion of Control,翻译为控制反转,别名又叫依赖注入(DI)。从字面上你会发出疑问,IOC控制什么?反转什么?依赖又是啥东西?。
没办法文明人说话就是这么高端大气上档次。平时写Java写的最多的是什么?肯定是对象了。要不然叫啥面向对象,这不开玩笑吗?
自从有了IOC,我连对象都new不了,这脱单咱办呢?本以为没有对象,还可以new一下对象,以解忧愁。这下倒好了,我负责脱发,他负责找对象。
IOC控制: 控制的是对象的创建和管理。
IOC反转: 反转的肯定是对象,要不然对象都没了,你还能搞啥。有点像中介。
依赖: 你就是我这辈子的依赖啊!你总得告诉它你需要什么样的“女朋友”。

2.IOC的作用

苍茫的天涯,总有我的爱!就是不知道在哪里,对象new多了,都不知道那里new过对象,最近又要换个对象,以前对象怎么办,总不能占着茅坑不拉屎。所以IOC来了,来了,从此君王不早朝(我终于知道为啥每天加班)。
IOC的主要作用是: 解耦。
解耦,是降低程序耦合度,也就是减少程序代码之间的依赖性,如果代码之间的依赖性很高,修改一处代码会影响很多其他的代码,这就给项目的稳定性带来的问题,不利于代码的扩展和维护。

3.简单的实现

1.创建一个Maven
2.导入依赖
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>5.2.8.RELEASE</version>
</dependency>
3.编写代码

写一个接口:

//后宫
public interface Harem {
    void nafei(String name);
}

一个实现类:

//纳谁
public class Person implements Harem{
    @Override
    public void nafei(String name) {
        System.out.println("我要纳"+name+"为妃");
    }
}
4.实现
4.1添加Spring配置文件

在resources目录下,添加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.xsd">
    
    <bean id="person" class="com.demo.Person"></bean>
</beans>

在这里插入图片描述
编写一个测试类:

 public static void main(String[] args) {
        //创建上下文
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("ioc.xml");
        //获得对象
        Person bean = context.getBean(Person.class);
        bean.nafei("妲己");
    }

最后可以得到这样的一个结果:
在这里插入图片描述

4.2注解实现IOC

给接口的实现类加上@Component注解。

//纳谁
@Component
public class Person implements Harem{
    @Override
    public void nafei(String name) {
        System.out.println("我要纳"+name+"为妃");
    }
}

编写一个测试类:

@Configuration
public class Test {
    public static void main(String[] args) {
        //创建注解应用程序上下文
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Test.class);
        //获得对象
        Person bean = context.getBean(Person.class);
        bean.nafei("妲己");
    }
}

结果:
在这里插入图片描述

两种方式感觉注解版要方便一点。

5.参考资料

1.《Spring揭秘》
2.Spring框架(一) IOC


如有错误,还望指出!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

谈谈自己对IOC容器的理解(一) 的相关文章

随机推荐

  • Python Train_出乎意料的简单!10分钟用python建立人工智能预测模型

    介绍 鉴于Python在过去几年中的兴起及其简洁性 对于数据科学领域的Python学家意义重大 这篇文章会用最容易的方式引导你更快地构建第一个预测模型 出乎意料的简单 10分钟用python进行人工智能建立预测模型 揭秘预测建模的过程 我一
  • QT+CEF(Chromium嵌入式框架)环境搭建,CEF库libcef_dll_wrapper.lib编译

    上一章使用qt自家的QWebEngineView实现浏览器 存在一定兼容性和稳定性问题 https blog csdn net weixin 40355471 article details 120698537 本章将使用开源的CEF Ch
  • 寒假:HTML

    图片导入 lt img src 图片导入的位置 width 宽度 height 高度 alt 图像的替代文字 title 鼠标悬停提示文字 gt 超文本链接 lt a href target 目标窗口位置 gt 链接文本或图像 视频元素
  • 原生小程序用vant组件自定义底部导航

    在根目录中创建custom tab bar 新建page index 在app json或index json中引入vant组件 usingComponents van tabbar vant weapp tabbar index van
  • 程序员的代码行数越少越好?

    代码行数越少越好 读懂别人的代码很困难 如何编写出 完美 的代码 每天要坚持8小时编程 拜托 这些编程误区程序员应该尽早知道 作为开发人员 你会听到许多有关 代码行数 的令人难以置信的疯狂理论 不要相信他们 以代码行数作为决策依据是一件非常
  • ew schema is incompatible with the current setting value. Invalid value for type in block

    shopify开发报错 New schema is incompatible with the current setting value Invalid value for type in block 84341d56 61dc 4c39
  • 第三课 C++ 教程:char 和 int 是 C++ 中常见的数值类型,以及常用格式化说明符

    第三课 C 教程 char 和 int 是 C 中常见的数值类型 以及常用格式化说明符 学习目标 在本教程中 我们将学习以下内容 数值类型 char short 和 int 的区别和使用 sizeof 运算符的作用 无符号整数 unsign
  • 找出数组中三个数之和为0的组合

    找出数组中三个数之和为0的组合 题目 思路 代码 题目 给定一个无序可重复整数序列 当该序列中任意三个数的和等于0 输出这三个数 如 序列nums 1 0 1 2 1 4 输出 1 0 1 1 1 2 思路 首先对数组不同位进行两两结合 在
  • 我的串口打印之坑——8266os_printf()适用于NONOS_SDK,故在自动生成APP代码中不能打印,要用uart0_sendStr( )函数(4)

    说到用安信可串口调试助手打印信息 首先明确esp8266nodeMCU有uart0 GPIO13 GPIO15 uart1 GPIO3 GPIO0 接下来 编程时候 1 首在user init 中先初始化uart init void ICA
  • JAVA面向对象的思想

    java面向对象 什么是面向对象思想 什么是面向对象 类和对象 类 对现实世界中某类事物的描述 是抽象的 概念上的定义 对象 事物具体存在的个体 抽象类 接口 成员变量和局部变量的区别 作用域 存储位置 初始值 构造方法 面向对象三大特性
  • Java的类加载器

    类加载是java语言提供的最强大的机制之一 尽管类加载并不是讨论的热点话题 但所有的编程人员都应该了解其工作机制 明白如何做才能让其满足我们的需 要 这能有效节省我们的编码时间 从不断调试ClassNotFoundException Cla
  • 代理IP与Socks5代理

    一代理IP 多地区数据采集的智能引擎 多地区市场了解 代理IP允许爬虫模拟多个地区的IP地址 实现对不同市场的数据采集 这为跨界电商深入了解不同地区需求 趋势提供了数据基础 规避反爬虫策略 许多网站采用反爬虫技术 限制频繁访问 代理IP通过
  • JavaWeb的Servlet的两种配置

    Servlet接口 要成为一个Servlet 需要实现Servlet接口 为了方便 可以继承HttpServlet HttpServlet实现了Servlet接口 Servlet生命周期 在Tomcat中Servlet是单例的 Servle
  • 如何使用Docker创建自定义网络

    目录 网络模式 1 bridge模式 默认模式 桥接模式 初识网络模式 查看桥接模式的特点 2 host模式 仅主机模式 使用守护进程的方式创建并启动且进入容器 查看仅主机模式下的网络配置 端口映射 3 如何创建自定义网络 网络模式 Doc
  • Unity3D 选中高亮效果shader的实现

    实现思路 平时我们可能觉得shader就是单纯用来进行渲染的 不会和逻辑代码产生什么交互 但是如果要做这种高亮的效果就需要使用代码来控制shader的显示了 所以物体选中高亮效果的实现其实就很简单 先写一个shader表现高亮效果 然后用另
  • Mybatis 学习笔记02 - CRUD

    目录 1 添加操作 1 1 在 UserDao 接口中新增 saveUser 方法 1 2 在映射配置文件 UserMapper xml 中配置添加操作 1 3 测试添加用户 1 4 测试结果 2 更新操作 2 1 在 UserDao 接口
  • FAST-LIO(二):程序运行&代码注释

    文章目录 前言 数据准备 程序运行 代码注释 1 laserMapping cpp 2 IMU Processing hpp 3 use ikfom hpp 前言 论文题目 FAST LIO A Fast Robust LiDAR iner
  • vue页面缓存解决方案

    关于vue页面通过解决方案 方案一 使用keep alive和v if 备注 这种方案有问题 关闭面板后 在通过菜单打开页面还是有缓存 1 添加keep alive
  • pycharm 怎么使用快捷键按出代码提示框

    更新win10 发现可以改取消ctrl space快捷键的占用了 我们在平时写代码的时候难免会出现敲错字母的时候 这时候你的代码提示框就会消失 很不爽 但你退格删掉错的字母的时候 代码提示框还是没有自动出现 就很烦 不想写代码了 其实都是w
  • 谈谈自己对IOC容器的理解(一)

    初学Java时 了解到Java是一门面向对象的语言 我感觉Java这面向对象好废 啥都要我自己弄 这跟C语言有啥区别 感觉Java也就这样了 完全体会不到面向对象的感觉 处处都是 面向过程 网上总说面向对象修房子是去找专门修房子的人来修 面