Spring之DI注入方式
什么是DI?
DI(Dependency Injection)依赖注入,指容器复制创建和维护对象之间的依赖关系,而不是通过对象本身复制自己的创建和解决自己的依赖。控制反转是通过依赖注入实现的。
依赖注入这个词从让人望而生畏,已经演变成一项复杂的编程技巧或设计模式理念。但依赖注入并不像它听上去那么复杂。在项目中应用DI,代码会变得异常简单并且更容易理解和测试(简单,易理解,易测试)。
任何一个有实际意义的应用都会由两个或者更多的类组成,这些类之间相互之间进行协作来完成特定的的业务逻辑。按照传统做法,每个对象负责管理与自己相互协作的的对象(即它所依赖的对象)的引用,这将会导致高度耦合和难以测试。耦合具有两面性:一方面紧密耦合的代码难以测试,难以复用、难以理解,并且典型地表现“打地鼠”式的bug特性。另一方面一定程度的耦合又是必须的。
通过DI,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。对象无需自行的创建或管理它们的依赖关系。DI带来的最大的收益是——松耦合。其次是面向接口依赖的可替换(最常用的是测试的时候使用mock实现),那么在Spring中怎么实现的?创建应用组件之间的协作方式通常称为装配(wiring)。
怎么实现DI?
1.通过构造器实现注入
前提:被注入的类中必须提供所需的构造方法。
(如果对象是Java内部的简单类型等,可以直接设置value)
<bean id="hUser" class="com.openlab.homework1.User"><constructor-arg index="0" value="张嘎"></constructor-arg><constructor-arg index="1" value="三天不打鬼子,手都痒痒" ></constructor-arg></bean>
(对象类型可以依赖ref注入)
<bean id="userService" class="com.oupeng.service.impl.UserServiceImpl"> <constructor-arg index="0"> <ref bean="userdao"/> </constructor-arg> <constructor-arg index="1" type="String"> <value>我是一个小小的小鸟...</value> </constructor-arg> </bean>
使用构造器注入时,注意最好在标签内声明Index指定注入的是哪个参数。
2.通过Setter实现注入
我们现在有一个TestEntity类,里面的属性如下所有set方法已经提供,注意通过setter注入必须提供对应的set方法。
public class TestEntity {private String char1;private String char2;private User innerBean;private List<String> list;private String[] arr;private Set<String> set;private Map<String,String> map;private Properties properties;private String emptyString;private String nullString;
<bean id="testEntity" class="com.openlab.pojo.TestEntity"><property name="char1" value="H&H" ></property>//&符号具有特殊含义通过&进行转义<property name="char2"><value><![CDATA[h&h]]></value>//也可以通过<![CDATA[h&h]]>进行取值</property><property name="innerBean" ><bean class="com.openlab.pojo.User"><property name="id" value="1001"></property><property name="username" value="执金吾"></property><property name="sign" value="剑来"></property></bean></property>//对象类型可以通过配置bean或者已经装配了bean可以通过ref标签引用<property name="list"><list><value>赵云</value><value>关羽</value><value>张飞</value><value>黄总</value><value>马超</value></list></property><property name="arr"><array><value>夏侯惇</value><value>典韦</value><value>夏侯渊</value><value>司马懿</value><value>曹彰</value></array></property><property name="set"><set><value>孙策</value><value>孙权</value><value>周瑜</value><value>张昭</value><value>吕蒙</value></set></property><property name="map"><map>//map注意每一个键值对是一个entry,entry包含key和value<entry><key><value>曹操</value></key><value>曹孟德</value></entry><entry><key><value>刘备</value></key><value>刘玄德</value></entry><entry><key><value>孙权</value></key><value>孙仲谋</value></entry></map></property><property name="properties"><props><prop key="魏国">曹丕</prop><prop key="蜀国">刘备</prop><prop key="吴国">孙权</prop></props></property><property name="emptyString"><value></value></property><property name="nullString"><null></null></property></bean>
基于setter的p命名空间注入
p命名空间额注入方式是基于setter的,有以下两种格式。
- 简单类型:p:属性名=属性值
- bean类型:p:属性名-ref = 属性值
<bean id="dog" class="com.openlab.pojo.Dog" p:name="二哈" p:sex="雌性" p:varieties="哈士奇" p:age="1"><!--<property name="name" value="二哈" />--><!--<property name="sex" value="雌性"/>--><!--<property name="varieties" value="哈士奇"/>--></bean>
<bean id="userService" class="com.openlab.service.impl.UserServiceImpl" p:userDao-ref="userDao">
3.基于接口的DI注入
该点后续更新~
Spring之DI注入方式相关推荐
- spring 常用的注入方式有哪些?
spring 常用的注入方式有哪些? 1.xml中配置 bean 的申明.注册 节点注册 bean 节点的 factory-bean 参数指工厂 bean,factory-method 参数指定工厂方 ...
- Spring Bean 的注入方式
DI 注入 一. 传统的注入方式 通过bean标签方式注入 通过包扫描的方式注入 二. 注解方式配置注入 @Configuration 与 @Bean 注解方式注入 @ComponentScan 包扫 ...
- spring(一):spring IoC的注入方式总结
前言:谈谈对springIOc的理解,两张图很好的阐述了springIoc容器的作用. 传统应用程序示意图.jpg IoC容器后程序结构示意图.jpg springIoC容器注入方式有set注入,构造 ...
- 依赖注入的三种方式_一起学Spring之三种注入方式及集合类型注入
本文主要讲解Spring开发中三种不同的注入方式,以及集合数据类型的注入,仅供学习分享使用,如有不足之处,还请指正. 概述 Spring的注入方式一共有三种,如下所示: 通过set属性进行注入,即通过 ...
- spring三种注入方式
设置Spring的作用域 或者使用枚举值设置 单例和多里使用场景 自动注入 @Primary 一个接口有多个实现被spring管理吗,在依赖注入式,spring会不知道注入哪个实现类就会抛出NoUni ...
- 【Spring】- 属性注入方式
2019独角兽企业重金招聘Python工程师标准>>> House类:只有一个People属性,验证引用的ref引用bean的set方法注入方式 package com.zhiwei ...
- spring中依赖注入方式总结
文章来源于今日头条用户:分布式系统架构 一.注解注入 注解注入在Spring中是用的最多的一种方式,就是在java代码中使用注解的方式进行装配,在代码中加入@Resource或者@Autowired. ...
- spring的依赖注入方式
spring的依赖注入两种方式:Setter-based Dependency Injection(set方法去注入) 和 Constructor-based Dependency Injection ...
- Spring 三种注入方式
1.设置注入 先写demo代码 Uer.java public class User {private String username;private String password;public S ...
最新文章
- led灯bin值_「技术贴」如何判断LED透明屏正发光与侧发光的优劣?
- python 画希尔伯特曲线
- Machine Learning week 9 quiz: programming assignment-Anomaly Detection and Recommender Systems
- VTK:几何对象之PlaneSource
- 软件测试度量计算方法有哪些,软件测试度量(三)
- 信息学奥赛一本通(2057:【例3.9 】星期几)
- Nginx 快速安装手册及如何修改端口号
- 混合云是趋势?阿里云与私有云厂商 ZStack合作
- 项目规划管理 - 5
- JAVA实战项目--文章发布系统
- 区分级数收敛和数列收敛
- Linux -- 代理服务器(Squid Server)的配置与应用1
- python公式_python公式大全
- openssh和openssl下载网址
- spring源码深度解析系列——环境搭建丢失spring-cglib-repack-3.2.8.jar和spring-objenesis-repack-3.0.1.jar的解决办法
- 压缩和解压缩文件(十一)
- 2M口、电口、以太网电口、以太网光口的区别
- 迈拓恢复出厂设置图解_迈拓维矩电脑切换器使用方法?
- 计算机和建筑学薪资待遇区别,工科中薪资待遇最高、女生最多、毕业后竞争最激烈的前两名专业!...
- 本人在上海,做java3年了,最近在找工作,一言难尽
热门文章
- 焱融看|混合云环境下,如何实现数据湖最优存储解决方案
- Linux进程管理工具_Supervisor的安装与配置
- Security+知识点
- 弗洛伊德,迪杰斯特拉算法
- 驱动程序为什么要做WHQL认证
- 如何学习Android及如何利用android来赚钱
- 西门菲莎大学计算机专业怎么样,西门菲莎大学排名如何?位居全球前300且颇负盛名...
- HTML绘制齿轮,使用css3制作齿轮loading动画效果
- 终极解决Excel科学计数、日期变#号等问题
- at指令 meid_常用AT指令集 (转)