组件(bean)依赖注入配置(DI)

83 阅读3分钟

1. 目标

通过配置文件,实现IoC容器中Bean之间的引用(依赖注入DI配置)。

主要涉及注入场景:基于构造函数的依赖注入和基于 Setter 的依赖注入。

2.思路

image.png

基于构造函数的依赖注入(单个构造参数)

基于构造函数的 DI 是通过容器调用具有多个参数的构造函数来完成的,每个参数表示一个依赖项。

下面的示例演示一个只能通过构造函数注入进行依赖项注入的类!

1、准备组件类

public class UserDao {
}


public class UserService {
    
    private UserDao userDao;

    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }
}

2、编写配置文件

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
  
    <!-- 步骤一:将他们都存放在ioc容器中-->  
    <bean id="userDao" class="com.atguigu.ioc_02.UserDao"/>  

    <bean id="userService" class="com.atguigu.ioc_02.UserService">  
    <!--  
    构造参数传值di的配置  
    ref 引用其他的bean beanId值  
    value 直接属性值  
    -->  
    <constructor-arg ref="userDao"/>  
    </bean> 
</beans>

基于构造函数的依赖注入(多构造参数解析)

基于构造函数的 DI 是通过容器调用具有多个参数的构造函数来完成的,每个参数表示一个依赖项。

下面的示例演示通过构造函数注入多个参数,参数包含其他bean和基本数据类型!

1、准备组件类

public class UserDao {
}


public class UserService {
    
    private UserDao userDao;
    
    private int age;
    
    private String name;

    public UserService(int age , String name ,UserDao userDao) {
        this.userDao = userDao;
        this.age = age;
        this.name = name;
    }
}

2、编写配置文件

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
  
<!--多个构造参数注入-->  
<bean id="userService1" class="com.atguigu.ioc_02.UserService">  
<!-- 方案一,构造参数按顺序填写 value直接赋值 ref引用其他的beanid-->  
<constructor-arg value="18"/>  
<constructor-arg value="二狗子"/>  
<constructor-arg ref="userDao"/>  
</bean>  
  
<!--推荐方案2-->  
<bean>  
<!-- 方案2,按照构造参数的名称填写 name=构造参数的名字 不用考虑参数顺序-->  
<constructor-arg name="age" value="18"/>  
<constructor-arg name="name" value="二狗子"/>  
<constructor-arg name="userDao" ref="userDao"/>  
</bean>  
  
<bean>  
<!-- 方案3,按照参数的下角标指定填写,不用考虑参数的顺序 index=构造参数的下角标 从左到右 从0开始-->  
<constructor-arg index="1" value="二狗子"/>  
<constructor-arg index="0" value="18"/>  
<constructor-arg index="2" ref="userDao"/>  
</bean>  
  
</beans>

基于setter方法的注入

开发中,除了构造函数注入(DI)更多的使用的Setter方法进行注入!

下面的示例演示一个只能使用纯 setter 注入进行依赖项注入的类。

1、准备组件类

public Class MovieFinder{

}

public class SimpleMovieLister {

  private MovieFinder movieFinder;
  
  private String movieName;

  public void setMovieFinder(MovieFinder movieFinder) {
    this.movieFinder = movieFinder;
  }
  
  public void setMovieName(String movieName){
    this.movieName = movieName;
  }

  // business logic that actually uses the injected MovieFinder is omitted...
}

2、编写配置文件

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
  
<!-- 触发setter方法进行注入-->  
<bean id="movieFinder" class="com.atguigu.ioc_02.MovieFinder"/>  
  
<bean id="simpleMovieLister" class="com.atguigu.ioc_02.SimpleMovieLister">  
<!--  
name属性名 setter方法的去set和首字母小写的值!调用set方法的名  
setMovieFinder -> movieFinder  
  
value | ref 二选一 value="直接属性值" ref="其他bean的id"  
  
-->  
<property name="movieName" value="消失的她"></property>  
<property name="movieFinder" ref="movieFinder"></property>  

</bean>  
  
</beans>
  • property标签: 可以给setter方法对应的属性赋值
  • property 标签: name属性代表set方法标识、ref代表引用bean的标识id、value属性代表基本属性值

总结:

依赖注入(DI)包含引用类型和基本数据类型,同时注入的方式也有多种!主流的注入方式为setter方法注入和构造函数注入,两种注入语法都需要掌握!

需要特别注意:引用其他bean,使用ref属性。直接注入基本类型值,使用value属性。