【Spring】Ioc容器

🎈博客主页:🌈我的主页🌈
🎈欢迎点赞 👍 收藏 🌟留言 📝 欢迎讨论!👏
🎈本文由 【泠青沼~】 原创,首发于 CSDN🚩🚩🚩
🎈由于博主是在学小白一枚,难免会有错误,有任何问题欢迎评论区留言指出,感激不尽!🌠个人主页


目录

  • 🌟 一、概念
  • 🌟 二、建立一个简单的Ioc容器
    • 🌟🌟 2.1、编写需要读取的JSON文件
    • 🌟🌟 2.2、解析JSON文件信息类
    • 🌟🌟 2.3、测试实体类
    • 🌟🌟 2.4、IOC容器


🌟 一、概念

IoC 英文全称是 Inversion of Control,即控制反转。控制反转是一个面向对象设计原则,可以用来降低计算机代码之间的耦合度。常见的实现方式是依赖注入 DI(Dependency Injection)

在使用 IoC 容器之前,在Java 代码中,A 类中需要使用到 B 对象,用法如下:

class B{}
class A{B b = new B();
}

像以上的代码,A中需要使用B对象,那么就在A中创建B对象,B对象的控制权就在A中

我们使用 IoC 容器,相当于有一个 Container,用来存放所有Bean。继续像以上的例子,当项目启动的时候,A 和 B 都会将自己的信息告知给 Spring 容器,例如将自己类的全路径、将来创建出来 Bean 的名称等等信息都告诉 Spring 容器,Spring 容器就可以根据这些已有的信息创建出来相应的对象,这些创建出来的对象都是由 Spring 容器进行管理的。A 中需要使用 B 对象,就不用自己去创建 B 对象了,而是直接去跟 Spring 容器请求一个 B 对象。此时,由于 B 对象是Spring容器创建出来的,B 对象的控制权就归属于 Spring 容器。
相比于用 IoC 容器之前,B 对象的控制权由 A 对象中转移到 Spring 容器中,B 对象的控制权反转了,这就是控制反转

🌟 二、建立一个简单的Ioc容器

🌟🌟 2.1、编写需要读取的JSON文件

分别是两个实体类的路径信息,还有实体类的id,是一个集合可以包含多个实体类

[{"class_": "com.dong.Dog","id": "dog"
},{"class_": "com.dong.Cat","id": "cat"
}]

🌟🌟 2.2、解析JSON文件信息类

/*** 这个类是用来接收,解析json文件中的各个字段,分别对应json文件中的各个实体类的字段*/
public class BeanDefination {private String class_;private String id;public String getClass_() {return class_;}public void setClass_(String class_) {this.class_ = class_;}public String getId() {return id;}public void setId(String id) {this.id = id;}
}

🌟🌟 2.3、测试实体类

public class Cat {private String name;private Integer age;@Overridepublic String toString() {return "Cat{" +"name='" + name + '\'' +", age=" + age +'}';}...省略get和set
}
public class Dog {private String name;private Integer age;@Overridepublic String toString() {return "Dog{" +"name='" + name + '\'' +", age=" + age +'}';}...省略get和set
}

🌟🌟 2.4、IOC容器

 public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {//自定义spring容器containerHashMap<String, Object> container = new HashMap<>();//定义读入流ObjectMapper om = new ObjectMapper();//读入bean定义流jsonList<BeanDefination> beanDefinations = om.readValue(demo01.class.getResourceAsStream("/beans.json"), new TypeReference<List<BeanDefination>>() {@Overridepublic Type getType() {return super.getType();}});for (BeanDefination bd : beanDefinations) {String class_ = bd.getClass_();String id = bd.getId();//获取到类的全路径,调用构造方法,获取实例Object instance = Class.forName(class_).getConstructor().newInstance();container.put(id,instance);}Dog dog = (Dog)container.get("dog");Cat cat = (Cat) container.get("cat");System.out.println(dog.toString());System.out.println(cat.toString());}

通过反射获取到类的路径,直接调用构造方法,获取实例,实现了一个简单的IOC容器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/77213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA设置Maven 镜像

第一步&#xff1a;右键项目&#xff0c;选择Maven->Create ‘settings.xml’ 已经存在的话是Open ‘settings.xml’&#xff1a; 第二步&#xff1a;在settings.xml文件中增加阿里云镜像地址&#xff0c;代码如下&#xff1a; <?xml version"1.0" encodin…

Android Ble蓝牙App(七)扫描过滤

Ble蓝牙App&#xff08;七&#xff09;扫描过滤 前言目录正文一、增加菜单二、使用MMKV① 添加依赖② 封装MMKV③ 使用MMKV 三、过滤空设备名四、过滤Mac地址五、过滤RSSI六、源码 前言 在上一篇文章中了解了MTU的相关知识以及对于设备操作信息的展示&#xff0c;本篇文章中将增…

Electron和vue3集成(推荐仅用于开发)

本篇我们仅实现Electron和vue3通过先运行起vue3项目&#xff0c;再将vue3的url地址交由Electron打开的方案&#xff0c;仅由Electron在vue3项目上套一层壳来达到脱离本机浏览器运行目的 1、参考快速上手 | Vue.js搭建起vue3初始项目 npm install -g vue npm install -g vue/c…

Android 文字转语音播放实现

1&#xff0c;TextToSpeech类是android自带的&#xff0c;但是部分设备需要支持TTS需要增加语音库&#xff0c;我使用的是讯飞语音&#xff08;离线的哦&#xff09;。请自行下载并安装讯飞语音APK&#xff0c;然后到系统设置中设置TTS功能默认使用该选项。有自带TTS库的可以省…

口袋参谋:淘宝不限类目,透视竞品实时销量!快试试这个插件

​在运营一家店铺之前&#xff0c;可以先了解各类目宝贝的市场行情&#xff0c;及时掌握不同类目宝贝的价格、销售情况&#xff0c;根据需求制定出属于自己的营销策略。 【可跨类目竞店透视】功能&#xff1a; 支持一键获取任意店铺宝贝概况信息 【跨类目竞店透视】功能使用 …

SEO百度优化基础知识全解析(了解百度SEO标签作用)

百度SEO优化的作用介绍&#xff1a; 百度SEO优化是指通过对网站的内部结构、外部链接、内容质量、用户体验等方面进行优化&#xff0c;提升网站在百度搜索结果中的排名&#xff0c;从而提高网站的曝光率和流量。通过百度SEO优化&#xff0c;可以让更多的潜在用户找到你的网站&…

Navicat15工具连接PostgreSQL15失败

1.错误现象及原因 错误现象&#xff1a; 错误原因&#xff1a; postgresql 15版本中 pg_database 系统表把 datlastsysoid 列删除了&#xff0c;所以造成了此错误。 2.解决方法 &#xff08;1&#xff09;将Navicat工具更新到官网最新版本。 &#xff08;2&#xff09;更换…

C++编译静态成员函数报错: “osgGA::DriveManipulator::setEye”: 非静态成员函数的非法调用

来看代码 .h文件中 static void computePosition(const osg::Vec3d& eye,const osg::Vec3d& lv,const osg::Vec3d& up); void setEye(const osg::Vec3d& eye); void setRotation( const osg::Quat& rotation );osg::Vec3d _eye; osg::Quat _rotation…

583. 两个字符串的删除操作 -- 动规

583. 两个字符串的删除操作 class MinDistance:"""583. 两个字符串的删除操作https://leetcode.cn/problems/delete-operation-for-two-strings/description/"""def solution(self, text1: str, text2: str) -> int:"""这道题…

python中的小tips

1、注释 1、注释快捷键&#xff1a; Ctrl/ 可以注释掉光标所在的这一行&#xff0c;或者是选中的区域。 对于注释掉的这一行或者这一区域&#xff0c;按下ctrl/则会去掉注释。 2、多行注释 在写多行注释时&#xff0c;英文状态下写三个"&#xff0c;会自动变成六个"&…

java创建线程的3种方式

方法一&#xff0c;直接使用 Thread import lombok.extern.slf4j.Slf4j;Slf4j(topic "c.Test1") public class Test1CreateThread {public static void main(String[] args) {Thread t new Thread(){Override// run 方法内实现了要执行的任务public void run() {l…

探索程序员需要掌握的算法?

文章目录 一&#xff1a;引言二&#xff1a;常见算法介绍三&#xff1a;重点算法总结 &#x1f389;欢迎来到数据结构学习专栏~探索程序员需要掌握的算法&#xff1f; ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章…

【大数据Hive】hive 加载数据常用方案使用详解

目录 一、前言 二、load 命令使用 2.1 load 概述 2.1.1 load 语法规则 2.1.2 load语法规则重要参数说明 2.2 load 数据加载操作演示 2.2.1 前置准备 2.2.2 加载本地数据 2.2.3 HDFS加载数据 2.2.4 从HDFS加载数据到分区表中并指定分区 2.3 hive3.0 load 命令新特性 …

解决SVN文件不显示绿色小钩图标问题

问题描述&#xff1a; 今天重新安装了SVN&#xff0c;发现从中央服务器拉取文件到本地仓库后&#xff0c;对应的文件没有绿色的小钩图标&#xff0c;于是查了一下解决方案&#xff0c;在这里总结一下。 解决方案一&#xff1a; 原因&#xff1a;状态缓存设置问题造成的。 在…

【数据结构】树的基础知识及三种存储结构

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

【C++基础】lambda表达式

这个其实在QT中经常用到&#xff0c;但是之前自己学习的时候也是一知半解的&#xff0c;没有彻底的搞明白&#xff0c;在这里&#xff0c;做一个整理 文章参考&#xff1a;Lambda表达式 | 爱编程的大丙 lambda表达式定义了一个匿名函数&#xff0c;并且可以捕获一定范围内的变…

1143. 最长公共子序列 -- 动规

1143. 最长公共子序列 class LongestCommonSubsequence2:"""1143. 最长公共子序列https://leetcode.cn/problems/longest-common-subsequence/"""def solution(self, text1: str, text2: str) -> int:"""递归解法 备忘录自顶…

【SG滤波】三阶滤波、五阶滤波、七阶滤波(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

linux grep操作汇总

汇总起来&#xff0c;备忘查看&#xff01; 目录 1&#xff0c;找指定文本 2&#xff0c;查找时不区分大小写 3&#xff0c;在指定命令下递归查找 4&#xff0c;查找时显示字符串在文件中的行号 5&#xff0c;取反&#xff1a;找出文件中不包含指定内容的数据行 6&#x…

JDBC连接串配置JDBC日志(DM8:达梦数据库)

DM8:达梦数据库JDBC连接串配置JDBC日志 环境介绍1 Windows 环境程序配置2 Linux 环境程序配置 环境介绍 在某些环境&#xff0c;需要开启JDBC日志&#xff0c;用于分析业务系统连接数据库遇到的异常问题配置JDBC日志后&#xff0c;程序重启生效 1 Windows 环境程序配置 jdbc…