当前位置:   article > 正文

Spring DI简介及依赖注入方式和依赖注入类型

依赖注入

目录

一、什么是依赖注入

二、依赖注入方式

1. Setter注入

2. 构造方法注入

3. 自动注入 

三、依赖注入类型

1. 注入bean类型

2. 注入基本数据类型

3. 注入List集合

4. 注入Set集合

5. 注入Map集合

6. 注入Properties对象

往期专栏&文章相关导读 

1. Maven系列专栏文章

2. Mybatis系列专栏文章

3. Spring系列专栏文章


一、什么是依赖注入

依赖注入(Dependency Injection,简称DI),它是Spring控制反转思想的具体实现。
控制反转将对象的创建交给了Spring,但是对象中可能会依赖其他对象。比如service类中要有dao类的属性,我们称service依赖于dao。之前需要手动注入属性值,代码如下:

public interface StudentDao {
  Student findById(int id);
}
public class StudentDaoImpl implements StudentDao{
  @Override
  public Student findById(int id) {
    // 模拟根据id查询学生
    return new Student(1,"程序员","北京");
 }
}
public class StudentService {

   // service依赖dao,手动注入属性值,即手动维护依赖关系
  private StudentDao studentDao = new StudentDaoImpl();
  public Student findStudentById(int id){
    return studentDao.findById(id);
 }
}

        此时,当StudentService的想要使用StudentDao的另一个实现类如StudentDaoImpl2时,则需要修改Java源码,造成代码的可维护性降低。

        而使用Spring框架后,Spring管理Service对象与Dao对象,此时它能够为Service对象注入依赖的Dao属性值。这就是Spring的依赖注入。简单来说,控制反转是创建对象,依赖注入是为对象的属性赋值

二、依赖注入方式

1. Setter注入

被注入类编写属性的setter方法

  1. public void setStudentDao(StudentDao studentDao){
  2. this.studentDao = studentDao;
  3. }

配置文件中,给需要注入属性值的 <bean> 中设置 <property>

  1. <bean id="studentDao" class="com.itbaizhan.dao.StudentDaoImpl"> </bean>
  2. <bean id="studentService" class="com.itbaizhan.service.StudentService">
  3.   <!--依赖注入-->
  4.   <!--name:对象的属性名 ref:容器中对象的id值-->
  5.   <property name="studentDao" ref="studentDao"></property>
  6. </bean>

测试 

新增测试方法

  1. // 测试依赖注入
  2. @Test
  3. public void t6(){
  4. ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
  5. StudentService service = (StudentService) ac.getBean("studentService");
  6. System.out.println(service.findStudentById(8));
  7. }

运行结果 

OK,确实成功测试到了 

2. 构造方法注入

被注入类编写有参的构造方法

  1. public StudentService(StudentDao studentDao){
  2. this.studentDao = studentDao;
  3. }

给需要注入属性值的 <bean> 中设置 <constructor-arg>

  1. <bean id="studentDao" class="com.itbaizhan.dao.StudentDaoImpl"></bean>
  2. <bean id="studentService" class="com.itbaizhan.service.StudentService">
  3.   <!-- 依赖注入 -->
  4.   <!-- name:对象的属性名 ref:配置文件中注入对象的id值 -->
  5.   <constructor-arg name="studentDao" ref="studentDao"></constructor-arg>
  6. </bean>

测试结果: 

OK,确实也是可以使用的 

3. 自动注入 

        自动注入不需要在 <bean> 标签中添加其他标签注入属性值,而是自动从容器中找到相应的bean对象设置为属性值。

自动注入有两种配置方式:

  • 全局配置:在 <beans> 中设置 default-autowire 属性可以定义所有bean对象的自动注入策略。
  • 局部配置:在 <bean> 中设置 autowire 属性可以定义当前bean对象的自动注入策略。

autowire的取值如下:

  • no:不会进行自动注入。
  • default:全局配置default相当于no,局部配置default表示使用全局配置
  • byName:在Spring容器中查找id与属性名相同的bean,并进行注入。需要提供set方法。
  • byType:在Spring容器中查找类型与属性类型相同的bean,并进行注入。需要提供set方法。
  • constructor:在Spring容器中查找id与属性名相同的bean,并进行注入。需要提供构造方法。

三、依赖注入类型

        DI支持注入bean类型、基本数据类型和字符串、List集合、Set集合、Map集合、Properties对象类型等,他们的写法如下:

准备注入属性的类 

  1. package com.example.service;
  2. import com.example.dao.StudentDao;
  3. import com.example.pojo.Student;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.Properties;
  7. import java.util.Set;
  8. public class StudentService {
  9. // service依赖dao,手动注入属性值,即手动维护依赖关系
  10. //private StudentDao studentDao;
  11. // bean属性
  12. private StudentDao studentDao;
  13. // 字符串类型
  14. private String name;
  15. // 基本数据类型
  16. private int count;
  17. // 字符串List集合
  18. private List<String> students1;
  19. // 对象类型List集合
  20. private List<Student> nameList;
  21. // 字符串类型Set集合
  22. private Set<String> students2;
  23. // 字符串类型Map集合
  24. private Map<String, String> students3;
  25. // 对象类型map集合
  26. private Map<String,Student> studentMap;
  27. // Properties类型
  28. private Properties properties;
  29. public StudentService(){}
  30. public StudentService(StudentDao studentDao){
  31. this.studentDao = studentDao;
  32. }
  33. public Student findStudentById(int id){
  34. return studentDao.findById(id);
  35. }
  36. public void setStudentDao(StudentDao studentDao){
  37. this.studentDao = studentDao;
  38. }
  39. public StudentDao getStudentDao() {
  40. return studentDao;
  41. }
  42. public String getName() {
  43. return name;
  44. }
  45. public void setName(String name) {
  46. this.name = name;
  47. }
  48. public int getCount() {
  49. return count;
  50. }
  51. public void setCount(int count) {
  52. this.count = count;
  53. }
  54. public List<String> getStudents1() {
  55. return students1;
  56. }
  57. public void setStudents1(List<String> students1) {
  58. this.students1 = students1;
  59. }
  60. public Set<String> getStudents2() {
  61. return students2;
  62. }
  63. public void setStudents2(Set<String> students2) {
  64. this.students2 = students2;
  65. }
  66. public Map<String, String> getNames2() {
  67. return students3;
  68. }
  69. public void setNames2(Map<String, Student> names2) {
  70. this.studentMap = names2;
  71. }
  72. public Map<String, String> getStudents3() {
  73. return students3;
  74. }
  75. public void setStudents3(Map<String, String> students3) {
  76. this.students3 = students3;
  77. }
  78. public Properties getProperties() {
  79. return properties;
  80. }
  81. public void setProperties(Properties properties) {
  82. this.properties = properties;
  83. }
  84. public List<Student> getNameList() {
  85. return nameList;
  86. }
  87. public void setNameList(List<Student> nameList) {
  88. this.nameList = nameList;
  89. }
  90. @Override
  91. public String toString() {
  92. return "StudentService[ " +
  93. "studentDao=" + studentDao +
  94. ", name='" + name + '\'' +
  95. ", count=" + count +
  96. ", students1=" + students1 +
  97. ", nameList=" + nameList +
  98. ", students2=" + students2 +
  99. ", students3=" + students3 +
  100. ", studentMap=" + studentMap +
  101. ", properties=" + properties +
  102. " ]";
  103. }
  104. }

准备测试方法

  1. // 测试注入类型
  2. @Test
  3. public void t7(){
  4. ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
  5. StudentService service = (StudentService) ac.getBean("studentService");
  6. System.out.println(service);
  7. }

1. 注入bean类型

  1. <!-- 注入bean类型 -->
  2. <bean id="studentDao" class="com.example.dao.StudentDaoImpl1"/>
  3. <!-- 写法1 -->
  4. <bean id="studentService" class="com.example.service.StudentService">
  5. <property name="studentDao" ref="studentDao"/>
  6. </bean>
  7. <!-- 写法2 -->
  8. <!--<bean id="studentService" class="com.example.service.StudentService">
  9. <property name="studentDao">
  10. <ref bean="studentDao"/>
  11. </property>
  12. </bean>-->

2. 注入基本数据类型

  1. <!-- 注入基本数据类型 -->
  2. <!-- 写法一 name:属性名 value:属性值 -->
  3. <property name="name" value="程序员"/>
  4. <!-- 写法二 name:属性名 value:属性值-->
  5. <property name="count">
  6. <value>10</value>
  7. </property>

3. 注入List集合

  1. <!-- 注入List集合 -->
  2. <!-- 简单的数据类型List集合 name:属性名 -->
  3. <property name="students1" >
  4. <list>
  5. <value>上海</value>
  6. <value>广州</value>
  7. </list>
  8. </property>
  9. <!-- 对象类型的List集合 name:属性名 -->
  10. <property name="nameList">
  11. <list>
  12. <bean class="com.example.pojo.Student">
  13. <property name="id" value="1"/>
  14. <property name="name" value="几何心凉"/>
  15. <property name="address" value="北京"/>
  16. </bean>
  17. <bean class="com.example.pojo.Student">
  18. <property name="id" value="2"/>
  19. <property name="name" value="哈士奇"/>
  20. <property name="address" value="上海"/>
  21. </bean>
  22. </list>
  23. </property>

4. 注入Set集合

  1. <!-- 注入Set集合 -->
  2. <property name="students2">
  3. <set>
  4. <value>深圳</value>
  5. <value>北京</value>
  6. </set>
  7. </property>

5. 注入Map集合

  1. <!-- 注入Map集合 -->
  2. <property name="students3">
  3. <map>
  4. <entry key="哈士奇" value="上海"/>
  5. <entry key="几何心凉" value="北京"/>
  6. </map>
  7. </property>
  8. <!-- 注入对象类型map类型 -->
  9. <property name="names2">
  10. <map>
  11. <entry key="student1" value-ref="s1"/>
  12. <entry key="student2" value-ref="s2"/>
  13. </map>
  14. </property>
  1. <bean id="s1" class="com.example.pojo.Student">
  2. <property name="id" value="1"/>
  3. <property name="name" value="几何心凉"/>
  4. <property name="address" value="北京"/>
  5. </bean>
  6. <bean id="s2" class="com.example.pojo.Student">
  7. <property name="id" value="2"/>
  8. <property name="name" value="哈士奇"/>
  9. <property name="address" value="上海"/>
  10. </bean>

 上面是用到的bean对象

6. 注入Properties对象

  1. <!-- 注入properties -->
  2. <property name="properties">
  3. <props>
  4. <prop key="配置1">值1</prop>
  5. <prop key="配置2">值2</prop>
  6. </props>
  7. </property>

运行测试方法测试一下

OK ,可以看到都是插入的了。

往期专栏&文章相关导读 

     大家如果对于本期内容有什么不了解的话也可以去看看往期的内容,下面列出了博主往期精心制作的Maven,Mybatis等专栏系列文章,走过路过不要错过哎!如果对您有所帮助的话就点点赞,收藏一下啪。其中Spring专栏有些正在更,所以无法查看,但是当博主全部更完之后就可以看啦。

1. Maven系列专栏文章

2. Mybatis系列专栏文章

3. Spring系列专栏文章

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/858311
推荐阅读
相关标签
  

闽ICP备14008679号