Spring有多种依赖注入的形式,本篇文章仅介绍Spring通过xml进行IOC配置的方式。

平常的Java开发中,程序员在某个类中需要依赖其它类的方法。

通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理。

Spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过Spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。

依赖注入的另一种说法是"控制反转"。通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员。

而控制反转是指new实例工作不由我们程序员来做而是交给Spring容器来做。

构造器注入:  本文使用构造器注入和引用了一个bean

先写出需要引用的bean的接口

package com.spring;

public interface SpringAocInterface {
void show();
}

实现接口

package com.spring;

public class SpringAocInterfaceIm implements SpringAocInterface {

	private final static String Lings = "最近的烦恼是小小的离别带来的寂寞,一瞬间的邂逅与分别,这一个一个的刹那,我想好好珍惜起来。";
@Override
public void show() { System.out.println(Lings); } }

需要注入的类 (提供了一个String属性和一个对象  都是通过构造方法注入)

package com.spring;

/**
* 使用构造方法
* @author Administrator
*
*/
public class SpringIoc {
private String Song; //构造方法注入 private SpringAocInterface springAocInterface; //构造方法引入对象注入 public SpringIoc(String song, SpringAocInterface springAocInterface) {
super();
Song = song;
this.springAocInterface = springAocInterface;
} public void show() {
System.out.println("构造方法传入的Song为 :" +Song);
System.out.print("构造方法引入的对象为:");
springAocInterface.show();
} }

xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- 构造方法注入 -->
<bean id="SpringIoc" class="com.spring.SpringIoc">
<constructor-arg name="song" value="5"></constructor-arg> <!-- 给SpringIoc中的song属性注入-->
<constructor-arg name="springAocInterface" ref="SpringAocInterfaceIm"></constructor-arg><!-- 给SpringIoc中的springAocInterface 注入bean -->
</bean>
<bean id="SpringAocInterfaceIm" class="com.spring.SpringAocInterfaceIm"></bean>
<beans>

写一个测试类

package com.spring.test;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.spring.SpringIoc;

public class SpringIocTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
SpringIoc bean = (SpringIoc) context.getBean("SpringIoc");
bean.show();
}
}

输出结果

十月 15, 2017 10:19:50 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1e3bd51: startup date [Sun Oct 15 22:19:50 CST 2017]; root of context hierarchy
十月 15, 2017 10:19:50 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [spring.xml]
十月 15, 2017 10:19:50 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@e40e825: defining beans [SpringIoc,SpringAocInterfaceIm,SpringSetIoc]; root of factory hierarchy
构造方法传入的Song为 :5
构造方法引入的对象为:最近的烦恼是小小的离别带来的寂寞,一瞬间的邂逅与分别,这一个一个的刹那,我想好好珍惜起来。

2:set注入(里面包括set注入 属性  list集合  map集合  引入bean)

package com.spring;

import java.util.List;
import java.util.Map; /**
* Spring通过Set注入
* @author Administrator
*
*/
public class SpringSetIoc {
private String name; private int age; private SpringAocInterface like; private List<Object> list; private Map<String, Object> map ; public void show() {
System.out.println("通过set方法注入的姓名为:" + name);
System.out.println("通过set方法注入的年龄为:" + age);
System.out.print("通过set方法注入对象" + name + "最喜欢的一句话为:");
like.show();
System.out.print("通过set方法注入" + name + "最喜欢吃的水果为:");
for (Object object : list) {
System.out.print(object + ",");
}
System.out.println();
System.out.print("通过set方法注入map key为string : ");
for (String m : map.keySet()) {
System.out.print(map.get(m) + ",");
}
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public SpringAocInterface getLike() {
return like;
} public void setLike(SpringAocInterface like) {
this.like = like;
} public List<Object> getList() {
return list;
} public void setList(List<Object> list) {
this.list = list;
} public Map<String, Object> getMap() {
return map;
} public void setMap(Map<String, Object> map) {
this.map = map;
} }

xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <bean id="SpringAocInterfaceIm" class="com.spring.SpringAocInterfaceIm"></bean>
<!-- set注入 -->
<bean id="SpringSetIoc" class="com.spring.SpringSetIoc">
<property name="name" value="张三"></property>
<property name="age" value="18"></property>
<!-- <property name="like" ref="SpringAocInterfaceIm"></property> --> <!-- 这个是注入公共bean 如果需要注入内部bean 并不想被共享可以使用下面的注入方式 -->
<property name="like">
<bean class="com.spring.SpringAocInterfaceIm"></bean>
</property>
<property name="list"> <!-- 这个是注入list集合 这个是注入的值 如果想注入bean的话 可以 写成 <ref bean = "bean的名称"></ref> -->
<list>
<value>香蕉</value>
<value>橘子</value>
<value>苹果</value>
</list>
</property>
<property name="map"><!-- map注入 -->
<map>
<entry key="男士" value="李四"></entry>
<entry key="男士" value="王五"></entry>
<entry key="女士" value="小花"></entry>
</map>
</property>
</bean>
<!-- spring还提供了P命名空间 减少了尖括号 使用p命名空间的时候 需要在上方引入xmlns:p="http://www.springframework.org/schema/p" 这句代码 不然会报错 两者方法取其一就好 我使用的上面的方式-->
<!-- <bean id="SpringSetIoc" class="com.spring.SpringSetIoc" p:name = "张三"
p:age = "18"
p:like-ref="SpringAocInterfaceIm"/> -->
</beans>

测试类

package com.spring.test;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.spring.SpringSetIoc;

public class SpringSetIocTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
SpringSetIoc bean = (SpringSetIoc) context.getBean("SpringSetIoc");
bean.show();
}
}

输出结果

十月 15, 2017 10:26:14 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7f1633fd: startup date [Sun Oct 15 22:26:14 CST 2017]; root of context hierarchy
十月 15, 2017 10:26:15 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [spring.xml]
十月 15, 2017 10:26:15 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@741c42a9: defining beans [SpringIoc,SpringAocInterfaceIm,SpringSetIoc]; root of factory hierarchy
通过set方法注入的姓名为:张三
通过set方法注入的年龄为:18
通过set方法注入对象张三最喜欢的一句话为:最近的烦恼是小小的离别带来的寂寞,一瞬间的邂逅与分别,这一个一个的刹那,我想好好珍惜起来。
通过set方法注入张三最喜欢吃的水果为:香蕉,橘子,苹果,
通过set方法注入map key为string : 王五,小花,

最后奉上完整版的xml配置文件 包含构造注入和set注入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- 构造方法注入 -->
<bean id="SpringIoc" class="com.spring.SpringIoc">
<constructor-arg name="song" value="5"></constructor-arg> <!-- 给SpringIoc中的song属性注入-->
<constructor-arg name="springAocInterface" ref="SpringAocInterfaceIm"></constructor-arg><!-- 给SpringIoc中的springAocInterface 注入bean -->
</bean>
<bean id="SpringAocInterfaceIm" class="com.spring.SpringAocInterfaceIm"></bean>
<!-- set注入 -->
<bean id="SpringSetIoc" class="com.spring.SpringSetIoc">
<property name="name" value="张三"></property>
<property name="age" value="18"></property>
<!-- <property name="like" ref="SpringAocInterfaceIm"></property> --> <!-- 这个是注入公共bean 如果需要注入内部bean 并不想被共享可以使用下面的注入方式 -->
<property name="like">
<bean class="com.spring.SpringAocInterfaceIm"></bean>
</property>
<property name="list"> <!-- 这个是注入list集合 这个是注入的值 如果想注入bean的话 可以 写成 <ref bean = "bean的名称"></ref> -->
<list>
<value>香蕉</value>
<value>橘子</value>
<value>苹果</value>
</list>
</property>
<property name="map"><!-- map注入 -->
<map>
<entry key="男士" value="李四"></entry>
<entry key="男士" value="王五"></entry>
<entry key="女士" value="小花"></entry>
</map>
</property>
</bean>
<!-- spring还提供了P命名空间 减少了尖括号 使用p命名空间的时候 需要在上方引入xmlns:p="http://www.springframework.org/schema/p" 这句代码 不然会报错 -->
<!-- <bean id="SpringSetIoc" class="com.spring.SpringSetIoc" p:name = "张三"
p:age = "18"
p:like-ref="SpringAocInterfaceIm"/> -->
</beans>

Spring3实战第二章第二小节 IOC依赖注入 list和map集合的更多相关文章

  1. Ionic 入门与实战之第二章第二节:Ionic 环境搭建之 Ionic Lab 使用

    原文发表于我的技术博客 本文是「Ionic 入门与实战」系列连载的第二章第二节,主要对 Ionic Lab 工具作了介绍,并讲解了其使用方法,这也是一个开发 Ionic 比较好的调试工具. 原文发表于 ...

  2. 浅谈(IOC)依赖注入与控制反转(DI)

    前言:参考了百度文献和https://www.cnblogs.com/liuqifeng/p/11077592.html以及http://www.cnblogs.com/leoo2sk/archive ...

  3. ASP.NET MVC IOC依赖注入之Autofac系列(二)- WebForm当中应用

    上一章主要介绍了Autofac在MVC当中的具体应用,本章将继续简单的介绍下Autofac在普通的WebForm当中的使用. PS:目前本人还不知道WebForm页面的构造函数要如何注入,以下在Web ...

  4. ASP.NET MVC IOC依赖注入之Autofac系列(一)- MVC当中应用

    话不多说,直入主题看我们的解决方案结构: 分别对上面的工程进行简单的说明: 1.TianYa.DotNetShare.Model:为demo的实体层 2.TianYa.DotNetShare.Repo ...

  5. IOC依赖注入简单实例

    转自:http://hi.baidu.com/xyz136299110/item/a32be4269e9d0c55c38d59e6 相信大家看过相当多的IOC依赖注入的例子. 但大家在没有明白原理的情 ...

  6. IoC 依赖注入容器 Unity

    原文:IoC 依赖注入容器 Unity IoC 是什么? 在软件工程领域,“控制反转(Inversion of Control,缩写为IoC)”是一种编程技术,表述在面向对象编程中,可描述为在编译时静 ...

  7. springboot启动流程(九)ioc依赖注入

    所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 正文 在前面的几篇文章中,我们多次提到这么一个转化过程: Bean配置 --> Bean ...

  8. Spring-DI控制反转和IOC依赖注入

    Spring-DI控制反转和IOC依赖注入 DI控制反转实例 IDEAJ自动导入Spring框架 创建UserDao.java接口 public interface UserDao { public ...

  9. Spring学习-spring核心机制-IOC依赖注入

    转载自:http://www.cnblogs.com/chenssy/archive/2012/11/11/2765266.html 今天复习一下spring两大特性之一:IOC依赖注入,看了一下大佬 ...

随机推荐

  1. this和target目标对象的区别

    在事件函数中 event.target和this是一样的效果吗? this是调用方法的对象, evemt.target事件属性可返回事件的目标节点(触发该事件的节点),如生成事件的元素.文档或窗口. ...

  2. vue 路由传参 、接收参数

    传参组件 一. <router-link :to='"/main/course?navName=" +item.columnName + "&id=&quo ...

  3. 关于DES加密

    数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的.通常,自动取款 ...

  4. Java_break与continue区别

    使用场合不同 break:可以在switch case中使用,也可以在循环中使用   continue:只能在循环中使用,除了switch case 作用不同 break:表示中断,当在switch ...

  5. PCB中的SOLD MASK和阻抗开窗

    应用场合:1 PCB中的贴片的焊盘是不过油的,需要暴露出来用于焊接:对于电机驱动需要大电流的走线需要将走线保留暴露出来不过油,然后在上面走一层锡,增大锡箔,铜箔厚度,增大过流和防过热能力. 方法:先在 ...

  6. LCA(最近公共祖先)

    学习链接:https://baike.baidu.com/item/%E4%BC%B8%E5%B1%95%E6%A0%91/7003945?fr=aladdin 求LCA的方法有很多,在这里就只介绍一 ...

  7. google +ubuntu16.04

    1.在终端中输入以下命令 sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/ 2 ...

  8. Django查询一个权限中包含哪些用户

    Django查询一个权限中包含哪些用户 Django的Permission对象中没有直接查询相关用户的信息,而都是通过User对象来查询某个用户有哪些权限,例如: user.objects.get(u ...

  9. spring mvc中DispatcherServlet如何得到ModelAndView的

    首先看下面这种张图,这张图说明了spring mvc整体的流程. 本文讲的就是如何从DispatcherServlet中得到ModerAndView的过程. 首先看DispatherServlet这个 ...

  10. linux多线程同步

    1. 互斥量是线程同步的一种机制,用来保护多线程的共享资源.同一时刻,只允许一个线程对临界区进行访问.互斥量的工作流程:创建一个互斥量,把这个互斥量的加锁调用放在临界区的开始位置,解锁调用放到临界区的 ...