• 配置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-依赖注入-作业的更多相关文章

  1. Spring.NET依赖注入框架学习--简介

    Spring.NET依赖注入框架学习--Spring.NET简介 概述 Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序.它提供了很多方面的功能,比如依赖注入. ...

  2. (spring-第3回【IoC基础篇】)spring的依赖注入-属性、构造函数、工厂方法等的注入(基于XML)

    Spring要把xml配置中bean的属性实例化为具体的bean,"依赖注入"是关卡.所谓的"依赖注入",就是把应用程序对bean的属性依赖都注入到spring ...

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

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

  4. spring的依赖注入的最常见的两种方法

    package com.lsz.spring.action; public class User { /** * set注入 */ private String username; public vo ...

  5. 一步一步深入spring(3)--spring的依赖注入方式

    对于spring配置一个bean时,如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象的过程,sprin ...

  6. spring的依赖注入是什么意思

    最近学习spring框架,对依赖注入有些模糊,遂上网翻阅资料,做了下列总结,原博客为CSDN 南夏的 spring的依赖注入是什么意思,侵删! Spring 能有效地组织J2EE应用各层的对象.不管是 ...

  7. SpringBoot系列: 理解 Spring 的依赖注入(一)

    ==============================Spring 的依赖注入==============================对于 Spring 程序, Spring 框架为我们提供 ...

  8. Spring.NET依赖注入框架学习--实例化容器常用方法

    Spring.NET依赖注入框架学习---实例化容器常用方法 本篇学习实例化Spring.NET容器的俩种方式 1.通过XmlObjectFactory创建一个Spring.NET容器 IResour ...

  9. Spring.NET依赖注入框架学习--简单对象注入

    Spring.NET依赖注入框架学习--简单对象注入 在前面的俩篇中讲解了依赖注入的概念以及Spring.NET框架的核心模块介绍,今天就要看看怎么来使用Spring.NET实现一个简单的对象注入 常 ...

  10. Spring.NET依赖注入框架学习--入门

    Spring.NET依赖注入框架学习--入门 在学些Spring.net框架之前,有必要先脑补一点知识,比如什么是依赖注入?IOC又是什么?控制反转又是什么意思?它们与Spring.net又有什么关系 ...

随机推荐

  1. /Date(1410019200000+0800)/如何转换为date对象

    <script type="text/javascript">var s = '/Date(1410019200000+0800)/ '; s.replace(/Dat ...

  2. Investigating issues with Unmanaged Memory. First steps. (转载)

    原文:http://kate-butenko.blogspot.tw/2012/07/investigating-issues-with-unmanaged.html I want to write ...

  3. 【代码笔记】Java学习一阶段总结

    写笔记需要打开eclipse写 哈哈哈哈,不然写什么都屡不清了 ……还需要打开API说明文档. JFrame 窗体组件. JFrame里面常用的函数: setSize 设置窗体大小 setDefaul ...

  4. jquery获取transform里面的值

    用transform的translateX写了一个侧滑效果,如何获取它改变的值是多少呢? 获取translateX值的方法: $('div').css("transform").r ...

  5. Android 自定义View之自绘控件

    首先要提前声明一下,我对于自定义View的理解并不是很深,最近啃了几天guolin博主写的关于自定义View的博客,讲的非常棒,只不过涉及到源码和底层的一些东西,我自己就懵逼了,目前只是会了关于自定义 ...

  6. 分布式消息队列kafka

    下载地址:http://kafka.apache.org/downloads.html 先启动zookeeper服务器 bin/zookeeper-server-start.sh config/zoo ...

  7. PHP json数据的运用

    今天这里总结一下json数据的使用实例,从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码. 一.json_encode() 1 2 ...

  8. WebService小例子———

    WebService学习(刚开始) ———————————————————————————————————————————————————————————————————— WebService:跨平 ...

  9. MapReduce框架结构及代码示例

    一个完整的 mapreduce 程序在分布式运行时有三类实例进程: 1.MRAppMaster:负责整个程序的过程调度及状态协调 2.MapTask:负责 map 阶段的整个数据处理流程 3.Redu ...

  10. 常见WEB开发安全漏洞 原因分析及解决

    目 录 1 会话标识未更新 3 1.1 原因 3 1.2 解决 3 2 SQL注入 3 2.1 原因 3 2.2 解决 5 3 XSS跨站脚本编制 5 3.1 原因 5 3.2 解决 5 4 XSRF ...