Spring 依赖注入(DI) 的三种方式 和 对集合类型的注入

时间:2022-06-08 23:15:18
// 分别省略了getter  setter
public class Student {
private String name;
private int age;
private Teacher teacher;
} public class Teacher {
private String tno;
private String name;
}
<bean id="teacher" class="com.DO.Teacher">
<property name="tno" value="123"></property>
<property name="name" value="ls"></property>
</bean>

1、set方式注入(利用反射):

<bean id="student" class="com.DO.Student">   //调用类的无参构造器
<property name="name" value="zxf"></property> // 调用对应属性的set方法
<!-- <null/> 给属性赋 null
<property name="name">
<null/>
</property> -->
<property name="age">
  <value>22</value>
</property>
<property name="teacher" ref="teacher"></property>
</bean>

注意:

Spring 依赖注入(DI) 的三种方式 和 对集合类型的注入

2、通过构造器注入:

<bean id="student" class="com.DO.Student">
<!-- 根据参数的个数 会去调用相应的构造器 也可以通过索引指定 index 从0开始 也可以通过name指定参数名 或者指定参数的类型type -->
<constructor-arg value="zs"></constructor-arg>
<constructor-arg value="23"></constructor-arg>
<constructor-arg ref="teacher"></constructor-arg>
</bean>

3、p命名空间:

引入p命名空间:

xmlns:p="http://www.springframework.org/schema/p"

<bean id="student" class="com.DO.Student" p:name="zs" p:age="22" p:teacher-ref="teacher"></bean>

自动装配:

Spring 依赖注入(DI) 的三种方式 和 对集合类型的注入

byName:属性 与 bean的id 相同就自动装配

byType:属性 与 bean的类型(class="") 相同就自动装配

可以把所有的bean都设置成自动装配: 在命名空间里添加: default-autowire="defalut"

自动装配会减少代码量,但是胡降低可读性

<bean id="student" class="com.zxf.DO.Student" autowire="byName">
<property name="name" value="zs"></property>
<property name="age" value="22"></property>
<!-- 自动装配: 如果 该bean的属性 与 某个bean的id相同就会自动装配 student的teacher属性 与 id="teacher" 相匹配
byName 的本质是 byId
-->
</bean>

SpringIOC容器负责创建Bean

依赖注入:set方式注入: 把属性值注入给属性,把属性注入给对象。

通过构造器注入:调用相应的构造器,然后把value值注入进去。

p命名空间: 即使用p命名空间注入属性值。

控制反转:反转了用户获取对象的方式,从new (创建) --> get(直接拿)

对集合类型的注入:

// 省略了对应的getter setter
public class ALLCollection {
private List listElement;
private String[] arrayElement;
private Set setElement;
private Map mapElement;
private Properties propsElement;
}
<bean id="collection" class="com.zxf.DO.ALLCollection">
<property name="listElement">
<list>
<value>list苹果</value>
<value>list香蕉</value>
</list>
</property>
<property name="arrayElement">
<array>
<value>array苹果</value>
<value>array香蕉</value>
</array>
</property>
<property name="setElement">
<set>
<value>set苹果</value>
<value>set香蕉</value>
</set>
</property>
<property name="mapElement">
<map>
<entry>
<key><value>map1</value></key>
<value>map苹果</value>
</entry>
<entry>
<key><value>map2</value></key>
<value>map香蕉</value>
</entry>
</map>
</property>
<property name="propsElement">
<props>
<prop key="prop1">prop苹果</prop>
<prop key="porp2">prop香蕉</prop>
</props>
</property>
</bean>

Spring 依赖注入(DI) 的三种方式 和 对集合类型的注入的更多相关文章

  1. 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比

    [原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...

  2. Spring的依赖注入(DI)三种方式

    Spring依赖注入(DI)的三种方式,分别为: 1.  接口注入 2.  Setter方法注入 3.  构造方法注入 下面介绍一下这三种依赖注入在Spring中是怎么样实现的. 首先我们需要以下几个 ...

  3. Spring学习(二)三种方式的依赖注入

    1.前言 上一篇讲到第一个Spring项目的创建.以及bean的注入.当然.注入的方式一共有三种.本文将展开细说. 1.set注入:本质是通过set方法赋值 1.创建老师类和课程类 1.Course ...

  4. 【Spring】Spring之向 IOC 容器注入对象的三种方式

    关于Spring的搭建可参见:浅析Spring框架的搭建.在测试之前还是应该先将环境配置好,将相关Jar包导进来.Spring创建的对象,默认情况下都是单例模式,除非通过scope指定. 向IOC容器 ...

  5. Spring中bean实例化的三种方式

    之前我已经有好几篇博客介绍Spring框架了,不过当时我们都是使用注解来完成注入的,具体小伙伴可以参考这几篇博客(Spring&SpringMVC框架案例).那么今天我想来说说如何通过xml配 ...

  6. Spring Boot应用启动的三种方式

    Spring Boot应用HelloWorld的三种启动方式: 项目的创建可以在http://start.spring.io/网站中进行项目的创建. 首先项目结构: 1.  通过main方法的形式启动 ...

  7. 框架源码系列九:依赖注入DI、三种Bean配置方式的注册和实例化过程

    一.依赖注入DI 学习目标1)搞清楚构造参数依赖注入的过程及类2)搞清楚注解方式的属性依赖注入在哪里完成的.学习思路1)思考我们手写时是如何做的2)读 spring 源码对比看它的实现3)Spring ...

  8. spring入门 依赖入注的三种方式(1)

    第一种:构造器参数注入 第二种:setter方法属性注入(setter方法的规范-JavaBean规范) 第三种:接口注入 Bean 属性的注入:对一个对象的属性的赋值 1.构造器参数注入: publ ...

  9. Spring容器装配Bean的三种方式

    欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...

随机推荐

  1. swfupload使用说明

    网上的例子介绍的文档真的很多.下面简单介绍一下 SWFUpload的文件上传流程是这样的: 1.引入相应的js文件 2.实例化SWFUpload对象,传入一个配置参数对象进行各方面的配置. 3.点击S ...

  2. PAT 天梯赛 L1-009 N个数求和

    模拟题 题目链接 题解 每次将两个分数进行相加,到最后再将结果化成带分数.主要考察的最大公约数与最小公倍数. 代码如下: #include<cstdio> #include<cstd ...

  3. 阿里云CentOS部署小笔记

    快毕业了,我用近两周的时间完成了一个nodeJs+Vue-Cli+Mysql的毕业设计,到了部署的时候了. 然而,博主使用Linux的经验有限得很,所以只能自己慢慢地填坑了. 一.准备工作 1)阿里云 ...

  4. &lt&semi;Android基础&gt&semi; &lpar;七)内容提供器

    第七章 内容提供器 7.1 内容提供器(Content Provider) 主要应用于在不同的应用程序之间实现数据共享功能.允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性. 7.2 ...

  5. javascript节点移除

    var itemdel = document.getElementById("test"); itemdel.removeChild(lis[0]); 兼容性较好 itemdel. ...

  6. VIM编辑器和VI编辑器的区别

    vi 和vim 的区别 写在前面:这个两个"东西"着实让我烦恼一阵子,但是自己一直没当回事,但是遇到了好几次再决定彻底把他们搞的明白,一下是我通过查找资料了解到的关于这两个编辑器的 ...

  7. Eclipse 文件太长,导致着色异常问题

    1. 把C/C++ ->Editor->Scalability, 对应红框中的数字调大.

  8. AMD 与CMD

    AMD AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义".它采用异步方式加载模块,模块的加载不影响它后面 ...

  9. Machine Learning——吴恩达机器学习笔记(酷

    [1] ML Introduction a. supervised learning & unsupervised learning 监督学习:从给定的训练数据集中学习出一个函数(模型参数), ...

  10. 日期插件kalendae,遇到的一些问题

    1.日期中文显示 /*_months : 'January_February_March_April_May_June_July_August_September_October_November_D ...