目录

依赖注入概念极其详解(DI)

set注入(设值注入)

实例演示:

构造方法注入

实例演示:

集合类型数据注入

实例演示:

使用p命名空间简化配置


  • 依赖注入概念极其详解(DI)

  • Spring 框架使用依赖注入(DI)实现 IoC
  • Spring 容器是一个超级大工厂,负责创建、管理所有的 Java 对象,这些 Java 对象被称为 Bean
  • Spring 容器管理着容器中 Bean 之间的依赖关系,Spring 使用“依赖注入”的方式来管理 Bean 之间的依赖关系
  • DI(Dependency Injection)依赖注入
  • 应用程序运行依赖的资源由Spring为其提供,资源进入应用程序的方式称为注入
  • IOC与DI是同一件事站在不同的角度上来看的
  • 站在Spring容器的角度上叫IOC
  • 站在应用程序的角度上叫DI
  • 也可以如此理解:
  • 注入是什么
  • 通过Spring工厂以及配置文件,为所创建对象的成员变量赋值
  • 为什么需要注入
  • 通过编码的方式为成员变量进行赋值,存在耦合?为什么
  • 我们以前都是通过set方法来为成员变量赋值,这样通过代码为成员变量赋值存在耦合
  • 注入可以解决这种问题
  • 注入的好处
  • 大好处
  • 解耦合
  • Great---lovely:
  • 不管是依赖注入,还是控制反转,都说明Spring采用动态、灵活的方式来管理各种对象
  • 对象与对象之间的具体实现互相透明
  • 在理解依赖注入之前,看如下这个问题在各种社会形态里如何解决:一个人(Java实例,调用者)需要一把斧子(Java实例,被调用者)
  •   (1)原始社会里,几乎没有社会分工;需要斧子的人(调用者)只能自己去磨一把斧子(被调用者);对应的情形为:Java程序里的调用者自己创建被调用者
  •   (2)进入工业社会,工厂出现;斧子不再由普通人完成,而在工厂里被生产出来,此时需要斧子的人(调用者)找到工厂,购买斧子,无须关心斧子的制造过程;对应Java程序的简单工厂的设计模式
  •   (3)进入“按需分配”社会,需要斧子的人不需要找到工厂,坐在家里发出一个简单指令:需要斧子;斧子就自然出现在他面前;对应Spring的依赖注入
  •    第一种情况下,Java实例的调用者创建被调用的Java实例,必然要求被调用的Java类出现在调用者的代码里;无法实现二者之间的松耦合
  •    第二种情况下,调用者无须关心被调用者具体实现过程,只需要找到符合某种标准(接口)的实例,即可使用;此时调用的代码面向接口编程,可以让调用者和被调用者解耦,这也是工厂模式大量使用的原因;但调用者需要自己定位工厂,调用者与特定工厂耦合在一起
  •    第三种情况下,调用者无须自己定位工厂,程序运行到需要被调用者时,系统自动提供被调用者实例;事实上,调用者和被调用者都处于Spring的管理下,二者之间的依赖关系由Spring提供
  •    所谓依赖注入,是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入;Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理
  • 小好处(只是大好处的延申)
  • 增强可重用性:减少组件依赖性可以增强组件的可重用性
  • 如果在不同的上下文中需要某个接口的不同实现,或者只是同一实现的不同配置,则可以将该组件配置为使用该实现;无需更改代码
  • 增强代码的可读性:依赖注入可将依赖项移动到组件的接口
  • 使得更容易看到组件中哪些具有依赖关系,从而使代码更具可读性
  • 依赖注入有2种方式:
  • set注入(主流)与构造器(构造方法)注入
  • set注入(设值注入)

  • 使用set注入,一定要给类提供一个无参的构造函数,否则Spring不能实例化类
  • 因为set注入,需要先利用无参的构造方法 反射创建一个对象,再使用set方法给属性赋值
  • 一个类中无构造函数的话,系统会自动添加一个缺省无参构造函数,而如果写过构造函数, 系统将不会再次添加,一般写代码的时候, 最好把无参构造函数显示的写出来
  • 名称:property
  • 类型:标签
  • 归属:bean标签
  • 作用:使用set方法的形式为bean提供资源
  • 格式:
  • <bean>
  •      <property />
  • </bean>
  • 基本属性:
  • <property name="propertyName" value="propertyValue" ref="beanId" />
  • name:
  • 对应bean中的属性名,要求该属性必须提供可访问的set方法(严格规范为此名称是set方法对应名称)
  • value:
  • 设定非引用类型属性对应的值,不能与ref同时使用
  • ref:
  • 设定引用类型属性对应bean的id,不能与value同时使用
  • 一个bean可以有多个property标签
  • 实例演示:

  • 准备的service接口与实现类和之前bean的一样(后面的实现会在实现类中修改)
  • 实现注入资源的注入
  • 创建
  • 实现
  • 构造方法注入

  • 名称:constructor-arg
  • 类型:标签
  • 归属:bean标签
  • 作用:
  • 使用构造方法的形式为bean提供资源,兼容早期遗留系统的升级工作
  • 格式:
  • <bean>
  •     <constructor-arg />
  • </bean>
  • 基本属性:
  • <constructor-arg name="argsName" value="argsValue" />
  • name:对应bean中的构造方法所携带的参数名
  • value:设定非引用类型构造方法参数对应的值,不能与ref同时使用
  • 一个bean可以有多个constructor-arg标签
  • type:
  • 设定构造方法参数的类型,用于按类型匹配参数或进行类型校验
  • index:
  • 设定构造方法参数的位置,用于按位置匹配参数,参数index值从0开始计数
  • 实例演示:

  • 目前dao层,测试类和之前一样
  • service层实现类变化
  • 配置文件变化
  • 测试成功
  • index的使用
  • 集合类型数据注入

  • 可用util命名空间帮助我们快速的定义list、map、set等,可以解决一些注入问题
  • 名称:array,list,set,map,props
  • 类型:标签
  • 归属:property标签或constructor-arg标签
  • 作用:注入集合数据类型属性
  • 格式:(具体看实例演示)
  • <property>
  •    <list></list>
  • </property>
  • 实例演示:

  • 创建BookDao接口与实现类
  • 实现类中声明了5种集合数据类型,提供了它们的set注入,然后在它的save方法中让它们逐一打印数据
  • 同时对应修改Service层实现类
  • 对应配置好配置文件
  • UserDao实现类和之前一样
  • 测试成功
  • 使用p命名空间简化配置

  • 名称:p:propertyName,p:propertyName-ref
  • 类型:属性
  • 归属:bean标签
  • 作用:为bean注入属性值
  • 格式:
  • <bean p:propertyName="propertyValue" p:propertyName-ref="beanId"/>
  • 注意:
  • 使用p命名空间需要先开启spring对p命名空间的支持,在bean标签中添加对应空间支持
  • 实例演示:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!--<bean id="userService" class="com.superdemo.service.impl.UserServiceImpl">3.将要注入的引用类型的变量通过property属性进行注入,对应的name是要注入的变量名,使用ref属性声明要注入的bean的id<property name="userDao" ref="userDaoDao"/>&lt;!&ndash;引用类型的&ndash;&gt;<property name="num" value="666"/>&lt;!&ndash;非引用类型的&ndash;&gt;<property name="version" value="icpc"/>&lt;!&ndash;非引用类型的&ndash;&gt;</bean>2.将要注入的资源声明为bean<bean id="userDaoDao" class="com.superdemo.dao.impl.UserDaoImpl"/>--><!--2.将要注入的资源声明为bean--><!--<bean id="userDaoDao" class="com.superdemo.dao.impl.UserDaoImpl"><constructor-arg index="1" value="123456"/><constructor-arg index="0" value="tj"/></bean><bean id="userService" class="com.superdemo.service.impl.UserServiceImpl"><constructor-arg name="userDao" ref="userDaoDao"/><constructor-arg name="version" value="ccpc"/><constructor-arg name="num" value="666666"/></bean>--><!--2.加载配置文件--><context:property-placeholder location="classpath:data.properties"/><bean id="userDaoDao" class="com.superdemo.dao.impl.UserDaoImpl"><property name="username" value="${username}"/><property name="password" value="${pwd}"/></bean><!--<bean id="userService" class="com.superdemo.service.impl.UserServiceImpl"><property name="userDao" ref="userDaoDao"/><property name="bookDao" ref="bookDaoDao"/><property name="version" value="No.1"/><property name="num" value="923"/></bean>--><beanid="userService"class="com.superdemo.service.impl.UserServiceImpl"p:userDao-ref="userDaoDao" p:bookDao-ref="bookDaoDao" p:version="No.1" p:num="923"/><bean id="bookDaoDao" class="com.superdemo.dao.impl.BookDaoImpl"><property name="al"><util:list list-class="java.util.ArrayList"><value>Rust</value><value>666666</value></util:list></property><property name="properties"><props><prop key="name">Rust</prop><prop key="value">777777</prop></props></property><property name="arr"><array><value>123456</value><value>654321</value></array></property><property name="hs"><util:set set-class="java.util.HashSet"><value>Rust</value><value>666666</value></util:set></property><property name="hm"><util:map map-class="java.util.HashMap"><entry key="name" value="icpc123"/><entry key="value" value="666icpc"/></util:map></property></bean>
</beans>

Spring-IOC配置(XML格式)-依赖注入相关推荐

  1. Spring IoC是如何进行依赖注入的

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 依赖注入(DI) DI(Dependency Injection) ...

  2. Spring(二)--------Spring配置、DI依赖注入、Bean自动装配

    Spring(二)--------Spring配置.DI依赖注入.Bean自动装配 5.Spring配置 5.1 别名 设置别名:第一种方式alias <!--其中name为ID的对应值--&g ...

  3. Spring源码系列:依赖注入(二)createBean

    在Spring源码系列:依赖注入(一)(AbstractBeanFactory-getBean)最后说道getBean是依赖注入的起点,bean的创建都是通过createBean来完成具体的创建的.c ...

  4. IOC控制反转(依赖注入思想)

    IOC控制反转(依赖注入思想) 获取map 类型的 request session application 的方法: 实现RequestAware,SessionAware,ApplicationAw ...

  5. SSM框架—Spring基础—控制反转和依赖注入(概念)

    控制反转: 控制反转(IoC)是面向对象编程的一个设计原则,用于降低代码耦合度 在传统面向对象编程中,获取对象的方式是用关键字"new"主动创建一个对象,也就是说,应用程序掌握着对 ...

  6. java json injection_Java Web实现IOC控制反转之依赖注入

    控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依赖注入 ...

  7. spring常用的三种依赖注入方式

    平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...

  8. 依赖注入的三种方式_Spring IoC是如何进行依赖注入的

    依赖注入(DI) DI(Dependency Injection),Spring IoC 不是一种技术,而是一种思想,通过这种思想,能够指导我们设计出松耦合的程序代码.而Spring IoC这个思想的 ...

  9. Spring的控制反转与依赖注入

    学习过Spring的都知道Spring有三大核心的概念,分别是控制反转(IOC).依赖注入(DI)和面向切面编程(AOP).今天就来聊聊我对控制反转和依赖注入的了解,至于面向切面编程放到后面讲解. 一 ...

最新文章

  1. android 系统锁屏音乐播放器,Android实现音乐播放器锁屏页
  2. Django 各类配置选项全集
  3. leetcode 146.缓存机制(中等)
  4. 如何加速云原生数据应用?这个开源项目备受关注
  5. 电脑硬件故障的几种简单检查方法
  6. boost::hana::make_pair用法的测试程序
  7. matlab 线性拟合polyfit_从零开始的matlab学习笔记——(24)曲线拟合
  8. Android 图片选择器、图片剪切,文件选择器
  9. 5G 落地进入爆发期,是时候让毫米波登场了
  10. 转:VMware、微软等四种主要的网络IO虚拟化模型
  11. Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法
  12. 配置eclipse反编译
  13. 赋能房地产科技生态,“城越”加速器首期计划正式开启
  14. 你真的不了解我的痛楚,请不要瞎说
  15. Interactive Speech and Noise Modeling for Speech Enhancement
  16. hive基本用法及细节记录
  17. 计算机 绘图 教案,计算机绘图2教案.doc
  18. 展翅翱翔之时 (はばたきのとき)
  19. ZEMAX知识点:景深概念及计算公式推导
  20. Flutter App感染a.gray.Bulimia.a病毒

热门文章

  1. C语言 二级 通过率,2019计算机二级通过率是多少 考试科目有哪些
  2. Xshell的下载与使用
  3. 笔加学堂 | 破解35岁职业黑洞,你可以尝试着这么做!
  4. 第7章第7节:排版的四项基本原则:对比性原则之远近的对比 [PowerPoint精美幻灯片实战教程]
  5. 从“力拓集团”泄密事件看企业内部信息安全建设
  6. PCM音频文件(.wav)压缩成ADPCM(.wav) ,wav文件分析,wav 文件格式
  7. 【Thrift】Thrift框架和使用教程-- C/S框架使用教程
  8. 计算机作业批改,通用作业批改系统计算机.doc
  9. js对象继承的方式-三种 +三种
  10. Windows10将于12月13日停止服务!