ToB企服应用市场:ToB评测及商务社交产业平台

标题: 利用 Spring 实现控制反转和依靠注入 [打印本页]

作者: 去皮卡多    时间: 2024-6-25 19:04
标题: 利用 Spring 实现控制反转和依靠注入
利用<bean id="store"  autowire="byType"> </bean>Spring<bean id="store"  autowire="byType"> </bean>实现控制反转和依靠注入

概述

在本文中,我们将介绍IoC(控制反转)和DI(依靠注入)的概念,以及怎样在Spring框架中实现它们。
什么是控制反转?

控制反转是软件工程中的一个原则,它将对象或步伐的某些部分的控制权转移给容器或框架。我们最常在面向对象编程的上下文中利用它。
与传统编程相比,传统编程中我们的自界说代码调用库,而IoC使框架控制步伐的流程并调用我们的自界说代码。为了实现这一点,框架利用具有附加行为的抽象。假如我们想要添加自己的行为,我们必要扩展框架的类或插入自己的类。
这种架构的优点是:
什么是依靠注入?

依靠注入是一种我们可以用来实现IoC的模式,此中被反转的控制是设置对象的依靠项。
将对象与其他对象连接或将对象“注入”到其他对象中是由汇编步伐而不是对象本身完成的。
下面是在传统编程中创建对象依靠关系的方法:
  1. public<bean id="store"  autowire="byType"> </bean>class<bean id="store"  autowire="byType"> </bean>Store<bean id="store"  autowire="byType"> </bean>{
  2. private<bean id="store"  autowire="byType"> </bean>Item<bean id="store"  autowire="byType"> </bean>item;
  3. public<bean id="store"  autowire="byType"> </bean>Store()<bean id="store"  autowire="byType"> </bean>{
  4. <bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  5. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  6. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  7.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  8. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  9. </bean><bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  10. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  11. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  12.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  13. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  14. </bean>item<bean id="store"  autowire="byType"> </bean>=new<bean id="store"  autowire="byType"> </bean>ItemImpl1();
  15. <bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  16. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  17. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  18.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  19. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  20. </bean>}
  21. }
复制代码
在上面的示例中,我们必要在Store类本身中实例化Item接口的实现。
通过利用DI,我们可以重写该示例,而不指定我们想要的Item的实现:
  1. public<bean id="store"  autowire="byType"> </bean>class<bean id="store"  autowire="byType"> </bean>Store<bean id="store"  autowire="byType"> </bean>{
  2. private<bean id="store"  autowire="byType"> </bean>Item<bean id="store"  autowire="byType"> </bean>item;
  3. public<bean id="store"  autowire="byType"> </bean>Store(Item<bean id="store"  autowire="byType"> </bean>item)<bean id="store"  autowire="byType"> </bean>{
  4. <bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  5. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  6. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  7.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  8. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  9. </bean><bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  10. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  11. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  12.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  13. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  14. </bean>this.item<bean id="store"  autowire="byType"> </bean>=<bean id="store"  autowire="byType"> </bean>item;
  15. <bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  16. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  17. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  18.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  19. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  20. </bean>}
  21. }
复制代码
在接下来的几节中,我们将看看怎样通过元数据提供Item的实现。
IoC和DI都是简单的概念,但它们对我们构建系统的方式有深刻的影响,因此值得充实理解。
Spring<bean id="store"  autowire="byType"> </bean>IoC容器

IoC容器是实现IoC的框架的常见特性。
在Spring框架中,接口ApplicationContext表示IoC容器。Spring容器负责实例化、配置和组装称为bean的对象,以及管理它们的生命周期。
Spring框架提供了ApplicationContext接口的几个实现:ClassPathXmlApplicationContext和FileSystemXmlApplicationContext用于独立应用步伐,以及WebApplicationContext用于Web应用步伐。
为了组装bean,容器利用配置元数据,可以是XML配置或注释情势。
以下是手动实例化容器的一种方法:
  1. ApplicationContext<bean id="store"  autowire="byType"> </bean>context
  2. <bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>=newClassPathXmlApplicationContext("applicationContext.xml");
复制代码
在上面的示例中,我们可以利用元数据设置item属性,然后容器将读取此元数据并在运行时利用它来组装bean。
在Spring中,可以通过构造函数、setter或字段来进行依靠注入。
基于构造函数的依靠注入

在基于构造函数的依靠注入的环境下,容器将调用具有表示我们要设置的依靠项的参数的构造函数。
Spring通过类型解决每个参数,然后按属性名称和索引进行消歧。让我们看看利用注释配置bean及其依靠项的配置:
  1. @Configuration
  2. public<bean id="store"  autowire="byType"> </bean>class<bean id="store"  autowire="byType"> </bean>AppConfig<bean id="store"  autowire="byType"> </bean>{
  3. <bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  4. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  5. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  6.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  7. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  8. </bean>@Bean
  9. <bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  10. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  11. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  12.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  13. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  14. </bean>public<bean id="store"  autowire="byType"> </bean>Item<bean id="store"  autowire="byType"> </bean>item1()<bean id="store"  autowire="byType"> </bean>{
  15. <bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  16. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  17. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  18.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  19. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  20. </bean>return<bean id="store"  autowire="byType"> </bean>new<bean id="store"  autowire="byType"> </bean>ItemImpl1();
  21. <bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  22. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  23. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  24.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  25. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  26. </bean><bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  27. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  28. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  29.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  30. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  31. </bean>}
  32. <bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  33. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  34. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  35.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  36. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  37. </bean>@Bean
  38. <bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  39. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  40. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  41.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  42. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  43. </bean>public<bean id="store"  autowire="byType"> </bean>Store<bean id="store"  autowire="byType"> </bean>store()<bean id="store"  autowire="byType"> </bean>{
  44. <bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  45. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  46. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  47.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  48. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  49. </bean>return<bean id="store"  autowire="byType"> </bean>new<bean id="store"  autowire="byType"> </bean>Store(item1());
  50. <bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  51. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  52. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  53.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  54. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  55. </bean>}
  56. }
复制代码
@Configuration注释表示该类是bean界说的源。我们也可以将其添加到多个配置类中。
我们在方法上利用@Bean注释来界说bean。假如我们没有指定自界说名称,则bean名称将默认为方法名称。
对于默认的singleton范围的bean,Spring首先检查是否已存在缓存的bean实例,仅在不存在时创建新实例。假如我们利用prototype范围,则容器为每个方法调用返回一个新的bean实例。
创建bean的另一种方式是通过XML配置:
  1. <bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  2. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  3. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  4.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  5. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  6. </bean>
复制代码
基于setter的依靠注入

对于基于setter的DI,容器将在调用没有参数的构造函数或没有参数的静态工厂方法来实例化bean之后调用我们类的setter方法。让我们利用注释创建此配置:
  1. @Beanpublic<bean id="store"  autowire="byType"> </bean>Store<bean id="store"  autowire="byType"> </bean>store()<bean id="store"  autowire="byType"> </bean>{<bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  2. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  3. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  4.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  5. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  6. </bean>Store<bean id="store"  autowire="byType"> </bean>store<bean id="store"  autowire="byType"> </bean>=new<bean id="store"  autowire="byType"> </bean>Store();<bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  7. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  8. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  9.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  10. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  11. </bean>store.setItem(item1());<bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  12. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  13. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  14.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  15. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  16. </bean>return<bean id="store"  autowire="byType"> </bean>store;}
复制代码
我们也可以利用XML进行雷同的bean配置:
  1. <bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  2. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  3. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  4.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  5. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  6. </bean>
复制代码
我们可以将构造函数和setter类型的注入结合在同一个bean中。Spring文档建议将基于构造函数的注入用于必需的依靠项,将基于setter的注入用于可选的依靠项。
基于字段的依靠注入

在基于字段的DI的环境下,我们可以通过带有@Autowired/@Resource注释的注释将依靠项注入此中:
  1. public<bean id="store"  autowire="byType"> </bean>class<bean id="store"  autowire="byType"> </bean>Store<bean id="store"  autowire="byType"> </bean>{<bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  2. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  3. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  4.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  5. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  6. </bean>@Autowired<bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  7. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  8. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  9.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  10. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  11. </bean>private<bean id="store"  autowire="byType"> </bean>Item<bean id="store"  autowire="byType"> </bean>item;}
复制代码
在构造Store对象时,假如没有构造函数或setter方法将Itembean注入此中,容器将利用反射将Item注入Store中。
我们也可以利用XML来实现这一点。
这种方法可能看起来更简单、更清晰,但我们不建议利用它,因为它有一些缺点,比方:
自动装配依靠项

自动装配允许Spring容器通过检查已界说的bean来自动解决协作bean之间的依靠关系。
利用XML配置有四种自动装配bean的模式:
比方,让我们通过类型创建具有依靠项item的store<bean id="store"  autowire="byType"> </bean>bean。
  1. public<bean id="store"  autowire="byType"> </bean>class<bean id="store"  autowire="byType"> </bean>AppConfig<bean id="store"  autowire="byType"> </bean>{<bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  2. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  3. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  4.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  5. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  6. </bean>@Bean<bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  7. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  8. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  9.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  10. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  11. </bean>public<bean id="store"  autowire="byType"> </bean>Item<bean id="store"  autowire="byType"> </bean>item()<bean id="store"  autowire="byType"> </bean>{<bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  12. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  13. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  14.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  15. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  16. </bean><bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  17. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  18. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  19.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  20. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  21. </bean>return<bean id="store"  autowire="byType"> </bean>new<bean id="store"  autowire="byType"> </bean>ItemImpl1();<bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  22. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  23. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  24.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  25. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  26. </bean>}<bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  27. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  28. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  29.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  30. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  31. </bean>@Bean(autowire<bean id="store"  autowire="byType"> </bean>=<bean id="store"  autowire="byType"> </bean>Autowire.BY_TYPE)<bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  32. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  33. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  34.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  35. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  36. </bean>public<bean id="store"  autowire="byType"> </bean>Store<bean id="store"  autowire="byType"> </bean>store()<bean id="store"  autowire="byType"> </bean>{<bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  37. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  38. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  39.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  40. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  41. </bean><bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  42. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  43. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  44.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  45. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  46. </bean>return<bean id="store"  autowire="byType"> </bean>new<bean id="store"  autowire="byType"> </bean>Store();<bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  47. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  48. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  49.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  50. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  51. </bean>}}
复制代码
请留意,自Spring<bean id="store"  autowire="byType"> </bean>5.1起,autowire属性已弃用。
我们还可以利用@Autowired注释按类型注入bean:
  1. public<bean id="store"  autowire="byType"> </bean>class<bean id="store"  autowire="byType"> </bean>Store<bean id="store"  autowire="byType"> </bean>{<bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  2. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  3. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  4.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  5. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  6. </bean>@Autowired<bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  7. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  8. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  9.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  10. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  11. </bean>private<bean id="store"  autowire="byType"> </bean>Item<bean id="store"  autowire="byType"> </bean>item;}
复制代码
假如存在雷同类型的多个bean,则可以利用@Qualifier注释按名称引用bean:
  1. public<bean id="store"  autowire="byType"> </bean>class<bean id="store"  autowire="byType"> </bean>Store<bean id="store"  autowire="byType"> </bean>{<bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  2. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  3. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  4.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  5. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  6. </bean>@Autowired<bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  7. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  8. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  9.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  10. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  11. </bean>@Qualifier("item1")<bean<bean id="store"  autowire="byType"> </bean>id="item1"<bean id="store"  autowire="byType"> </bean><bean id="store"  autowire="byType"> </bean>/>
  12. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  13. <bean<bean id="store"  autowire="byType"> </bean>id="store"<bean id="store"  autowire="byType"> </bean>>
  14.         <property<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  15. </bean><constructor-arg<bean id="store"  autowire="byType"> </bean>type="ItemImpl1"<bean id="store"  autowire="byType"> </bean>index="0"<bean id="store"  autowire="byType"> </bean>name="item"<bean id="store"  autowire="byType"> </bean>ref="item1"<bean id="store"  autowire="byType"> </bean>/>
  16. </bean>private<bean id="store"  autowire="byType"> </bean>Item<bean id="store"  autowire="byType"> </bean>item;}
复制代码
现在,让我们通过XML配置按类型自动装配bean:
  1. <bean id="store"  autowire="byType"> </bean>
复制代码
接下来,让我们通过XML按名称将名为item的bean注入到store<bean id="store"  autowire="byType"> </bean>bean的item属性中:
  1. [/code]我们还可以通过构造函数参数或setter显式界说依靠关系来覆盖自动装配。
  2. [size=5]惰性初始化的bean[/size]
  3. 默认环境下,容器在初始化期间创建和配置所有单例bean。为了避免这种环境,我们可以在bean配置上利用值为true的lazy-init属性:
  4. [code]
复制代码
因此,只有在第一次请求它时,才会初始化item1<bean id="store"  autowire="byType"> </bean>bean,而不是在启动时。这样做的优点是初始化时间更快,但缺点是我们在bean被请求之后才会发现任何配置错误,这可能是应用步伐已运行数小时乃至数天之后。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4