据我所学,spring实现依赖注入(DI)的方式分为三大类:基于构造器(构造方法)的依赖注入、基于setter的依赖注入、其他方式(c命名空间、p命名空间等)。其中推荐使用setter方法注入,这种注入方式也是最多人使用的。

下面我们通过代码来举例三种注入方式:

1.基于构造器(构造方法)的依赖注入

这种方式是通过实体类中的构造方法来完成属性的赋值,所以实体类中必须含有带参的构造方法!

首先先编写实体类User,如下:

public class User {
private int id;
private String name;
private int age;
private String pwd; public User() {
}
public User(int id, String name, int age, String pwd) {
this.id = id;
this.name = name;
this.age = age;
this.pwd = pwd;
System.out.println("User的全参构造");
} @Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", pwd='" + pwd + '\'' +
'}';
}
}

然后我们就可以编写配置文件了,一共有三种方式,这三种方式都是一样的,掌握一种便可以了,推荐使用方式一。

方式一:通过属性名称赋值

    <bean id="user" class="com.kuang.pojo.User">
<constructor-arg name="id" value="0000"/>
<constructor-arg name="age" value="21"/>
<constructor-arg name="pwd" value="123456"/>
<constructor-arg name="name" value="张三"/>
</bean>

方式二:通过下标赋值

注意:这里index就是实体类中属性的索引,从0开始,实体类中从上到下第一个属性的索引为0,第二个属性的索引为1....以此类推。

    <!--通过下标赋值-->
<bean id="user" class="com.kuang.pojo.User">
<constructor-arg index="0" value="0000"/>
<constructor-arg index="1" value="张三"/>
<constructor-arg index="2" value="21"/>
<constructor-arg index="3" value="123456"/>
</bean>

方式三:通过类型赋值

    <bean id="user" class="com.kuang.pojo.User">
<constructor-arg type="int" value="0000"/>
<constructor-arg type="java.lang.String" value="张三"/>
<constructor-arg type="int" value="21"/>
<constructor-arg type="java.lang.String" value="123456"/>
</bean>

2.基于setter的依赖注入

这种方式是通过实体类中的setter方法来完成属性的赋值的,所以实体类中必须有各个属性的setter方法!

Student实体类如下:

public class Student {
private String name;
private Address address;
private String[] books;
private List<String> hobbys;
private Map<String,String> card;
private Set<String> game;
private String wife;
private Properties info; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Address getAddress() {
return address;
} public void setAddress(Address address) {
this.address = address;
} public String[] getBooks() {
return books;
} public void setBooks(String[] books) {
this.books = books;
} public List<String> getHobbys() {
return hobbys;
} public void setHobbys(List<String> hobbys) {
this.hobbys = hobbys;
} public Map<String, String> getCard() {
return card;
} public void setCard(Map<String, String> card) {
this.card = card;
} public Set<String> getGame() {
return game;
} public void setGame(Set<String> game) {
this.game = game;
} public String getWife() {
return wife;
} public void setWife(String wife) {
this.wife = wife;
} public Properties getInfo() {
return info;
} public void setInfo(Properties info) {
this.info = info;
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", address=" + address +
", books=" + Arrays.toString(books) +
", hobbys=" + hobbys +
", card=" + card +
", game=" + game +
", wife='" + wife + '\'' +
", info=" + info +
'}';
}
}

代码过长就折叠了

Address实体类如下:

public class Address {
private String address; public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} @Override
public String toString() {
return "Address{" +
"address='" + address + '\'' +
'}';
}
}

配置文件的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="Address" class="com.kuang.pojo.Address">
    <property name="address" value="北京"/>
  </bean>
    <bean id="student" class="com.kuang.pojo.Student">
<property name="name" value="张三"/>
<property name="address" ref="Address" /> <property name="books">
<array>
<value>红楼梦</value>
<value>西游记</value>
<value>水浒传</value>
<value>三国演义</value>
</array>
</property> <property name="hobbys">
<list>
<value>游泳</value>
<value>跑步</value>
<value>爬山</value>
</list>
</property> <property name="card">
<map>
<entry key="身份证" value="123456789987654"/>
<entry key="银行卡" value="654873264654879"/>
</map>
</property> <property name="game">
<set >
<value>英雄联盟</value>
<value>王者荣耀</value>
<value>穿越火线</value>
</set>
</property> <property name="wife" >
<null/>
</property> <property name="info">
<props>
<prop key="学号">1665487956</prop>
<prop key="性别">男</prop>
<prop key="姓名">小明</prop>
</props>
</property>
</bean> </beans>

3.其他方式(c命名空间、p命名空间等)

Spring:DI依赖注入的几种方式的更多相关文章

  1. Spring中依赖注入的四种方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...

  2. Spring IOC 依赖注入的两种方式XML和注解

    依赖注入的原理 依赖注入的方式---XML配置 依赖注入的方式---注解的方式 Spring 它的核心就是IOC和AOP.而IOC中实现Bean注入的实现方式之一就是DI(依赖注入). 一 DI的原理 ...

  3. Spring注解依赖注入的三种方式的优缺点以及优先选择

    当我们在使用依赖注入的时候,通常有三种方式: 1.通过构造器来注入: 2.通过setter方法来注入: 3.通过filed变量来注入: 那么他们有什么区别吗?应该选择哪种方式更好? 三种方式的区别小结 ...

  4. spring的依赖注入的四种方式,数组与集合注入;引用注入;内部bean注入

    三种注入方式 第一种: 基于构造函数 hi.java (bean) package test_one; public class hi { private String name; public hi ...

  5. Spring的依赖注入的2种方式(1天时间)

    今天花了一天的时间才调试出来 private      接口   实现类的那个bean; 最后面的那个名字不能随便的写,必须是配置文件中,实现类的那个bean 就是后面的那个名字写错了,花了整整一天 ...

  6. spring Di依赖注入

    依赖注入有两种方式 通过 get   set 方法 Person.java package cn.itcast.spring.sh.di.set; import java.util.List; imp ...

  7. 峰Spring4学习(2)依赖注入的几种方式

    一.装配一个bean 二.依赖注入的几种方式 com.cy.entity   People.java: package com.cy.entity; public class People { pri ...

  8. ASP.NET MVC中使用Unity进行依赖注入的三种方式

    在ASP.NET MVC中使用Unity进行依赖注入的三种方式 2013-12-15 21:07 by 小白哥哥, 146 阅读, 0 评论, 收藏, 编辑 在ASP.NET MVC4中,为了在解开C ...

  9. SSH深度历险记(八) 剖析SSH核心原则+Spring依赖注入的三种方式

           于java发育.一类程序猿必须依靠类的其他方法,它是通常new依赖类的方法,然后调用类的实例,这样的发展问题new良好的班统一管理的例子.spring提出了依赖注入的思想,即依赖类不由程 ...

随机推荐

  1. Linux获取权限

    目录 Bash反弹shell Python反弹shell 写入命令到定时任务文件 写入SSH公钥 写入/etc/profile文件 当我们可以在远程Linux主机上执行任意命令或写入任意数据到任意文件 ...

  2. GDOI2021 游记

    蹭了个名额去参加 \(\text{GDOI}\) \(\text{tg}\),体验了一下大佬的生活/kk (以下试题皆为 \(\text A\) 卷 DAY -1 不知道要复习什么.本来没有机会来参加 ...

  3. 二、jmeter模拟请求头及监听器之结果树

    一.模拟请求头 利用jmeter发送http请求时,被接收的服务端会对发送的该请求进行初步判断,如果不是web端发送的请求就会被打回导致请求不通,这时候需要模拟请求头,模拟正常的用户行为进行发送请求 ...

  4. 006-Java的访问权限控制符和包导入机制

    目录 一.Java的访问权限控制符 一.访问控制符的作用 二.访问控制符的分类 二.Java的包导入机制 一.为什么要使用package? 二.package怎么用? 三.对于带有package的ja ...

  5. Spring Cloud Alibaba(9)---Sentinel概述

    Sentinel概述 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流.流量整形.熔断降级.系统自适应保护.热点防 ...

  6. 2020BUAA-个人博客-案例分析

    个人博客作业-软件案例分析 项目 内容 北航2020软工 班级博客 作业要求 具体要求 我的课程目标 通过案例分析提升自己对于软件工程的认识 课程收获 分析软件,了解软件的定位 第一部分 调研,评测( ...

  7. CRM系统全方位管理企业

    您在选择一款CRM系统的时候,首先要考虑销售团队的感受和意见.让CRM系统在帮助销售团队优化工作流程的同时,更好地对销售团队进行管理.销售人员每卖出一件商品,要从寻找筛选商机开始,经过沟通客户需求.满 ...

  8. [re模块、json&pickle模块]

    [re模块.json&pickle模块] re模块 什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则 ...

  9. CSS filter 有哪些神奇用途

    背景 基本概念 CSS filter 属性将模糊或颜色偏移等图形效果应用于元素形成滤镜,滤镜通常用于调整图像,背景和边框的渲染.它的值可以为 filter 函数 <filter-function ...

  10. 如何使用GoLand debug

    debug 常用操作 /* 如何使用 goland debug goroutine */ package main import ( "fmt" "runtime&quo ...