Spring机制中主要有两种依赖注入:Constructor-based Dependency Injection(基于构造方法依赖注入) 和 Setter-based Dependency Injection(基于Setter方法依赖注入)

一、Contructor-based Dependency Injection(基于构造方法注入)

在bean标签中通过使用<constructor-arg />标签来实现

spring.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="a" class="com.test.spring.A">
<!-- 引用其它bean两种不同实现-->
<constructor-arg>
<ref bean="b"/>
</constructor-arg>
<constructor-arg ref="c"/>
<constructor-arg name="name" value="张三"/>
</bean>
<bean id="b" class="com.test.spring.B">
</bean>
<bean id="c" class="com.test.spring.C">
</bean>
</beans>

Java 类:

package com.test.spring;

public class A {

    private B b;
private C c;
private String name; public A(B b, C c, String name) {
this.b = b;
this.c = c;
this.name = name;
} public B getB() {
return b;
} public void setB(B b) {
this.b = b;
} public C getC() {
return c;
} public void setC(C c) {
this.c = c;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "A [b=" + b + ", c=" + c + ", name=" + name + "]";
} }
-------------------------------------------------------------------------------------------------------------------------------------------------
package com.test.spring; public class B { }
-------------------------------------------------------------------------------------------------------------------------------------------------
package com.test.spring; public class C { }

测试:

package com.test.spring;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class T {
AbstractApplicationContext applicationcontext=null;
@Before
public void before() {
System.out.println("》》》Spring ApplicationContext容器开始初始化了......");
applicationcontext= new ClassPathXmlApplicationContext(new String[]{"test1-service.xml"});
System.out.println("》》》Spring ApplicationContext容器初始化完毕了......");
}
@Test
public void test() {
A a=applicationcontext.getBean(A.class);
System.out.println(a);
}
}

测试结果:

》》》Spring ApplicationContext容器开始初始化了......
2017-03-19 14:02:53  INFO:ClassPathXmlApplicationContext-Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@18c92ff9: startup date [Sun Mar 19 14:02:53 CST 2017]; root of context hierarchy
2017-03-19 14:02:53  INFO:XmlBeanDefinitionReader-Loading XML bean definitions from class path resource [test1-service.xml]
》》》Spring ApplicationContext容器初始化完毕了......
A [b=com.test.spring.B@4899c2aa, c=com.test.spring.C@66bb4c22, name=张三]

Spring 官网API提供够了使用静态工厂方法来实现上述功能:

Spring.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="a" class="com.test.spring.A" factory-method="getInstence">
<constructor-arg>
<ref bean="b"/>
</constructor-arg>
<constructor-arg ref="c"/>
<constructor-arg name="name" value="张三"/>
</bean>
<bean id="b" class="com.test.spring.B">
</bean>
<bean id="c" class="com.test.spring.C">
</bean>
</beans>

Java类:

package com.test.spring;

public class A {

    private B b;
private C c;
private String name;
/**
* 创建一个私有的构造方法
* @param b
* @param c
* @param name
*/
private A(B b, C c, String name) {
this.b = b;
this.c = c;
this.name = name;
} public static A getInstence(B b,C c,String name){
System.out.println("调用了静态的工厂方法");
A a = new A(b,c,name);
return a;
} public B getB() {
return b;
} public void setB(B b) {
this.b = b;
} public C getC() {
return c;
} public void setC(C c) {
this.c = c;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "A [b=" + b + ", c=" + c + ", name=" + name + "]";
} }
--------------------------------------------------------------------------------
B.java C.java(略)

测试:

package com.test.spring;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class T {
AbstractApplicationContext applicationcontext=null;
@Before
public void before() {
System.out.println("》》》Spring ApplicationContext容器开始初始化了......");
applicationcontext= new ClassPathXmlApplicationContext(new String[]{"test1-service.xml"});
System.out.println("》》》Spring ApplicationContext容器初始化完毕了......");
}
@Test
public void test() {
A a=applicationcontext.getBean(A.class);
A a2=applicationcontext.getBean(A.class);
System.out.println(a==a2);//发现A的实例对象是单例的
System.out.println(a);
System.out.println(a2);
}
}

测试结果:

》》》Spring ApplicationContext容器开始初始化了......
2017-03-19 14:22:31  INFO:ClassPathXmlApplicationContext-Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@17ad352e: startup date [Sun Mar 19 14:22:31 CST 2017]; root of context hierarchy
2017-03-19 14:22:31  INFO:XmlBeanDefinitionReader-Loading XML bean definitions from class path resource [test1-service.xml]
调用了静态的工厂方法
》》》Spring ApplicationContext容器初始化完毕了......
true
A [b=com.test.spring.B@176730bb, c=com.test.spring.C@77b050fd, name=张三]
A [b=com.test.spring.B@176730bb, c=com.test.spring.C@77b050fd, name=张三]

2.Setter-based Dependency Injection(基于Setter方式依赖注入):该注入方式是经常使用的

spring.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="a" class="com.test.spring.A">
<property name="b" ref="b"/>
<property name="c" ref="c"/>
<property name="name" value="张三"/>
</bean>
<bean id="b" class="com.test.spring.B">
</bean>
<bean id="c" class="com.test.spring.C">
</bean>
</beans>

Java类:

package com.test.spring;

public class A {

    private B b;
private C c;
private String name; public B getB() {
return b;
} public void setB(B b) {
this.b = b;
} public C getC() {
return c;
} public void setC(C c) {
this.c = c;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "A [b=" + b + ", c=" + c + ", name=" + name + "]";
} }

测试:

package com.test.spring;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class T {
AbstractApplicationContext applicationcontext=null;
@Before
public void before() {
System.out.println("》》》Spring ApplicationContext容器开始初始化了......");
applicationcontext= new ClassPathXmlApplicationContext(new String[]{"test1-service.xml"});
System.out.println("》》》Spring ApplicationContext容器初始化完毕了......");
}
@Test
public void test() {
//BeanLifecycle beanLifecycle =applicationcontext.getBean("beanLifecycle",BeanLifecycle.class);
//applicationcontext.close();
//applicationcontext.registerShutdownHook();
A a=applicationcontext.getBean(A.class);
System.out.println(a);
}
}

测试结果:

》》》Spring ApplicationContext容器开始初始化了......
2017-03-19 14:34:20  INFO:ClassPathXmlApplicationContext-Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@17ad352e: startup date [Sun Mar 19 14:34:20 CST 2017]; root of context hierarchy
2017-03-19 14:34:20  INFO:XmlBeanDefinitionReader-Loading XML bean definitions from class path resource [test1-service.xml]
》》》Spring ApplicationContext容器初始化完毕了......
A [b=com.test.spring.B@49daafb9, c=com.test.spring.C@3446c090, name=张三]

这两种注入方式在Spring配置文件中可以一起使用

Spring点滴七:Spring中依赖注入(Dependency Injection:DI)的更多相关文章

  1. 控制反转Inversion of Control (IoC) 与 依赖注入Dependency Injection (DI)

    控制反转和依赖注入 控制反转和依赖注入是两个密不可分的方法用来分离你应用程序中的依赖性.控制反转Inversion of Control (IoC) 意味着一个对象不会新创建一个对象并依赖着它来完成工 ...

  2. 简明依赖注入(Dependency Injection)

    前言 这是因特奈特上面不知道第几万篇讲依赖注入(Dependency Injection)的文章,但是说明白的却寥寥无几,这篇文章尝试控制字数同时不做大多数. 首先,依赖注入的是一件很简单的事情. 为 ...

  3. 14.AutoMapper 之依赖注入(Dependency Injection)

    https://www.jianshu.com/p/f66447282780   依赖注入(Dependency Injection) AutoMapper支持使用静态服务定位构建自定义值解析器和自定 ...

  4. 依赖注入 | Dependency Injection

    原文链接: Angular Dependency Injection翻译人员: 铁锚翻译时间: 2014年02月10日说明: 译者认为,本文中所有名词性的"依赖" 都可以理解为 & ...

  5. Spring之对象依赖关系(依赖注入Dependency Injection)

    承接上篇: Spring中,如何给对象的属性赋值: 1:通过构造函数,如下所示: <!-- 1:构造函数赋初始值 --><bean id="user1" clas ...

  6. 设计模式之————依赖注入(Dependency Injection)与控制反转(Inversion of Controller)

    参考链接: 依赖注入(DI) or 控制反转(IoC) laravel 学习笔记 —— 神奇的服务容器 PHP 依赖注入,从此不再考虑加载顺序 名词解释 IoC(Inversion of Contro ...

  7. AngularJS - 依赖注入(Dependency Injection)

    点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ 依赖注入 依赖注入是软件设计模式中的一部分,用于处理组件是如何得到它说依赖的其它组件的. ...

  8. MVC使用StructureMap实现依赖注入Dependency Injection

    使用StructureMap也可以实现在MVC中的依赖注入,为此,我们不仅要使用StructureMap注册各种接口及其实现,还需要自定义控制器工厂,借助StructureMap来生成controll ...

  9. 理解依赖注入(Dependency Injection)

    理解依赖注入 Yii2.0 使用了依赖注入的思想.正是使用这种模式,使得Yii2异常灵活和强大.千万不要以为这是很玄乎的东西,看完下面的两个例子就懂了. class SessionStorage { ...

随机推荐

  1. 图像处理和OpenCV初步

    图像从数学和计算机的角度理解就是一个矩阵,矩阵中的每一个元素叫做像素,又由于图像有灰度图像和彩色图像之分,所以图像在矩阵的基础上引入通道(channel),其中色彩用数字来表示的时候,规定数字0表示黑 ...

  2. 使用html2canvas将html标签转化为图片

    有些时候我们无法用常规的截图工具截取网页内容,这时可以尝试以下方法: 1.首先允许跨域,Chrome浏览器可以在快捷方式->属性->目标栏里添加: --disable-web-securi ...

  3. TensorFlow学习之路1-TensorFlow介绍

    TensorFlow是一个采用数据流图(data flow graphs),用于数据计算的开源软件库. 什么是数据流图? TensorFlow的数据流图是由“节点”(nodes)和“线”(edges) ...

  4. IPC_Binder_java_1

    title: IPC_Binder_java_1 date: 2017-01-03 21:30:55 tags: [IPC,Binder] categories: [Mobile,Android] - ...

  5. Grunt 5分钟上手:合并+压缩前端代码

    Grunt 的各种优点这里就不扯了,对于 新手来说 合并(concat) + 压缩(uglify) 前端代码的需求量应该是最大的,这里以这俩种功能为主做一个5分钟的入门吧! 工作环境 $ node - ...

  6. linux后退文件夹命令

    后退文件夹: cd -  在重复一遍就是前进了

  7. Scrum Meeting 11.11

    成员 今日任务 明日计划 用时 徐越 学习UI设计并重构上传下载界面     赵庶宏       薄霖 UI代码更新     卞忠昊 Xfermode与PorterDuff     武鑫 界面设计:独 ...

  8. 2-Eighth Scrum Meeting20151208

    任务分配 闫昊: 今日完成:和唐彬讨论研究上届的网络接口代码. 明日任务:商讨如何迁移ios代码到android平台. 唐彬: 今日完成:和闫昊讨论研究上届的网络接口代码. 明日任务:商讨如何迁移io ...

  9. RocEDU.阅读.写作选择书目

    很高兴加入这样一个专门于读书.写作的群. 一.选择图书 通识类: <你的灯亮着吗> 作者: 高斯 (Donald C. Gause) / 温伯格 (Gerald M.Weinberg) 出 ...

  10. 150314 解决老师给二柱子出的问题 之 ver1.0

    一个晚上的成果,效果捉鸡,代码很乱.暂定ver1.0 //Powered by LZR! 2015.3.14#include<iostream> #include<stdio.h&g ...