0%

spring依赖注入

spring依赖注入

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

1
2
3
4
5
6
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的属性值或依赖的对象,是最常用的注入方式

1
2
3
4
5
6
7
<!-- property来配置属性  
name为属性名
value为属性值
-->
<bean id="helloWorld" class="com.zhanghe.study.spring4.beans.helloworld.HelloWorld">
<property name="name" value="Spring Hello"/>
</bean>
构造器注入

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

1
2
3
4
5
<!-- 可以使用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可以搭配使用

1
2
3
4
5
6
7
8
9
public Car(String brand, double price) {
this.brand = brand;
this.price = price;
}

public Car(String brand, int speed) {
this.brand = brand;
this.speed = speed;
}
1
2
3
4
5
6
7
8
9
<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>

欢迎关注我的其它发布渠道