spring依赖注入

spring依赖注入

在没有依赖注入之前,我们想要什么都需要自己主动地去获取

java 复制代码
private Car car;
private House house;
public Person(){
  car = new Car();
  house = new House();
}

但是我们真正只是需要调用该依赖对象做某些事情,只要在用的时候,该对象是可以调用的就可以,该对象是主动获取还是别人送过来并没有太大的区别

IOC&&DI

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,用来降低耦合度,IOC(Inversion of Control)目前比较流行的有两种方式:

  • 依赖注入DI(Dependency Injection) 代码中无需给出目标对象的定位路径,只需给定对象名称和类型,系统就会直接去容器中进行查找,spring使用的就是这种形式

  • 依赖查找DL(Dependency Lookup) 代码中需要给出目标对象的存放路径,系统会根据路径到容器中查找响应的对象,典型的应用是JNDI

org.springframework.beans.factory.BeanFactory是IOC容器的接口定义,是Spring IOC容器的核心接口

Spring IOC本质是创建类实例的工厂,并且对类实例进行管理,负责创建对象,管理对象,装配对象,配置对象,并且管理这些对象的整个生命周期。

优点:把应用的代码量降到最低。最小代价和最小侵入式是松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载

DI依赖注入是IOC的一个方面,不需要创建对象,只需描述如何被创建,在配置文件中描述组件需要哪些服务,之后IOC容器进行组装

IOC的注入方式:1、构造器依赖注入 2、Setter方法注入 3、属性注入(使用注解标注,通过反射注入到field)

在《spring揭秘》中提到接口注入,实现某个接口,该接口中会声明一个方法,该方法的参数就是所依赖的对象类型,当然这种方式过于繁琐,早就被淘汰了,毕竟是spring2.5

Setter方法注入

通过Setter方法注入bean的属性值或依赖的对象,是最常用的注入方式

xml 复制代码
<!-- property来配置属性  
	name为属性名
 	value为属性值
-->
<bean id="helloWorld" class="com.zhanghe.study.spring4.beans.helloworld.HelloWorld">
  <property name="name" value="Spring Hello"/>
</bean>
构造器注入

构造器注入需要提供相应的构造器

xml 复制代码
<!-- 可以使用index来指定参数的顺序,默认是按照先后顺序 -->
<bean id="car" class="com.zhanghe.study.spring4.beans.beantest.Car">
  <constructor-arg value="法拉利" index="0"/>
  <constructor-arg value="200" index="1"/>
</bean>

但是如果存在重载的构造器的话,只使用index索引方式无法进行精确匹配,还需要使用类型type来进行区分,index和type可以搭配使用

java 复制代码
public Car(String brand, double price) {
  this.brand = brand;
  this.price = price;
}

public Car(String brand, int speed) {
  this.brand = brand;
  this.speed = speed;
}
xml 复制代码
<bean id="car" class="com.zhanghe.study.spring4.beans.beantest.Car">
  <constructor-arg value="法拉利" index="0"/>
  <constructor-arg value="20000.0" type="double"/>
</bean>

<bean id="car2" class="com.zhanghe.study.spring4.beans.beantest.Car">
  <constructor-arg value="玛莎拉蒂" index="0"/>
  <constructor-arg value="250" type="int"/>
</bean>

zhhll.icu/2021/框架/spr...

本文由mdnice多平台发布

相关推荐
泉城老铁3 分钟前
springboot实现对接poi 导出excel折线图
java·spring boot·后端
金銀銅鐵20 分钟前
[Java] 如何自动生成简单的 Mermaid 类图
java·后端
纵横八荒34 分钟前
Java基础加强13-集合框架、Stream流
java·开发语言
稚辉君.MCA_P8_Java1 小时前
kafka解决了什么问题?mmap 和sendfile
java·spring boot·分布式·kafka·kubernetes
乄bluefox1 小时前
保姆级docker部署nacos集群
java·docker·容器
欣然~1 小时前
百度地图收藏地址提取与格式转换工具 说明文档
java·开发语言·dubbo
玩毛线的包子1 小时前
Android Gradle学习(十三)- 配置读取和文件写入
java
青岛少儿编程-王老师2 小时前
CCF编程能力等级认证GESP—C++6级—20250927
java·c++·算法
一條狗2 小时前
学习日报 20251007|深度解析:基于 Guava LoadingCache 的优惠券模板缓存设计与实现
java·oracle·loadingcache
Miraitowa_cheems2 小时前
LeetCode算法日记 - Day 64: 岛屿的最大面积、被围绕的区域
java·算法·leetcode·决策树·职场和发展·深度优先·推荐算法