一、依赖注入(DI)简介
    依赖注入背后的基本原理是对象之间的依赖关系,可以通过以下几种方式来实现:构造器的参数、工厂方法的参数,或给由构造函数或者工厂方法创建的对象设置属性。因此,容器的工作就是创建bean时注入那些依赖关系。相对于由bean自己来控制其实例化、直接在构造器中指定依赖关系或者类似服务定位器模式这3种自主控制依赖关系注入的方法来说,控制从根本上发生了倒转,这也正是控制反转名字的由来。

依赖注入主要有两种注入方式,即构造器注入和Setter注入。

二、构造器注入
基于构造器的依赖注入是通过调用带参数的构造器来实现,每个参数代表着一个依赖。下面展示了用构造器参数来注入依赖关系的例子。

先创建一个对象(bean)

Java代码
  1. public class HelloWorld {
  2. private String msg;
  3. //需要一个默认无参构造器
  4. public HelloWorld(){}
  5. public HelloWorld(String msg){
  6. this.msg = msg;
  7. }
  8. public String getMsg() {
  9. return msg;
  10. }
  11. public void setMsg(String msg) {
  12. this.msg = msg;
  13. }
  14. }
public class HelloWorld {
private String msg;
//需要一个默认无参构造器
public HelloWorld(){}
public HelloWorld(String msg){
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}

再修改配置文件applicationContext.xml,实例化bean

Java代码
  1. <bean id="hello" class="com.spring.demo.HelloWorld">
  2. <constructor-arg index="0">
  3. <value>HelloWorld!</value>
  4. </constructor-arg>
  5. </bean>
 <bean id="hello" class="com.spring.demo.HelloWorld">
<constructor-arg index="0">
<value>HelloWorld!</value>
</constructor-arg>
</bean>

最后测试是否能够得到注入的bean,并打印出对象的属性。

Java代码
  1. public static void main(String[] args){
  2. //读取配置文件,获得BeanFactory
  3. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  4. BeanFactory factory = context;
  5. HelloWorld hello = (HelloWorld)factory.getBean("hello");
  6. System.out.println(hello.getMsg());
  7. }
public static void main(String[] args){
//读取配置文件,获得BeanFactory
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
BeanFactory factory = context;
HelloWorld hello = (HelloWorld)factory.getBean("hello");
System.out.println(hello.getMsg());
}

三、Setter注入
通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即可实现基于setter的依赖注入。

创建一个对象

Java代码
  1. public class HelloWorld {
  2. private String msg;
  3. public String getMsg() {
  4. return msg;
  5. }
  6. public void setMsg(String msg) {
  7. this.msg = msg;
  8. }
  9. }
public class HelloWorld {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}

修改配置文件applicationContext.xml,实例化bean

Java代码
  1. <bean id="helloBean" class="com.spring.demo.HelloWorld">
  2. <property name="msg" value="Hello World!"/>
  3. </bean>
<bean id="helloBean" class="com.spring.demo.HelloWorld">
<property name="msg" value="Hello World!"/>
</bean>  

测试类,获得注入的bean

Java代码
  1. public static void main(String[] args){
  2. //读取配置文件,实例化IOC容器
  3. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  4. BeanFactory factory = context;
  5. HelloWorld hello = (HelloWorld)factory.getBean("helloBean");
  6. System.out.println(hello.getMsg());
  7. }
 public static void main(String[] args){
//读取配置文件,实例化IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
BeanFactory factory = context;
HelloWorld hello = (HelloWorld)factory.getBean("helloBean");
System.out.println(hello.getMsg());
}

处理bean依赖关系通常按以下步骤进行:

1.根据定义bean的配置创建并初始化BeanFactory实例

2.每个bean的依赖将以属性、构造器参数、或静态工厂方法参数的形式出现。当这些bean被实际创建时,这些依赖也将会提供给该bean。

3.每个属性或构造器参数既可以是一个实际的值,也可以是对该容器中另一个bean的引用。

4.每个指定的属性或构造器参数值必须能够被转换成特定的格式或构造参数所需的类型。

Spring会在容器被创建时验证容器中每个bean的配置,包括验证那些bean所引用的属性是否指向一个有效的bean。在bean被实际创建之前,bean的属性并不会被设置。伴随着bean被实际创建,作为该bean的依赖bean以及依赖bean的依赖bean也将被创建和分配。

Spring依赖注入方式相关推荐

  1. Spring 依赖注入方式详解

    平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...

  2. 最全的 Spring 依赖注入方式,你都会了吗?

    欢迎关注方志朋的博客,回复"666"获面试宝典 前言 Spring 正如其名字,给开发者带来了春天,Spring 是为解决企业级应用开发的复杂性而设计的一款框架,其设计理念就是:简 ...

  3. spring四种依赖注入方式

    平常的java开发中,程序员在某个类中需要依赖其它类的方法,通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. spring提出了依赖注入的思想,即依赖不由程序 ...

  4. Spring中IoC两种接口和两种依赖注入方式的比较

    spring是一个开源框架,是为了解决企业应用程序开发的复杂性而创建的,为J2EE应用程序开发提供集成的框架.简单来说,spring是一个轻量级的控制反转IOC和面向切面AOP的容器框架.spring ...

  5. Spring依赖注入的方式、类型、Bean的作用域、自动注入、在Spring配置文件中引入属性文件...

    1.Spring依赖注入的方式 通过set方法完成依赖注入 通过构造方法完成依赖注入 2.依赖注入的类型 基本数据类型和字符串 使用value属性 如果是指向另一个对象的引入 使用ref属性 User ...

  6. Spring 依赖注入的理解及三种注入方式

    Spring 依赖注入概念和三种注入方式(理解及应用) 什么是注入 要了解Spring的三种注入方式首先前提是得先了解一下什么是注入,相信很多人对这个概念都是模糊不清的,网上的解释是这样的: 依赖注入 ...

  7. spring依赖注入的4种方式

    Spring 依赖注入的4种方式 一.Set注入 必须要有setter方法 public class UserDao {public void test(){System.out.println(&q ...

  8. Spring依赖注入(注解方式)

    Spring依赖注入(注解方式) 在Spring中,尽管使用XML配置文件就可以实现Bean的装配工作,但如果应用中Bean的数量较多,会导致XML配置文件过于臃肿,从而给程序的维护与升级带来一定的困 ...

  9. spring依赖注入的四种方式

    平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...

最新文章

  1. python tqdm_Python基础 | 一个被忽视的神器tqdm
  2. dht11 python mysql,自己动手实现智能家居之温湿度数据采集存储(DHT11,MySql)
  3. PFLD:简单高效的实用人脸关键点检测算法
  4. easyui datagrid不是相邻的能合并单元格吗_介绍一种划分账龄的方法,要不了半个小时就能完成...
  5. Linux系统中使用shell判断磁盘是否格式化的方法
  6. node 测试生成模拟用户数据
  7. 米酷影视直播二开全修复版增加在线充值影视资源网站源码
  8. Java基本数据类型大总结
  9. 部署到gcp_将S/4部署在“大型公有云”上
  10. 如何以出售开源软件为生?
  11. 采用LM1875组成的各种功放电路
  12. 机器学习项目实战——08浅层网络之葡萄酒分类
  13. 小明一家过桥_「小明一家人过桥问题」如何用编程解决?
  14. 体系结构学习笔记一:硬件动态调度算法介绍以及基于Verilog的Tomasulo实现
  15. AngularJS车牌号正则表达式验证
  16. 公司测试用例写得乱七八糟,直到制定了这份《测试用例编写规范》
  17. C语言程序设计——函数 梅森尼数形如2^i-1的素数,称为梅森尼数。编程计算并输出指数i在[2,n]中的所有梅森尼数,并统计这些梅森尼数的个数,其中n的值由键盘输入,并且n的值不能大于50。
  18. 数据库简介与 Mysql 服务基础
  19. 关于layui、table数据表格请求异常回调函数
  20. autojs常见报错及解决

热门文章

  1. 计算机网络之数据链路层:14、局域网的基本概念
  2. 计算机网络之数据链路层:1、概述
  3. The repository does not have a Release
  4. matlab中图像处理的基本函数(2)
  5. docker0: iptables: No chain/target/match by that name.
  6. Client.Timeout exceeded while awaiting headers
  7. Java 线程实例二(终止线程、生产者/消费者问题、获取线程状态、获取所有线程、查看线程优先级、中断线程)
  8. ActiveMQ、RabbitMQ、RocketMQ、Kafka的介绍及优缺点说明
  9. IDA工具各个功能总结
  10. Windows编程—Windows驱动开发环境搭建