Spring依赖注入和ioc在spring中的实现方式

目录

一、依赖注入

1.IOC思想

2.什么是依赖注入?

3.实例化对象中有pojo类型属性

二、IOC在Spring中的实现方式

1.获取bean的三种方式

1.1根据bean的id获取

1.2根据bean的类型获取(最常用,因为在IOC容器中,一个类型的bean只需要配置一次就够了)

1.3根据bean的id和类型进行获取

1.4根据类所实现的类的类型获取(通过接口获取)


一、依赖注入

1.IOC思想

IOC:Inversion Of Control  翻译:控制反转

举个例子:

自己做饭:买菜,洗菜,切菜,炒菜~~~~等等步骤和细节都需要自己清楚的知道

点外卖:下单,等,吃,不需要关心创建细节

controller----->Service------>dao

controller依赖于Service,Service依赖于dao

2.什么是依赖注入?

        依赖注入即程序在运行时,希望给某个对象所依赖的对象赋值,就称为依赖注入(需要什么,传递什么,传递的任务由Spring完成

简单来说就是对Controller所依赖的对象进行赋值,依赖哪个对象,spring就对哪个对象进行赋值

注入(赋值)方式由三种:

  1. setter方法注入
  2. 构造方法注入
  3. 注解注入

 示例1:setter注入,通过<property>标签给属性赋值()

基本数据类型的成员属性直接通过value赋值。

对应的bean:

<bean id="person" class="cn.edu.xysf.ssm.entity.Person"><property name="name" value="李晶晶"></property><property name="age" value="23"></property><property name="gender" value="女"></property></bean>

测试类:

 @Testpublic void PersonTest(){//1。需要实例化IOC容器,子类ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//2.从IOC容器中拿到想要的对象Person person = (Person)context.getBean("person");System.out.println(person);
}

运行结果:

示例2:构造器注入

        假如实体类有五个属性,但是只给四个属性赋值,此时可以使用name,name可以为value指定它所赋值的属性

对应的bean:

  <bean id="studentThree" class="com.zh.spring.pojo.Student"><constructor-arg value="10002"></constructor-arg><constructor-arg  value="李四"></constructor-arg><constructor-arg  value="男"></constructor-arg><constructor-arg  value="22" name="age"></constructor-arg></bean>
   @Testpublic void testDI02(){//获取IOC容器ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");//获取beanStudent studentThree = ioc.getBean("studentThree", Student.class);System.out.println(studentThree);}

注入(赋值)的数据类型有三种:

  1. 基本数据类型和String类型
  2. 普通POJO类型(必须在Spring的配置文件中出现过的bean)
  3. 复杂类型(集合类型)

3.实例化对象中有pojo类型属性

如果Person类中有一个pojo类型的属性,假如是idCard,则在Person类中添加这个POJO属性,然后新建一个IdCard类

 

 添加对应的bean

 <bean name="idCard_1" class="cn.edu.xysf.ssm.entity.IDCard"><property name="id" value="123456789"></property><property name="pubDep" value="xxx公安局"></property><property name="vailTime" value="2038-11-09"></property></bean>

运行结果:

二、IOC在Spring中的实现方式

  1. BeanFactory实现:基本实现,spring内部使用的接口,面向spring本身,不对开发人员开放
  2. ApplicationContext实现:BeanFactory的子接口,功能更多,面向开发人员。

以上只是接口,没有具体的实现方法。

ClassPathXMLApplicationContext:类路径下的XML配置文件,推荐使用。

FileSystemXmlApplicationContext:文件系统路径下的XML配置文件,不推荐使用,因为之后的项目会在不同的电脑上运行,配置文件不一定存在于每个电脑上

目前为止spring配置文件的名字可以随便起,但是到了ssm整合时会有固定的名字。

配置文件的作用就是获取IOC容器,底层通过反射和工厂模式实现

1.获取bean的三种方式

 <bean id="studentOne" class="com.zh.spring.pojo.Student"></bean>
1.1根据bean的id获取

        根据bean的id获取时,实例化对象中一定要有无参构造方法,否则会报错(NoSuchMethodException)。

 

 

 @Testpublic void testIOC(){//获取IOC容器ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");//根据id获取bean对象Student studentOne = (Student) ioc.getBean("studentOne");System.out.println(student);}
1.2根据bean的类型获取(最常用,因为在IOC容器中,一个类型的bean只需要配置一次就够了)

        通过类型获取到的对象,返回值就是该类型的实例化对象,

注意:根据类型获取bean时,要求IOC容器中有且只有一个bean,否则会报错(NoUniqueBeanDefinitionException)。

 <bean id="studentOne" class="com.zh.spring.pojo.Student"></bean><bean id="studentTwo" class="com.zh.spring.pojo.Student"></bean>

 

  @Testpublic void testIOC(){//获取IOC容器ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");//根据类型获取Student student = ioc.getBean(Student.class);System.out.println(student);}
1.3根据bean的id和类型进行获取
  @Testpublic void testIOC(){//获取IOC容器ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");//根据bean的id和类型进行获取Student studentOne = ioc.getBean("studentOne", Student.class);System.out.println(studentOne);}
1.4根据类所实现的类的类型获取(通过接口获取)
   @Testpublic void testIOC(){//获取IOC容器ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");//根据接口实获取Person person = ioc.getBean(Person.class);System.out.println(person);}
结论:根据类型来获取bean时,在满足bean唯一性的前提下
其实只是看:【对象 instanceof 指定的类型 】的返回值
只要返回的时true既可以认定和类型匹配,能够获取到
即通过bean的类型、bean所继承的类的类型,bean所实现的类的类型都可以获取到bean

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

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

相关文章

<MySQL> Centos 7环境安装MySQL

Centos 7环境安装MySQL 1.卸载不要的环境 停止MySQL服务 systemctl stop mariadb.service systemctl stop mysqld禁止MySQL服务开机自启 systemctl disable mysqld卸载MySQL软件包 yum remove mysql-server mysql-client删除MySQL数据目录 rm -rf /var/lib/mysql清理MySQ…

[golang gin框架] 42.Gin商城项目-微服务实战之后台Rbac微服务角色增删改查微服务

一.重构后台Rbac用户登录微服务功能 上一节讲解了后台Rbac微服务用户登录功能以及Gorm数据库配置单独抽离&#xff0c;Consul配置单独抽离&#xff0c;这一节讲解后台Rbac微服务角色增删改查微服务功能&#xff0c;Rbac微服务角色增删改查微服务和后台Rbac用户登录微服务是属于…

SpringBoot入门

目录 一、创建项目 二、项目结构 三、起步依赖 四、简单请求接口 控制类 1、无参数 2、简单参数 3、实体参数 4、数组集合参数 5、json参数 五、统一响应结果 result.java HelloResponse.java 测试结果 一、创建项目 Spring官方骨架&#xff0c;可以理解为Sprin…

解决 “Module build failed (from ./node_modules/babel-loader/lib/index.js)“ 错误的方法

系列文章目录 文章目录 系列文章目录前言一、错误原因&#xff1a;二、解决方法&#xff1a;三、注意事项&#xff1a;总结 前言 在前端项目开发中&#xff0c;如果使用了 Babel 来转译 ES6 语法&#xff0c;有时会遇到错误信息 “Module build failed (from ./node_modules/b…

提升开发效率,Lombok的链式编程和构建模式

目录 链式编程 定义 代码示例 ​编辑 Accessors(chaintrue) 开启链式编程 ​编辑 Accessors(chain true,fluent true) 去除set和get 构建模式 定义 代码示例 ​编辑 踩坑 Singular 定义 代码示例 踩坑默认值情况 ​编辑 With 定义 代码示例 链式编程 定义 链…

ChatGPT的应用与发展趋势:解析人工智能的新风口

目录 优势 应用领域 发展趋势 总结 在人工智能技术迅猛发展的时代&#xff0c;自然语言处理系统的提升一直是研究者们追求的目标。作为人工智能领域的重要突破之一&#xff0c;ChatGPT以其出色的语言模型和交互能力&#xff0c;在智能对话领域取得了重要的进展。 ChatGPT是…

一文教会你单向链表

目录 一、什么是链表&#xff1f; 1.链表的定义 2.链表的实现 2.1链表的定义 2.2创建一个链表 二、链表的各个接口 1.创建节点 2.头插(将新创建的节点作为头插入到链表中) 3.打印链表 4.尾插(将新创建的节点插入到链表的末端) 5.头删 6.尾删 7.查找 8.删除指定节点位…

【计算机网络】10、ethtool

文章目录 一、ethtool1.1 常见操作1.1.1 展示设备属性1.1.2 改变网卡属性1.1.2.1 Auto-negotiation1.1.2.2 Speed 1.1.3 展示网卡驱动设置1.1.4 只展示 Auto-negotiation, RX and TX1.1.5 展示统计1.1.7 排除网络故障1.1.8 通过网口的 LED 区分网卡1.1.9 持久化配置&#xff08…

QT--day5(网络聊天室、学生信息管理系统)

服务器&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化空间servernew QTcpServer(this); }Widget::~Widget() {delete ui; …

Codeforces Round 889 (Div. 2)题解

目录 A. Dalton the Teacher题目大意题解思路代码 B. Longest Divisors Interval题目大意题解思路代码 C1. Dual (Easy Version)题目大意题解思路代码 A. Dalton the Teacher 题目链接 题目大意 Dalton是一个班级的老师&#xff0c;这个班级有 n n n个学生&#xff0c;分别…

GDAL C++ API 学习之路 OGRGeometry 抽象曲线基类 OGRCurve

OGRCurve class "ogrsf_frmts.h" OGRCurve 是 OGR&#xff08;OpenGIS Simple Features Reference Implementation&#xff09;几何库中的一个基类&#xff0c;表示曲线几何对象。它是 OGRLineString 和 OGRCircularString 的抽象基类&#xff0c;用于表示曲…

Kotlin知识点

Kotlin 是 Google 推荐的用于创建新 Android 应用的语言。使用 Kotlin&#xff0c;可以花更短的时间编写出更好的 Android 应用。 基础 Kotlin 程序必须具有主函数&#xff0c;这是 Kotlin 编译器在代码中开始编译的特定位置。主函数是程序的入口点&#xff0c;或者说是起点。…

JavaScript 作用域与闭包

本文内容学习于&#xff1a;后盾人 (houdunren.com) 1.作用域 1)函数被执行后其环境变量将从内存中删除。下面函数在每次执行后将删除函数内部的 total 变量。 function count() { let total 0; } count (); 2)函数每次调用都会创建一个新作用域 3)如果子函数被使用时父级环境…

【C++】类和对象 - 上

目录 1. 面向过程和面向对象初步认识2. 类的引入3. 类的定义4. 类的访问限定符及封装4.1 访问限定符4.2 封装 5. 类的作用域6. 类的实例化7. 类对象模型7.1 如何计算类的大小7.2 类对象的存储方式猜测7.3 结构体内存对齐规则 8. this指针8.1 引出8.2 this指针的特性 总结 1. 面…

【Leetcode】53. 最大子数组和

一、题目 1、题目描述 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。…

打卡力扣题目四

#左耳听风 ARST 打卡活动重启# 目录 一、题目 二、解题代码 三、解题思路 关于 ARTS 的释义 —— 每周完成一个 ARTS&#xff1a; ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个技术技巧 ● Share: 分享…

列表list

列表 列表是将数据组织在一个一维集合中&#xff0c;从这个组织方式来看&#xff0c;它与c()函数是相似的。但是&#xff0c;列表并不是将具体的值组织起来&#xff0c;而是组织R对象&#xff0c;如列表、数据框、矩阵、函数、向量等等。 列表非常好用&#xff0c;因为列表可…

打开域名跳转其他网站,官网被黑解决方案(Linux)

某天打开网站&#xff0c;发现进入首页&#xff0c;马上挑战到其他赌博网站。 事不宜迟&#xff0c;不能让客户发现&#xff0c;得马上解决 我的网站跳转到这个域名了 例如网站跳转到 k77.cc 就在你们部署的代码的当前文件夹下面&#xff0c;执行下如下命令 find -type …

Electron 系统通知 Notification 实践指南

系统通知是桌面应用的常见功能&#xff0c;用于给用户发送提醒&#xff08;刷下存在感 &#x1f642;&#xff09;&#xff0c;还能帮定点击事件以便后续的操作。 Electron 自带通知模块&#xff0c;下方代码是一个简单的示例 const { Notification } require(electron)cons…

电脑维护指南:让你的战友始终高效稳定

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…