spring四种依赖注入方式
平常的java开发中,程序员在某个类中需要依赖其它类的方法,通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理。
spring提出了依赖注入的思想,即依赖不由程序员控制,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。
spring有4种依赖注入方式:
- Set方法注入
- 构造器注入
- 静态工厂的方法注入
- 实例工厂的方法注入
按照实现方式分为两类:
- 注解(如@Autowired)
- 配置文件(如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四种依赖注入方式相关推荐
- 所需依赖_注意细节,阿里架构师一文详解SpringDI的四种依赖注入方式
SpringDI(依赖注入) 一.DI概述 Dependency Injection即为依赖注入,简称DI. 简单来说,在Spring创建对象的同时,为其属性赋值,称之为依赖注入. 形象来说,组件之间 ...
- Spring中IoC两种接口和两种依赖注入方式的比较
spring是一个开源框架,是为了解决企业应用程序开发的复杂性而创建的,为J2EE应用程序开发提供集成的框架.简单来说,spring是一个轻量级的控制反转IOC和面向切面AOP的容器框架.spring ...
- spring常用的三种依赖注入方式
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...
- 【闲谈】论Spring的三种依赖注入方式
知识点科普: IOC和DI:IOC是控制反转,DI是依赖注入.DI是行为,而IOC是实现这一行为的容器. 循环依赖:指类与类之间互相依赖的情况,比如有类A和类B,类A中依赖类B,类B中依赖类A,由此导 ...
- ASP.NET Core应用的7种依赖注入方式
ASP.NET Core框架中的很多核心对象都是通过依赖注入方式提供的,如用来对应用进行初始化的Startup对象.中间件对象,以及ASP.NET Core MVC应用中的Controller对象和V ...
- Spring:Bean依赖注入方式
目录 1 依赖注入方式 1.1 创建maven工程 pom.xml 1.2 创建bean Student.java Teacher.java 1.3 创建配置文件 applicationContext ...
- Spring 的3种依赖注入方式
1.属性注入: 通过setter方法注入Bean的属性值或依赖的对象 属性注入使用<proper>元素,使用Bean属性指定Bean的属性名称,value属性或<Value>子 ...
- angular的几种依赖注入方式
1.useClass 提供器的一种写法是这样的 providers: [...Service...], 其完全写法为 providers: [{provide:Service,useClass:Ser ...
- DI的三种依赖注入方式和底层实现
bean 标签来表示一个对象:id 是一个对象的唯一标识:class 是类的全路径: 为对象的属性赋值 1. 设值注入 底层实现set方法赋值 ref 引用其它对象,对象的嵌套 2. 构造注入 底层实 ...
最新文章
- MTU(最大传输单元)
- mysql5.6 centos编译部署
- formal method 2月23日第八课的内容!schema calculus!
- xcode svn commit is not under version control 和 git常用指令
- VSCode 初次写vue项目并一键生成.vue模版
- springcloud 相同服务名_SpringCloud系列之SpringCloud Stream
- java流与文件——java生成解压缩文件(夹)
- python单元测试mock_Mock 在 Python 单元测试中的使用
- 从结构体、内存池初始化到申请释放,详细解读鸿蒙轻内核的动态内存管理
- 如何处理好与孩子沟通的关系?
- 2016.9.18 --- Shenyang ol
- java网络爬虫模拟登录案例教学2
- Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference (纯整数计算)
- 电脑桌面的计算机图标都不见了,如何解决电脑桌面的图标都不见了的问题
- robots.txt文件的Disallow和Allow行的区别
- 如何用matlab解异或方程,Matlab-6:解非线性方程组newton迭代法
- java红宝石是哪本_AES Java编码,红宝石解码
- 2022南阳理工计科ACM计科TC招新热身赛题解
- ipad协议最新版本
- ThreadPoolTaskScheduler实现动态管理定时任务
热门文章
- 一套完整的导视设计案例_色彩导视艺术:乌克兰基辅语言学校导视设计案例
- ​如何在图书馆收获一段爱情?​
- 爱泼斯坦事件发酵,MIT师生发起抗议逼迫校长Rafael Reif辞职
- 百度地图大数据告诉你一线城市真相
- 仿真模拟,需要注意这几点!
- php 合成图片 透明,2020-05-19 php实现透明png多图合成
- spring 单例 获取多例的位_Spring系列第6篇:玩转bean scope,避免跳坑里!
- 手把手教你java快速过滤关键词
- python中字典长度可变吗_python中列表长度可变吗
- fb静态区域_fb 静态数据