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 ...
随机推荐
- java float double精度为什么会丢失?浅谈java的浮点数精度问题 【转】
由于对float或double 的使用不当,可能会出现精度丢失的问题.问题大概情况可以通过如下代码理解: public class FloatDoubleTest { public static vo ...
- vue项目 构建 打包 发布 三部曲
一.vue项目的创建 1.首先第一肯定是要有Node.js及npm这个不多说了2.安装脚手架 此时可以直接浏览-但是现在肯定有很多小白想将他发布到gitHub上并可以浏览,使用vue全家桶制作自己的博 ...
- python new和init知识点
__new__ 方法是什么?如果将类比喻为工厂,那么__init__()方法则是该工厂的生产工人,__init__()方法接受的初始化参 数则是生产所需原料,__init__()方法会按照方法中的语句 ...
- Python接口测试之对MySQL/unittest框架/Requests 的操作
单元测试支持测试自动化. 共享的安装程序和关闭代码测试. 聚合成集合,测试和报告框架从测试的独立性.单元测试模块提供可以很容易地支持这些素质的一组测试的类.关于unittest 测试框架建议可以到官方 ...
- 【Lua】特性和一些基础语法
在Lua中,你可以使用单行注释和多行注释. 单行注释中,连续两个减号"--"表示注释的开始,一直延续到行末为止.相当于C++语言中的"//". 多行注释中,由& ...
- 并发容器之CopyOnWriteArraySet
CopyOnWriteArraySet是基于CopyOnWriteArrayList实现的,其唯一的不同是在add时调用的是CopyOnWriteArrayList的addIfAbsent方法. 具体 ...
- IE8中marquee不显示出滚动效果的解决办法
随着各种软件的升级,我们系统中的IE6也渐渐被淘汰了,目前主流的浏览器一半的用户已经从IE6直接升级到了IE8,虽然给用户更好的体验,上网更快更方便了,但是对网站制作来说,又是个比较麻烦的问题,因为很 ...
- Python实现Telnet自动连接检测密码
最近在学习Python网络相关编程,这个代码实现了Telnet自动连接检测root用户密码,密码取自密码本,一个一个检测密码是否匹配,直到匹配成功,屏幕输出停止. Python内置了telnetlib ...
- 如何设置PPT中的演讲者模式
①1.首先将投影设备或其它幻灯片输出设备连接到笔记本或 PC 上,在 Windows 7 中按Win 键+P 并选择扩展模式将当前笔记本或 PC 的显示器与投影显示输出设备设置为扩展模式. ②我们 ...
- python下如何安装.whl包?
下载 .whl 包 先 pip install wheel 之后 pip install 包名字.whl 即可安装某模块包