1.依赖注入(Dependency Injection)

(1)IOC的作用:
  降低程序间的耦合(依赖关系)
(2)依赖关系的管理:
  以后都交给spring来维护
  在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明
(3)依赖关系的维护:
  就称之为依赖注入。
依赖注入:
  能注入的数据类型:基本类型和String、其他bean类型(在配置文件中或者注解配置过的bean)、复杂类型/集合类型。
注入的方式:有三种
  第一种:使用构造函数提供
  第二种:使用set方法提供
  第三种:使用注解提供

(4)应用案例搭建

<1>业务层的接口:IAccountService.java

  1. package service;
  2.  
  3. /**
  4. * 账户业务层的接口
  5. */
  6. public interface IAccountService {
  7.  
  8. /**
  9. * 模拟保存账户
  10. */
  11. void saveAccount();
  12. }

<2>业务层的接口实现类:AccountServiceImpl.java

  1. package service.impl;
  2. import service.IAccountService;
  3.  
  4. import java.util.Date;
  5.  
  6. /**
  7. * 账户的业务层实现类
  8. */
  9. public class AccountServiceImpl implements IAccountService {
  10.  
  11. //如果是经常变化的数据,并不适用于注入的方式
  12. private String name;
  13. private Integer age;
  14. private Date birthday;
  15.  
  16. public AccountServiceImpl(String name,Integer age,Date birthday){
  17. this.name = name;
  18. this.age = age;
  19. this.birthday = birthday;
  20. }
  21.  
  22. public AccountServiceImpl(){
  23. System.out.println("对象创建了");
  24. }
  25.  
  26. public void saveAccount(){
  27. System.out.println("AccountServiceImpl中的saveAccount方法执行了"+name+","+age+","+birthday);
  28. }
  29.  
  30. }

<3>表现层

  1. package ui;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. import service.IAccountService;
  5. import service.impl.AccountServiceImpl;
  6.  
  7. /**
  8. * 模拟一个表现层,用于调用业务层
  9. */
  10. public class Client {
  11.  
  12. /**
  13. * 获取spring的Ioc核心容器,并根据id获取对象
  14. *
  15. * ApplicationContext的三个常用实现类:
  16. * ClassPathXmlApplicationContext:它可以加载类路径下的配置文件,要求配置文件必须在类路径下。不在的话,加载不了。(更常用)
  17. * FileSystemXmlApplicationContext:它可以加载磁盘任意路径下的配置文件(必须有访问权限)
  18. *
  19. * AnnotationConfigApplicationContext:它是用于读取注解创建容器的,是明天的内容。
  20. *
  21. * 核心容器的两个接口引发出的问题:
  22. * ApplicationContext: 单例对象适用 采用此接口
  23. * 它在构建核心容器时,创建对象采取的策略是采用立即加载的方式。也就是说,只要一读取完配置文件马上就创建配置文件中配置的对象。
  24. *
  25. * BeanFactory: 多例对象使用
  26. * 它在构建核心容器时,创建对象采取的策略是采用延迟加载的方式。也就是说,什么时候根据id获取对象了,什么时候才真正的创建对象。
  27. * @param args
  28. */
  29. public static void main(String[] args) {
  30. //1.获取核心容器对象
  31. ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
  32.  
  33. //2.根据id获取Bean对象,注意id是在bean.xml文件配置的
  34. IAccountService as = (IAccountService)ac.getBean("accountService");
  35. as.saveAccount();
  36.  
  37. }
  38. }

(5)依赖注入

<1>使用构造函数注入(尽量不使用)

使用的标签:constructor-arg
标签出现的位置:bean标签的内部
标签中的属性
  type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型
  index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始
  name:用于指定给构造函数中指定名称的参数赋值 常用的
=============以上三个用于指定给构造函数中哪个参数赋值===============================
  value:用于提供基本类型和String类型的数据
  ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象

优势:
  在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功。
弊端:
  改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6.  
  7. <!--构造函数注入:
  8. 使用的标签:constructor-arg
  9. 标签出现的位置:bean标签的内部
  10. 标签中的属性
  11. type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型
  12. index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始
  13. name:用于指定给构造函数中指定名称的参数赋值 常用的
  14. =============以上三个用于指定给构造函数中哪个参数赋值===============================
  15. value:用于提供基本类型和String类型的数据
  16. ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象
  17.  
  18. 优势:
  19. 在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功。
  20. 弊端:
  21. 改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供。
  22. -->
  23. <bean id="accountService" class="service.impl.AccountServiceImpl" scope="prototype">
  24. <constructor-arg name="name" value="泰斯特"></constructor-arg>
  25. <constructor-arg name="age" value="18"></constructor-arg>
  26. <constructor-arg name="birthday" ref="now"></constructor-arg>
  27. </bean>
  28.  
  29. <!-- 配置一个日期对象 -->
  30. <bean id="now" class="java.util.Date"></bean>
  31.  
  32. </beans>

<2>set方法注入(最常用的方式)

涉及的标签:property
出现的位置:bean标签的内部
标签的属性
  name:用于指定注入时所调用的set方法名称
  value:用于提供基本类型和String类型的数据
  ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象
优势:
  创建对象时没有明确的限制,可以直接使用默认构造函数
弊端:
  如果有某个成员必须有值,则获取对象是有可能set方法没有执行。

  (1)普通数据类型的注入:

业务层的接口实现类:AccountServiceImpl2.java

  1. package service.impl;
  2. import service.IAccountService;
  3.  
  4. import java.util.Date;
  5.  
  6. /**
  7. * 账户的业务层实现类
  8. */
  9. public class AccountServiceImpl2 implements IAccountService {
  10.  
  11. //如果是经常变化的数据,并不适用于注入的方式
  12. private String name;
  13. private Integer age;
  14. private Date birthday;
  15.  
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19.  
  20. public void setAge(Integer age) {
  21. this.age = age;
  22. }
  23.  
  24. public void setBirthday(Date birthday) {
  25. this.birthday = birthday;
  26. }
  27.  
  28. public AccountServiceImpl2(){
  29. System.out.println("对象创建了");
  30. }
  31.  
  32. public void saveAccount(){
  33. System.out.println("AccountServiceImpl中的saveAccount方法执行了"+name+","+age+","+birthday);
  34. }
  35.  
  36. }

bean.xml配置如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6.  
  7. <!-- 配置一个日期对象 -->
  8. <bean id="now" class="java.util.Date"></bean>
  9.  
  10. <!-- set方法注入 更常用的方式
  11. 涉及的标签:property
  12. 出现的位置:bean标签的内部
  13. 标签的属性
  14. name:用于指定注入时所调用的set方法名称
  15. value:用于提供基本类型和String类型的数据
  16. ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象
  17. 优势:
  18. 创建对象时没有明确的限制,可以直接使用默认构造函数
  19. 弊端:
  20. 如果有某个成员必须有值,则获取对象是有可能set方法没有执行。
  21. -->
  22. <bean id="accountService2" class="service.impl.AccountServiceImpl2">
  23. <property name="name" value="TEST" ></property>
  24. <property name="age" value="21"></property>
  25. <property name="birthday" ref="now"></property>
  26. </bean>
  27.  
  28. </beans>

(2)复杂类型数据的注入:

复杂类型的注入/集合类型的注入
  (1)用于给List结构集合注入的标签:
    list array set
  (2)用于个Map结构集合注入的标签:
  map props
结构相同,标签可以互换

业务层的接口实现类:AccountServiceImpl3.java

  1. package service.impl;
  2.  
  3. import service.IAccountService;
  4.  
  5. import java.util.Arrays;
  6. import java.util.List;
  7. import java.util.Properties;
  8. import java.util.Set;
  9. import java.util.Map;
  10.  
  11. /**
  12. * 账户的业务层实现类
  13. */
  14. public class AccountServiceImpl3 implements IAccountService {
  15.  
  16. private String[] myStrs;
  17. private List<String> myList;
  18. private Set<String> mySet;
  19. private Map<String,String> myMap;
  20. private Properties myProps;
  21.  
  22. public void setMyStrs(String[] myStrs) {
  23. this.myStrs = myStrs;
  24. }
  25.  
  26. public void setMyList(List<String> myList) {
  27. this.myList = myList;
  28. }
  29.  
  30. public void setMySet(Set<String> mySet) {
  31. this.mySet = mySet;
  32. }
  33.  
  34. public void setMyMap(Map<String, String> myMap) {
  35. this.myMap = myMap;
  36. }
  37.  
  38. public void setMyProps(Properties myProps) {
  39. this.myProps = myProps;
  40. }
  41.  
  42. public void saveAccount(){
  43. System.out.println(Arrays.toString(myStrs));
  44. System.out.println(myList);
  45. System.out.println(mySet);
  46. System.out.println(myMap);
  47. System.out.println(myProps);
  48. }
  49.  
  50. }

bean.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6.  
  7. <!--构造函数注入:
  8. 使用的标签:constructor-arg
  9. 标签出现的位置:bean标签的内部
  10. 标签中的属性
  11. type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型
  12. index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始
  13. name:用于指定给构造函数中指定名称的参数赋值 常用的
  14. =============以上三个用于指定给构造函数中哪个参数赋值===============================
  15. value:用于提供基本类型和String类型的数据
  16. ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象
  17.  
  18. 优势:
  19. 在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功。
  20. 弊端:
  21. 改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供。
  22. -->
  23. <bean id="accountService" class="service.impl.AccountServiceImpl" scope="prototype">
  24. <constructor-arg name="name" value="泰斯特"></constructor-arg>
  25. <constructor-arg name="age" value="18"></constructor-arg>
  26. <constructor-arg name="birthday" ref="now"></constructor-arg>
  27. </bean>
  28.  
  29. <!-- 配置一个日期对象 -->
  30. <bean id="now" class="java.util.Date"></bean>
  31.  
  32. <!-- 复杂类型的注入/集合类型的注入
  33. 用于给List结构集合注入的标签:
  34. list array set
  35. 用于个Map结构集合注入的标签:
  36. map props
  37. 结构相同,标签可以互换
  38. -->
  39. <bean id="accountService3" class="service.impl.AccountServiceImpl3">
  40. <property name="myStrs">
  41. <set>
  42. <value>AAA</value>
  43. <value>BBB</value>
  44. <value>CCC</value>
  45. </set>
  46. </property>
  47.  
  48. <property name="myList">
  49. <array>
  50. <value>AAA</value>
  51. <value>BBB</value>
  52. <value>CCC</value>
  53. </array>
  54. </property>
  55.  
  56. <property name="mySet">
  57. <list>
  58. <value>AAA</value>
  59. <value>BBB</value>
  60. <value>CCC</value>
  61. </list>
  62. </property>
  63.  
  64. <property name="myMap">
  65. <props>
  66. <prop key="testC">ccc</prop>
  67. <prop key="testD">ddd</prop>
  68. </props>
  69. </property>
  70.  
  71. <property name="myProps">
  72. <map>
  73. <entry key="testA" value="aaa"></entry>
  74. <entry key="testB">
  75. <value>BBB</value>
  76. </entry>
  77. </map>
  78. </property>
  79. </bean>
  80.  
  81. </beans>

表现层代码:

  1. package ui;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. import service.IAccountService;
  5. import service.impl.AccountServiceImpl;
  6.  
  7. /**
  8. * 模拟一个表现层,用于调用业务层
  9. */
  10. public class Client {
  11.  
  12. /**
  13. * 获取spring的Ioc核心容器,并根据id获取对象
  14. *
  15. * ApplicationContext的三个常用实现类:
  16. * ClassPathXmlApplicationContext:它可以加载类路径下的配置文件,要求配置文件必须在类路径下。不在的话,加载不了。(更常用)
  17. * FileSystemXmlApplicationContext:它可以加载磁盘任意路径下的配置文件(必须有访问权限)
  18. *
  19. * AnnotationConfigApplicationContext:它是用于读取注解创建容器的,是明天的内容。
  20. *
  21. * 核心容器的两个接口引发出的问题:
  22. * ApplicationContext: 单例对象适用 采用此接口
  23. * 它在构建核心容器时,创建对象采取的策略是采用立即加载的方式。也就是说,只要一读取完配置文件马上就创建配置文件中配置的对象。
  24. *
  25. * BeanFactory: 多例对象使用
  26. * 它在构建核心容器时,创建对象采取的策略是采用延迟加载的方式。也就是说,什么时候根据id获取对象了,什么时候才真正的创建对象。
  27. * @param args
  28. */
  29. public static void main(String[] args) {
  30. //1.获取核心容器对象
  31. ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
  32.  
  33. //2.根据id获取Bean对象,注意id是在bean.xml文件配置的
  34. IAccountService as = (IAccountService)ac.getBean("accountService3");
  35. as.saveAccount();
  36.  
  37. }
  38. }

控制台输出:

09 Spring的依赖注入的更多相关文章

  1. (spring-第3回【IoC基础篇】)spring的依赖注入-属性、构造函数、工厂方法等的注入(基于XML)

    Spring要把xml配置中bean的属性实例化为具体的bean,"依赖注入"是关卡.所谓的"依赖注入",就是把应用程序对bean的属性依赖都注入到spring ...

  2. Spring的依赖注入(DI)三种方式

    Spring依赖注入(DI)的三种方式,分别为: 1.  接口注入 2.  Setter方法注入 3.  构造方法注入 下面介绍一下这三种依赖注入在Spring中是怎么样实现的. 首先我们需要以下几个 ...

  3. spring的依赖注入的最常见的两种方法

    package com.lsz.spring.action; public class User { /** * set注入 */ private String username; public vo ...

  4. 一步一步深入spring(3)--spring的依赖注入方式

    对于spring配置一个bean时,如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象的过程,sprin ...

  5. spring的依赖注入是什么意思

    最近学习spring框架,对依赖注入有些模糊,遂上网翻阅资料,做了下列总结,原博客为CSDN 南夏的 spring的依赖注入是什么意思,侵删! Spring 能有效地组织J2EE应用各层的对象.不管是 ...

  6. SpringBoot系列: 理解 Spring 的依赖注入(一)

    ==============================Spring 的依赖注入==============================对于 Spring 程序, Spring 框架为我们提供 ...

  7. Spring.NET依赖注入框架学习--实例化容器常用方法

    Spring.NET依赖注入框架学习---实例化容器常用方法 本篇学习实例化Spring.NET容器的俩种方式 1.通过XmlObjectFactory创建一个Spring.NET容器 IResour ...

  8. Spring.NET依赖注入框架学习--简单对象注入

    Spring.NET依赖注入框架学习--简单对象注入 在前面的俩篇中讲解了依赖注入的概念以及Spring.NET框架的核心模块介绍,今天就要看看怎么来使用Spring.NET实现一个简单的对象注入 常 ...

  9. Spring.NET依赖注入框架学习--简介

    Spring.NET依赖注入框架学习--Spring.NET简介 概述 Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序.它提供了很多方面的功能,比如依赖注入. ...

随机推荐

  1. [转]windows10下安装与激活rational rose 2003

    Rational Rose2003安装+激活教程(Win10)(另附安装包+激活软件) 原文链接:https://blog.csdn.net/qq_38388811/article/details/8 ...

  2. 小a的学期 (组合数取模模板)

    题目描述 小a是一个健忘的人,由于他经常忘记做作业,因此老师对他很恼火. 小a马上就要开学了,他学期一共2n 天,对于第i天,他有可能写了作业,也可能没写作业,不过他自己心里还有点B数,因此他会写恰好 ...

  3. if语句的嵌套:从键盘输入3个实数,求其最大值。

    #include<stdio.h>void main(){ float a,b,c,max; scanf("%f%f%f",&a,&b,&c); ...

  4. GoCN每日新闻(2019-10-12)

    GoCN每日新闻(2019-10-12) 1. Go 1.13中sync.Pool是如何优化的 https://colobu.com/2019/10/08/how-is-sync-Pool-impro ...

  5. allure-pytest 测试报告分享给大家

    allure-pytest生成测试报告,经过实践得出如下经验,参考了很多大神的博客一并附上 1.安装allure-pytest pip install allure-pytest 2.执行命令生成js ...

  6. ICEM-三角形特征几何

    原视频下载地址:https://pan.baidu.com/s/1qY8SKri 密码: wf17

  7. ubuntu之路——day16 只用python的numpy在底层检验神经网络的优化算法

    首先感谢这位博主整理的Andrew Ng的deeplearning.ai的相关作业:https://blog.csdn.net/u013733326/article/details/79827273 ...

  8. Vintage、滚动率、迁移率的应用

    python信用评分卡建模(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_ca ...

  9. Qt QSplitter任意拆分窗口

    Qt拆分窗口可以使用QSplitter,也可以使用比较容易使用布局控件来完成,本文章给出使用QSplitter分割窗口的例子. QSplitter 继承自QFrame,而QFrame又继承自QWidg ...

  10. ARM USB 通信(转)

    ARM USB 通信 采用ZLG的动态链接库,动态装载. ARM是Context-M3-1343. 在C++ Builder 6 中开发的上位机通信软件. USB通信代码如下: //--------- ...