平常的java开发中,程序员在某个类中需要依赖其它类的方法,通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理。

spring提出了依赖注入的思想,即依赖不由程序员控制,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。

spring有4种依赖注入方式:

  1. Set方法注入
  2. 构造器注入
  3. 静态工厂的方法注入
  4. 实例工厂的方法注入

按照实现方式分为两类:

  1. 注解(如@Autowired)
  2. 配置文件(如xml)

以下对于4种依赖注入方式,分别使用两种实现方式来实现

1、Set方法注入

Set方法注入是最简单、最常用的注入方式。

1.1 注解注入:

package com.obob.dao;public class UserDao {public void login() {System.out.println("login...");}
}
package com.obob.service;
import org.springframework.beans.factory.annotation.Autowired;
import com.obob.dao.UserDao;public class UserService {//注解注入(autowire注解默认使用类型注入)@Autowiredprivate UserDao userDao;public void login() {userDao.login();}
}

1.2 配置文件注入

UserDao定义不变,UserService去掉注解

package com.obob.service;
import org.springframework.beans.factory.annotation.Autowired;
import com.obob.dao.UserDao;public class UserService {private UserDao userDao;public void login() {userDao.login();}
}

然后使用配置文件:

<bean name="userService" class="com.obob.service.UserService"><property name="userDao" ref="userDao" />
</bean>
<bean name="userDao" class="com.obob.dao.UserDao"></bean>

2、构造方法注入

构造方法注入是指带有参数的构造函数注入

2.1 注解注入:

package com.obob.service;import org.springframework.beans.factory.annotation.Autowired;import com.obob.dao.UserDao;public class UserService {private UserDao userDao;//注解到构造方法处@Autowiredpublic UserService(UserDao userDao) {this.userDao = userDao;}public void login() {userDao.login();}
}

2.2 配置文件注入

UserService

package com.obob.service;import org.springframework.beans.factory.annotation.Autowired;import com.obob.dao.UserDao;public class UserService {private UserDao userDao;public UserService(UserDao userDao) {this.userDao = userDao;}public void login() {userDao.login();}
}

配置文件:

<bean name="userService" class="com.obob.service.UserService"><constructor-arg index="0" ref="userDao"></constructor-arg>
</bean>
<bean name="userDao" class="com.obob.dao.UserDao"></bean>

3、静态工厂的方法注入

静态工厂顾名思义,就是通过调用静态工厂的方法来获取自己需要的对象。
为了使用Spring的依赖注入IOC,我们不直接通过"工程类.静态方法()"来获取对象,而是依然通过spring注入的形式获取:

此种方式无通过注解注入

3.1 配置文件注入

UserService

package com.obob.service;import com.obob.dao.UserDao;public class UserService {private UserDao userDao;public void login() {userDao.login();}
}

Factory

package com.obob;import com.obob.dao.UserDao;public class Factory {public static UserDao initUserDao() {return new UserDao();}
}

配置文件:

<bean name="userService" class="com.obob.service.UserService"><property name="staticUserDao" ref="staticUserDao" />
</bean>
<bean name="staticUserDao" class="com.obob.Factory" factory-method="initUserDao"></bean>

4、实例工厂的方法注入

实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先new工厂类,再调用普通的实例方法:

此种方式无通过注解注入

4.1 配置文件注入

UserService

package com.obob.service;import com.obob.dao.UserDao;public class UserService {private UserDao userDao;public void login() {userDao.login();}
}

Factory

package com.obob;import com.obob.dao.UserDao;public class Factory {public UserDao initUserDao() {return new UserDao();}
}

配置文件:

<bean name="userService" class="com.obob.service.UserService"><property name="staticUserDao" ref="staticUserDao" />
</bean>
<bean name="staticUserDao" factory-bean="factory" factory-method="initUserDao"></bean>
<bean name="factory" class="com.obob.Factory"></bean>

5、总结

这四种方式,最常用的是1和2(set方法、构造方法注入)

spring四种依赖注入方式相关推荐

  1. 所需依赖_注意细节,阿里架构师一文详解SpringDI的四种依赖注入方式

    SpringDI(依赖注入) 一.DI概述 Dependency Injection即为依赖注入,简称DI. 简单来说,在Spring创建对象的同时,为其属性赋值,称之为依赖注入. 形象来说,组件之间 ...

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

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

  3. spring常用的三种依赖注入方式

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

  4. 【闲谈】论Spring的三种依赖注入方式

    知识点科普: IOC和DI:IOC是控制反转,DI是依赖注入.DI是行为,而IOC是实现这一行为的容器. 循环依赖:指类与类之间互相依赖的情况,比如有类A和类B,类A中依赖类B,类B中依赖类A,由此导 ...

  5. ASP.NET Core应用的7种依赖注入方式

    ASP.NET Core框架中的很多核心对象都是通过依赖注入方式提供的,如用来对应用进行初始化的Startup对象.中间件对象,以及ASP.NET Core MVC应用中的Controller对象和V ...

  6. Spring:Bean依赖注入方式

    目录 1 依赖注入方式 1.1 创建maven工程 pom.xml 1.2 创建bean Student.java Teacher.java 1.3 创建配置文件 applicationContext ...

  7. Spring 的3种依赖注入方式

    1.属性注入: 通过setter方法注入Bean的属性值或依赖的对象 属性注入使用<proper>元素,使用Bean属性指定Bean的属性名称,value属性或<Value>子 ...

  8. angular的几种依赖注入方式

    1.useClass 提供器的一种写法是这样的 providers: [...Service...], 其完全写法为 providers: [{provide:Service,useClass:Ser ...

  9. DI的三种依赖注入方式和底层实现

    bean 标签来表示一个对象:id 是一个对象的唯一标识:class 是类的全路径: 为对象的属性赋值 1. 设值注入 底层实现set方法赋值 ref 引用其它对象,对象的嵌套 2. 构造注入 底层实 ...

最新文章

  1. MTU(最大传输单元)
  2. mysql5.6 centos编译部署
  3. formal method 2月23日第八课的内容!schema calculus!
  4. xcode svn commit is not under version control 和 git常用指令
  5. VSCode 初次写vue项目并一键生成.vue模版
  6. springcloud 相同服务名_SpringCloud系列之SpringCloud Stream
  7. java流与文件——java生成解压缩文件(夹)
  8. python单元测试mock_Mock 在 Python 单元测试中的使用
  9. 从结构体、内存池初始化到申请释放,详细解读鸿蒙轻内核的动态内存管理
  10. 如何处理好与孩子沟通的关系?
  11. 2016.9.18 --- Shenyang ol
  12. java网络爬虫模拟登录案例教学2
  13. Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference (纯整数计算)
  14. 电脑桌面的计算机图标都不见了,如何解决电脑桌面的图标都不见了的问题
  15. robots.txt文件的Disallow和Allow行的区别
  16. 如何用matlab解异或方程,Matlab-6:解非线性方程组newton迭代法
  17. java红宝石是哪本_AES Java编码,红宝石解码
  18. 2022南阳理工计科ACM计科TC招新热身赛题解
  19. ipad协议最新版本
  20. ThreadPoolTaskScheduler实现动态管理定时任务

热门文章

  1. 一套完整的导视设计案例_色彩导视艺术:乌克兰基辅语言学校导视设计案例
  2. ​如何在图书馆收获一段爱情?​
  3. 爱泼斯坦事件发酵,MIT师生发起抗议逼迫校长Rafael Reif辞职
  4. 百度地图大数据告诉你一线城市真相
  5. 仿真模拟,需要注意这几点!
  6. php 合成图片 透明,2020-05-19 php实现透明png多图合成
  7. spring 单例 获取多例的位_Spring系列第6篇:玩转bean scope,避免跳坑里!
  8. 手把手教你java快速过滤关键词
  9. python中字典长度可变吗_python中列表长度可变吗
  10. fb静态区域_fb 静态数据