Spring-Day02-依赖注入-作业
- 配置beans约束自动提示
- spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html中打开xsd-configuration.html,拉到最下面,复制以下内容到主配置文件applicationContext.xml中
<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 http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
- 新建User类
package kong.spring.day02.pojo; public class User {
private String username;
private Integer age; public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
} @Override
public String toString() {
return "User [username=" + username + ", age=" + age + "]";
} }
- 在applicationContext.xml文件中将User类对象注入到Spring容器中,并通过set方法注入其属性值,set方式依赖注入标签为:property
<bean name="user" class="kong.spring.day02.pojo.User">
<property name="username" value="NulluN"/>
<property name="age" value="18"/>
</bean>
- 测试通过set方法进行普通值类型注入
package kong.spring.day02.test; import javax.annotation.Resource; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import kong.spring.day02.pojo.User; //使用RunWith注解帮我们创建用于JUnit测试的Spring容器
@RunWith(SpringJUnit4ClassRunner.class)
//通过注解加载applicationContext.xml文件,就可以省去下面测试中创建ClassPathXmlApplicationContext对象加载applicationContext.xml文件的代码
//指定容器创建时加载哪个配置文件
@ContextConfiguration("classpath:applicationContext.xml") public class DiTestDemo { //使用注解手动注入在applicationContext.xml文件中配置的user对象
@Resource(name = "user")
private User user; //使用JUnit测试在applicationContext.xml中配置的user对象的set方式依赖注入
@Test
public void testDiSet() {
// 直接打印user对象,通过调用toString方法即可测试set方式的依赖注入是否正确
System.out.println(user);
}
}
- 测试结果:通过配置文件的set方式注入成功
- 测试通过构造方法方式进行普通值类型注入,相关配置如下,构造方法依赖注入的标签为:constructor-arg
<bean name="car" class="kong.spring.day02.pojo.Car">
<constructor-arg name="carName" value="玛莎拉蒂"/>
<constructor-arg name="carPrice" value="1000000.00"/>
</bean>
- 测试代码如下:
// 使用注解自动注入在applicationContext.xml文件中配置的car对象
@Autowired
private Car car; // 使用JUnit测试在applicationContext.xml中配置的car对象的构造方法方式的依赖注入
@Test
public void testDiConstructor() {
// 直接打印car对象,通过调用toString方法即可测试构造方法方式的依赖注入是否正确
System.out.println(car);
}
- 测试结果:通过配置文件的构造方法方式注入普通值类型成功
- Bean的生命周期
- init-method:bean被初始化时执行的方法
- destroy-method:bean被销毁时执行的方法,执行销毁实例的方法,必须关闭ClassPathXmlApplicationContext容器对象时才会执行
- applicationContext.xml配置如下:
<!--
init-method:配置创建实例对象时执行的初始化方法,注意直接配置User类中相应的初始化方法的名字即可,不需要写括号
destroy-method:配置销毁实例对象时执行的销毁方法,注意直接配置User类中相应的销毁方法的名字即可,不需要写括号
-->
<bean name="user" class="kong.spring.day02.pojo.User" init-method="init" destroy-method="destroy">
<property name="username" value="NulluN"/>
<property name="age" value="18"/>
</bean>
- 测试代码如下:
// 使用注解手动注入在applicationContext.xml文件中配置的user对象
@Resource(name = "user")
private User user; // 测试Bean的生命周期
@Test
public void testBeanLifecycle() {
// 直接打印user对象
System.out.println(user);
}
- 测试结果如下:
- Bean的作用范围配置:scope属性
- singleton:单例,当没有配置Bean的scope属性时,默认是单例模式
- prototype:多例
- request:在web项目中,创建类的实例保存到request当中
- session:在web项目中,创建类的实例保存到session当中
- globalsession:相当于session(单点登录)
- 关于没有配置Bean的scope属性时,默认单例模式的测试,测试代码如下:
// 使用注解手动注入在applicationContext.xml文件中配置的user对象
@Resource(name = "user")
private User user1;
@Resource(name = "user")
private User user2;
// 测试Bean实例scope属性
@Test
public void testBeanSingletonOrPrototype() {
// 直接打印user对象
System.out.println("user1对象地址值:" + user1);
System.out.println("user2对象地址值:" + user2);
System.out.println("user1与user2是否为同一对象(单例模式):" + (user1==user2));
}
- 测试结果如下:
- 测试scope属性配置为prototype时的对象关系,测试代码与上面测试一样,测试结果如下:
- 引用(对象)类型依赖注入:用ref标签,注入格式为:ref="bean的id或name值"
- set方法引用类型依赖注入的配置如下:
<!-- 通过set方法注入user对象的普通值类型和引用类型 -->
<bean name="user" class="kong.spring.day02.pojo.User">
<!-- 普通值类型注入 -->
<property name="username" value="NulluN"/>
<property name="age" value="18"/>
<!-- 引用(对象)类型注入 -->
<property name="car" ref="car"></property>
</bean>
- set方法引用类型依赖注入的测试代码如下:
// 使用注解手动注入在applicationContext.xml文件中通过set方法依赖注入的user对象
@Resource(name = "user")
private User user1; // 测试引用(对象)类型的set方法依赖注入
@Test
public void testRefDi() {
// 直接打印user对象,看其引用类型属性是否注入成功
System.out.println(user1);
}
- 测试结果如下:car对象set注入成功
- 构造方法引用类型依赖注入的配置如下:
<!-- 通过构造方法注入user对象的普通值类型和引用类型 -->
<bean name="user_constructor" class="kong.spring.day02.pojo.User">
<!-- 普通值类型注入 -->
<constructor-arg name="username" value="空空"/>
<constructor-arg name="age" value="18"/>
<!-- 引用(对象)类型注入 -->
<constructor-arg name="car" ref="car"/>
</bean>
- 构造方法引用类型依赖注入的测试代码如下:
// 使用注解手动注入在applicationContext.xml文件中通过构造方法依赖注入的user_constructor对象
@Resource(name = "user_constructor")
private User user_constructor; // 测试引用(对象)类型的set方法依赖注入
@Test
public void testRefConstructorDi() {
// 直接打印user对象,看其引用类型属性是否注入成功
System.out.println(user_constructor);
}
- 测试结果如下:car对象构造方法注入成功
- p名称空间注入
- 复制xmlns="http://www.springframework.org/schema/beans" ,将其改成:xmlns:p="http://www.springframework.org/schema/p" ,就可以引入p标签进行p名称空间注入的配置了
- p名称空间的依赖注入配置如下:
<!-- 通过p名称空间注入user对象的普通值类型和引用类型 -->
<!--
普通值类型注入格式为:p:类属性="属性值"
引用类型注入格式为:p:类中引用类型属性-ref="引用类型的name或id"
-->
<bean name="user_p" class="kong.spring.day02.pojo.User" p:username="kong" p:age="18" p:car-ref="car"/>
- 测试代码如下:
// 使用注解手动注入在applicationContext.xml文件中通过p名称空间依赖注入的user_p对象
@Resource(name = "user_p")
private User user_p; // 测试p名称空间依赖注入
@Test
public void testPNameSpaceDi() {
// 直接打印user对象,看其通过p名称空间是否注入成功
System.out.println(user_p);
}
- 测试结果如下:p名称空间依赖注入普通值类型和引用类型成功
- SPEL(Spring EL表达式)依赖注入
- 不仅可以直接注入普通值类型和引用类型,还可以调用其它对象的属性和方法
- SPEL注入配置如下:
<bean name="user_p" class="kong.spring.day02.pojo.User" p:username="kong" p:age="18" p:sex="男" p:car-ref="car"/> <!-- 通过SPEL表达式注入user对象的普通值类型和引用类型 -->
<bean name="user_spel" class="kong.spring.day02.pojo.User">
<!-- 普通值类型注入 -->
<!-- 注意注入String类型时,要在注入值加'',即格式为#{'String类型值'},不然会报错! -->
<!-- 为user_spel对象的username属性直接注入String类型值 -->
<property name="username" value="#{'NulluN_SPEL'}"/>
<!-- 通过调用上面user_p对象的returnNumber()方法为user_spel对象注入其age属性-->
<property name="age" value="#{user_p.returnNumber()}"/>
<!-- 通过调用上面user_p对象的sex属性为user_spel对象注入其sex属性-->
<property name="sex" value="#{user_p.sex}"/>
<!-- 引用(对象)类型注入 注意:引用类型注入不是用ref,还是用value,格式为#{引用类型的name或id值}-->
<property name="car" value="#{car}"/>
</bean> <bean name="car" class="kong.spring.day02.pojo.Car">
<constructor-arg name="carName" value="玛莎拉蒂"/>
<constructor-arg name="carPrice" value="1000000.00"/>
</bean>
- 测试代码如下:
// 使用注解手动注入在applicationContext.xml文件中通过spel表达式依赖注入的user_spel对象
@Resource(name = "user_spel")
private User user_spel; // 测试SPEL表达式依赖注入
@Test
public void testSpelDi() {
// 直接打印user对象,看其通过spel表达式是否注入成功
System.out.println(user_spel);
}
- 测试结果:SPEL表达式注入普通值类型和引用类型、调用其它对象方法和属性都成功
- 复杂数据类型注入(数组、List、Set、Map)
- 复杂数据类型实体类如下:
package kong.spring.day02.pojo; import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set; public class CollectionInfo {
private String[] ary;
private List<String> list;
private Set<String> sets;
private Map<String, String> map; public String[] getAry() {
return ary;
}
public void setAry(String[] ary) {
this.ary = ary;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Set<String> getSets() {
return sets;
}
public void setSets(Set<String> sets) {
this.sets = sets;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
} @Override
public String toString() {
return "CollectionInfo [ary=" + Arrays.toString(ary) + ", list=" + list + ", sets=" + sets + ", map=" + map
+ "]";
}
}
- 配置如下:
<!-- 复杂数据类型注入 -->
<bean name="collection" class="kong.spring.day02.pojo.CollectionInfo">
<!-- 数组注入 -->
<property name="ary">
<array>
<value>曹操</value>
<value>郭嘉</value>
<value>曹丕</value>
</array>
</property>
<!-- List注入 -->
<property name="list">
<list>
<value>刘备</value>
<value>关羽</value>
<value>张飞</value>
</list>
</property>
<!-- Set注入 -->
<property name="sets">
<set>
<value>孙权</value>
<value>孙策</value>
<value>鲁肃</value>
</set>
</property>
<!-- Map注入 -->
<property name="map">
<map>
<entry key="a" value="袁绍"/>
<entry key="b" value="袁术"/>
<entry key="c" value="吕布"/>
</map>
</property>
</bean>
- 测试代码如下:
// 使用注解手动注入在applicationContext.xml文件中注入的collection对象
@Resource(name = "collection")
private CollectionInfo collection; // 测试复杂数据类型依赖注入
@Test
public void testCollectionDi() {
// 直接打印collection对象,看其是否注入值成功
System.out.println(collection);
}
- 测试结果:复杂数据类型值注入成功
- Spring的分模块化管理的配置
- 加载多个配置文件方式一:在代码中加载配置文件时加载多个配置文件
- 测试:将原来的applicationContext.xml文件中的复杂数据类型注入的配置剪切到另外一个中applicationContext2.xml的配置文件中,然后用如下代码同时加载这两个配置文件
- 加载多个配置文件方式一:在代码中加载配置文件时加载多个配置文件
//指定容器创建时加载哪个配置文件
@ContextConfiguration({"classpath:applicationContext.xml","classpath:applicationContext2.xml"}) public class DiTestDemo { // 使用注解手动注入在applicationContext2.xml文件中注入的collection对象
@Resource(name = "collection")
private CollectionInfo collection; // 测试复杂数据类型依赖注入
@Test
public void testCollectionDi() {
// 直接打印collection对象,看其是否注入值成功
System.out.println(collection);
}
}
- 测试结果:applicationContext2.xml加载成功
加载多个配置文件方式二:使用import标签导入
- 测试:还是上面一样的两个配置文件,但在代码中还是只显式加载applicationContext.xml文件,而在applicationContext.xml文件在使用<import resource="applicationContext2.xml"/>来加载applicationContext2.xml
- 在applicationContext.xml配置如下:
<import resource="applicationContext2.xml"/>
- 测试代码如下:
@ContextConfiguration("classpath:applicationContext.xml") public class DiTestDemo { // 使用注解手动注入在applicationContext2.xml文件中注入的collection对象
@Resource(name = "collection")
private CollectionInfo collection; // 测试复杂数据类型依赖注入
@Test
public void testCollectionDi() {
// 直接打印collection对象,看其是否注入值成功
System.out.println(collection);
}
}
- 测试结果:applicationContext2.xml加载成功
Spring-Day02-依赖注入-作业的更多相关文章
- Spring.NET依赖注入框架学习--简介
Spring.NET依赖注入框架学习--Spring.NET简介 概述 Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序.它提供了很多方面的功能,比如依赖注入. ...
- (spring-第3回【IoC基础篇】)spring的依赖注入-属性、构造函数、工厂方法等的注入(基于XML)
Spring要把xml配置中bean的属性实例化为具体的bean,"依赖注入"是关卡.所谓的"依赖注入",就是把应用程序对bean的属性依赖都注入到spring ...
- Spring的依赖注入(DI)三种方式
Spring依赖注入(DI)的三种方式,分别为: 1. 接口注入 2. Setter方法注入 3. 构造方法注入 下面介绍一下这三种依赖注入在Spring中是怎么样实现的. 首先我们需要以下几个 ...
- spring的依赖注入的最常见的两种方法
package com.lsz.spring.action; public class User { /** * set注入 */ private String username; public vo ...
- 一步一步深入spring(3)--spring的依赖注入方式
对于spring配置一个bean时,如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象的过程,sprin ...
- spring的依赖注入是什么意思
最近学习spring框架,对依赖注入有些模糊,遂上网翻阅资料,做了下列总结,原博客为CSDN 南夏的 spring的依赖注入是什么意思,侵删! Spring 能有效地组织J2EE应用各层的对象.不管是 ...
- SpringBoot系列: 理解 Spring 的依赖注入(一)
==============================Spring 的依赖注入==============================对于 Spring 程序, Spring 框架为我们提供 ...
- Spring.NET依赖注入框架学习--实例化容器常用方法
Spring.NET依赖注入框架学习---实例化容器常用方法 本篇学习实例化Spring.NET容器的俩种方式 1.通过XmlObjectFactory创建一个Spring.NET容器 IResour ...
- Spring.NET依赖注入框架学习--简单对象注入
Spring.NET依赖注入框架学习--简单对象注入 在前面的俩篇中讲解了依赖注入的概念以及Spring.NET框架的核心模块介绍,今天就要看看怎么来使用Spring.NET实现一个简单的对象注入 常 ...
- Spring.NET依赖注入框架学习--入门
Spring.NET依赖注入框架学习--入门 在学些Spring.net框架之前,有必要先脑补一点知识,比如什么是依赖注入?IOC又是什么?控制反转又是什么意思?它们与Spring.net又有什么关系 ...
随机推荐
- 【iptables】规则的试验和查看
1.存在桥接,查看桥接访客网络规则 ebtables -L 可以看到对不同的链的策略
- libtar 和 libz 的使用
libtar 和 libz 的使用 用c代码生成 tar.gz 文件 实现的功能和 tar -zcf 命令一样 大概流程为 1.先用libtar相关函数对某个目录生成tar文件 2.然后对tar文件 ...
- 亲测,很有效的忽略SSL证书方法
1.在httpclient发起请求时,有时会出现下面这种情况 你的日志中出现有关SSL的异常,javax.net.ssl.SSLPeerUnverifiedException: peer not au ...
- Redis的Lists数据类型
Lists 就是链表,相信略有数据结构知识的人都应该能理解其结构.使用Lists结构,我们可以轻松地实现最新消息排行等功能.Lists的另一个应用就是消息队列,可以利用Lists的PUSH操作,将任务 ...
- Jms学习篇二:ActiveMQ
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线 安装 1>下载:到http://activemq.apache.org/download.html 下载最新版本, 解压a ...
- angular2-响应式表单
响应式表单是同步的.模板驱动表单是异步的.这个不同点很重要 使用响应式表单,我们会在代码中创建整个表单控件树. 我们可以立即更新一个值或者深入到表单中的任意节点,因为所有的控件都始终是可用的. 模板驱 ...
- C#操作CAD-调用winform
个人认为用命令操作cad会比较便捷,但是鉴于好多人喜欢通过鼠标点击的方式操作cad,在此讲一下如何调用winform.前期准备请看上篇文章. 1.在新建好项目并引用接口dll的前提下,新建一个winf ...
- Android应用开发基础之一:数据存储和界面展现(一)
Android项目的目录结构 Activity:应用被打开时显示的界面 src:项目代码 R.java:项目中所有资源文件的资源id Android.jar:Android的jar包,导入此包方可使用 ...
- Flask环境github及项目部署(十三)
(1) github项目搭建 1 连接GitHub hostnamectl set-hostname flask-dev # 设置 hostname,一般是主机名可以不更改 ssh-keygen # ...
- java实现多文件上传01
1.html代码 <html> <head> <link rel="stylesheet" type="text/css" hre ...