Spring:(二)DI依赖注入方式
DI 依赖注入
DI(Dependency Injection)依赖注入,说简单一点就将类里面的属性在创建类的过程中给属性赋值,即将对象依赖属性(简单值,集合,对象)通过配置设值给该对象。
属性注入的方式
- 构造方法的方式
- set方法的方式
- 工厂方法注入
主要学习前两种方式
构造方法的方式
当是构造方法时注入Bean的属性值(简单值,集合,对象)
利用<constructor-arg>标签进行属性的注入
name:被设置属性的名
value:被设置属性的值
编写用构造方法的pojo
package spring_test1.pojo;
public class UserConstructor {
private String name;
private int id;
public UserConstructor(String name, int id) {
super();
this.name = name;
this.id = id;
}
@Override
public String toString() {
return "User_constructor [name=" + name + ", id=" + id + "]";
}
}
XML配置编写
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- Spring构造方法注入 -->
<bean name="user_cons" class="spring_test1.pojo.UserConstructor">
<constructor-arg name="name" value="Roy"/>
<constructor-arg name="id" value="1001"/>
</bean> </beans>
编写测试类
package spring_test1.test; import static org.junit.Assert.*; import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import spring_test1.pojo.UserConstructor; public class UserConstructorTest { @Test
public void test() {
//创建Spring的工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//得到User对象
UserConstructor userConstructor = (UserConstructor) applicationContext.getBean("user_cons");
System.out.println(userConstructor);
}
}
运行结果

set方法的方式
我在Spring:(一)那一篇中的第一个Spring程序便是set方法时的属性注入方式
利用<property>标签
name:被设置属性的名
value:被设置属性的值
标准XML格式
编写pojo
package spring_test1.pojo; /**
* @author jyroy
*
*/
public class User {
private String name;
private int id; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "User [name=" + name + ", id=" + id + "]";
}
}
编写XML配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--Spring的set方法的属性注入-->
<bean name="user" class="spring_test1.pojo.User">
<property name="name" value="李东"/>
<property name="id" value="1007" />
</bean> </beans>
编写测试类
package spring_test1.test; import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import spring_test1.pojo.User; public class UserTest { @Test
public void demo1() {
//创建Spring的工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//得到User对象
User user = (User) applicationContext.getBean("user");
System.out.println(user);
}
}
运行结果

p命名空间的方式
看上面的XML配置,似乎用<property/>标签还是比较臃肿。
于是从2.0开始,Spring支持使用名称空间的可扩展配置格式。这些名称空间都是基于一种XML Schema定义。p命名空间就可以用bean 元素的属性代替<property/>元素。
还需要在使用p命名空间时先声明使用对应的命名空间,即在bean元素上添加 xmlns:p="http://www.springframework.org/schema/p"
1 <!-- p命名空间的方式 -->
<bean id="user" class="spring_test1.pojo.User" p:name="Roy" p:id="1004"></bean>
c命名空间的方式
C命名空间与p命名空间类似,但是使用c命名空间可以用内联的构造参数代替嵌套的constructor-arg元素
同样先声明使用对应的命名空间,即在bean元素上添加 xmlns:c="http://www.springframework.org/schema/c"
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 标准XML格式 -->
<bean id="foo" class="x.y.Foo">
<constructor-arg name="bar" ref="bar"/>
<constructor-arg name="baz" ref="baz"/>
<constructor-arg name="email" value="foo@bar.com"/>
</bean> <!-- c命名空间格式 -->
<bean id="foo" class="x.y.Foo" c:bar-ref="bar" c:baz-ref="baz" c:email="foo@bar.com"/> <!-- 还可以使用c命名空间的参数索引格式 -->
<bean id="foo" class="x.y.Foo" c:_0-ref="bar" c:_1-ref="baz" c:_2="foo@bar.com"/> </beans>
SpEL表达式方式
Spring 表达式语言 (Spring Expression Language),打算整理完整的一篇
集合类型属性注入
<bean id="collectionBean" class="com.roy.spring.demo5.CollectionBean">
<!-- 数组类型 -->
<property name="arrs">
<list>
<value>数组一</value>
<value>数组二</value>
</list>
</property>
<!-- 注入list集合类型 -->
<property name="list">
<list>
<value>list一</value>
<value>list二</value>
</list>
</property> <!-- 注入set集合类型-->
<property name="set">
<set>
<value>set一</value>
<value>set二</value>
</set>
</property> <!-- 注入Map集合 -->
<property name="map">
<map>
<entry key="aaa" value="111"></entry>
<entry key="bbb" value="222"></entry>
<entry key="ccc" value="333"></entry>
</map>
</property> <!-- 注入property集合 -->
<property name="properties">
<props>
<prop key="key1">value1</prop>
<prop key="key2">value2</prop>
<prop key="key3">value3</prop>
</props>
</property>
</bean>
Spring:(二)DI依赖注入方式的更多相关文章
- spring四种依赖注入方式(转)
spring四种依赖注入方式!! 平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提 ...
- 3、Spring的DI依赖注入
一.DI介绍 1.DI介绍 依赖注入,应用程序运行依赖的资源由Spring为其提供,资源进入应用程序的方式称为注入. Spring容器管理容器中Bean之间的依赖关系,Spring使用一种被称为&qu ...
- spring几种依赖注入方式以及ref-local/bean,factory-bean,factory-method区别联系
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...
- spring六种种依赖注入方式
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...
- spring 四种依赖注入方式以及注解注入方式
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...
- 给力啊!这篇Spring Bean的依赖注入方式笔记总结真的到位,没见过写的这么细的
1. Bean的依赖注入概念 依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现.在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是 ...
- Spring:DI依赖注入的几种方式
据我所学,spring实现依赖注入(DI)的方式分为三大类:基于构造器(构造方法)的依赖注入.基于setter的依赖注入.其他方式(c命名空间.p命名空间等).其中推荐使用setter方法注入,这种注 ...
- Spring IOC(DI)之注入方式
一次被问到IOC的注入方式,当时脑袋一阵混乱,不知道噻.于是google了一下,发现众说纷纭,有说三种的,有说四种的.都滚犊子吧,还是看看官方文档吧. DI exists in two major v ...
- spring四种依赖注入方式
一.Set注入 这是最简单的注入方式,假设有一个SpringAction,类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然后创建SpringD ...
随机推荐
- Python2和Python3比较分析
一直有看到网上有讨论Python2和Python3的比较,最近公司也在考虑是否在spark-python大数据开发环境中升级到python3.通过本篇博文记录Python2.7.13和Pthon3.5 ...
- Linux安装mysql(Redhat6.5+MySQL5.7)(转载+原创补漏)
一.下载 这里我创建了一目录software用于存放我们待会要下载的mysql包,先去到该目录 命令:cd /software命令:wget http://mirrors.sohu.com/mysql ...
- java项目获取根路径(web项目和application项目的区分)
Java项目中经常要读取配置文件,涉及到读取配置文件的地方,就会要读定位文件的路径.因此,在项目如何正确获取文件路径尤为关键. 根据不同的java项目,在获取文件路径时候有一些 小区别 测试环境:E: ...
- HTML结构及基础语法
一.HTML结构 <!DOCTYPE html><html lang="en"><head> <meta charset="UT ...
- Python_zip&rar
import zipfile fp=zipfile.ZipFile('/Users/c2apple/Desktop/彩屏/旭威XW-6600.zip','r') for f in fp.filelis ...
- form表单发送请求实例
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncodi ...
- 2017年Kali Linux更新源
终端输入: leafpad /etc/apt/sources.list 打开更新源配置文件,将下面的更新源复制到原内容的前面: #163网易 Kali源 deb http://mirrors.163. ...
- 在Windows下同时安装Python2.x和Python3.x
前言: Python现在是两个版本共存,Python2.x和Python3.x都同时在更新.但是Python2.x和Python3.x的区别还是很多的(以后我可能会写一篇文章列举一下Python2.x ...
- c# xml操作(一)
c# xml操作(一) 此博文包含图片 (-- ::)转载▼ 标签: 杂谈 分类: c# 同样是增,删,改,查四种操作.现在我们就详细介绍一下增和删两种操作.看下面的一个xml示例: <?xml ...
- mongodb的设计特征
MongoDB 的设计目标是高性能.可扩展.易部署.易使用,存储数据非常方便.其主要功能特性如下. (1)面向集合存储,容易存储对象类型的数据.在MongoDB 中数据被分组存储在集合中,集合类似 ...