依赖:

典型的企业应用程序不可能由单个对象(在spring中,也可称之bean)组成,再简单的应用也是由几个对象相互配合工作的,这一章主要介绍bean的定义以及bean之间的相互协作。

依赖注入:

spring中的依赖注入(Dependency injection (DI))主要有两种形式:构造器注入和setter方法注入。

构造器注入:

基于构造函数的方式有其自己的优势,它可以明白地创建出带有特定构造參数的对象。另外它对于创建一些在类中不须要常常变化的域有明显的优势。假设用setter方法来做这样的事情会显得非常不协调。但通常可以採用init的方法在创建时就将其初始化。

当然对于某些类可能有非常多的域,构造函数不可能包括全部的情况,并且当中可以包括的构造參数也是有限的,此时Setter方法注入就可以以发挥其余地。

下面演示样例是一个仅仅能通过构造器注入的类:

[java] view
plain
 copy

  1. public class SimpleMovieLister {
  2. // the SimpleMovieLister has a dependency on a MovieFinder
  3. private MovieFinder movieFinder;
  4. // a constructor so that the Spring container can 'inject' a MovieFinder
  5. public SimpleMovieLister(MovieFinder movieFinder) {
  6. this.movieFinder = movieFinder;
  7. }
  8. // business logic that actually 'uses' the injected MovieFinder is omitted...
  9. }

构造函数參数匹配时根据的是构造器參数类型,为了不产生歧义,一般构造參数给出的顺序依照构造函数中參数给定的顺序。例如以下:

[java] view
plain
 copy

  1. package x.y;
  2. public class Foo {
  3. public Foo(Bar bar, Baz baz) {
  4. // ...
  5. }
  6. }

没有潜在的歧义存在,如果Bar和Baz两个类不想关

[html] view
plain
 copy

  1. <span style="color:#333333;"><beans>
  2. <bean id="foo" class="x.y.Foo">
  3. <</span><span style="color:#ff0000;">constructor-arg</span><span style="color:#333333;"> ref="bar"/>
  4. <constructor-arg ref="baz"/>
  5. </bean>
  6. <bean id="bar" class="x.y.Bar"/>
  7. <bean id="baz" class="x.y.Baz"/>
  8. </beans></span>

当还有一个bean被引用时,假设类型一直,匹配就能够发生。当一个简单类型使用时,比如<value>true<value>,Spring不能决定value的类型。就不能进行匹配。

看以下一个演示样例:

[java] view
plain
 copy

  1. package examples;
  2. public class ExampleBean {
  3. // No. of years to the calculate the Ultimate Answer
  4. private int years;
  5. // The Answer to Life, the Universe, and Everything
  6. private String ultimateAnswer;
  7. public ExampleBean(int years, String ultimateAnswer) {
  8. this.years = years;
  9. this.ultimateAnswer = ultimateAnswer;
  10. }
  11. }

在前面这个演示样例中,使用type属性。容器能够进行简单的类型匹配:

[html] view
plain
 copy

  1. <bean id="exampleBean" class="examples.ExampleBean">
  2. <constructor-arg type="int" value="7500000"/>
  3. <constructor-arg type="java.lang.String" value="42"/>
  4. </bean>

相同。我们也能够使用index属性来指定參数顺序(注意index从0開始):

[html] view
plain
 copy

  1. <bean id="exampleBean" class="examples.ExampleBean">
  2. <constructor-arg index="0" value="7500000"/>
  3. <constructor-arg index="1" value="42"/>
  4. </bean>

在spring3.0中,我们也能够使用构造器參数名字来制定相应的參数值:

[html] view
plain
 copy

  1. <bean id="exampleBean" class="examples.ExampleBean">
  2. <constructor-arg name="years" value="7500000"/>
  3. <constructor-arg name="ultimateanswer" value="42"/>
  4. </bean>

注意:Keep in mind that to make this work out of the box your code must be compiled with the debug flag enabled so that Spring can look up the parameter name from the constructor.
If you can't compile your code with debug flag (or don't want to) you can use @ConstructorProperties JDK
annotation to explicitly name your constructor arguments. The sample class would then have to look as follows:

[java] view
plain
 copy

  1. package examples;
  2. public class ExampleBean {
  3. // Fields omitted
  4. @ConstructorProperties({"years", "ultimateAnswer"})
  5. public ExampleBean(int years, String ultimateAnswer) {
  6. this.years = years;
  7. this.ultimateAnswer = ultimateAnswer;
  8. }
  9. }

setter方法注入:

下面是一个简单的仅仅能用setter方法进行注入的样例:

[java] view
plain
 copy

  1. public class SimpleMovieLister {
  2. // the SimpleMovieLister has a dependency on the MovieFinder
  3. private MovieFinder movieFinder;
  4. // a setter method so that the Spring container can 'inject' a MovieFinder
  5. public void setMovieFinder(MovieFinder movieFinder) {
  6. this.movieFinder = movieFinder;
  7. }
  8. // business logic that actually 'uses' the injected MovieFinder is omitted...
  9. }

ApplicationContext 支持setter注入和构造器注入,也支持在已存在构造器注入的情况下继续进行setter注入。

依赖注入实例:

下面样例为setter注入的xml配置文件:

[html] view
plain
 copy

  1. <bean id="exampleBean" class="examples.ExampleBean">
  2. <!-- setter injection using the nested <ref/> element -->
  3. <property name="beanOne"><ref bean="anotherExampleBean"/></property>
  4. <!-- setter injection using the neater 'ref' attribute -->
  5. <property name="beanTwo" ref="yetAnotherBean"/>
  6. <property name="integerProperty" value="1"/>
  7. </bean>
  8. <bean id="anotherExampleBean" class="examples.AnotherBean"/>
  9. <bean id="yetAnotherBean" class="examples.YetAnotherBean"/>
[java] view
plain
 copy

  1. public class ExampleBean {
  2. private AnotherBean beanOne;
  3. private YetAnotherBean beanTwo;
  4. private int i;
  5. public void setBeanOne(AnotherBean beanOne) {
  6. this.beanOne = beanOne;
  7. }
  8. public void setBeanTwo(YetAnotherBean beanTwo) {
  9. this.beanTwo = beanTwo;
  10. }
  11. public void setIntegerProperty(int i) {
  12. this.i = i;
  13. }
  14. }

上面这个样例使用的是setter注入。

以下是构造器注入的一个样例:

[html] view
plain
 copy

  1. <bean id="exampleBean" class="examples.ExampleBean">
  2. <!-- constructor injection using the nested <ref/> element -->
  3. <constructor-arg>
  4. <ref bean="anotherExampleBean"/>
  5. </constructor-arg>
  6. <!-- constructor injection using the neater 'ref' attribute -->
  7. <constructor-arg ref="yetAnotherBean"/>
  8. <constructor-arg type="int" value="1"/>
  9. </bean>
  10. <bean id="anotherExampleBean" class="examples.AnotherBean"/>
  11. <bean id="yetAnotherBean" class="examples.YetAnotherBean"/>
[java] view
plain
 copy

posted @ 2017-08-10 12:58 yangykaifa 阅读(...) 评论(...) 编辑 收藏

[学习笔记]Spring依赖注入的更多相关文章

  1. Spring学习笔记——Spring依赖注入原理分析

    我们知道Spring的依赖注入有四种方式,各自是get/set方法注入.构造器注入.静态工厂方法注入.实例工厂方法注入 以下我们先分析下这几种注入方式 1.get/set方法注入 public cla ...

  2. SpringMVC:学习笔记(11)——依赖注入与@Autowired

    SpringMVC:学习笔记(11)——依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...

  3. Spring.NET学习笔记6——依赖注入(应用篇)

    1. 谈到高级语言编程,我们就会联想到设计模式:谈到设计模式,我们就会说道怎么样解耦合.而Spring.NET的IoC容器其中的一种用途就是解耦合,其最经典的应用就是:依赖注入(Dependeny I ...

  4. Spring学习笔记1—依赖注入(构造器注入、set注入和注解注入)

    什么是依赖注入 在以前的java开发中,某个类中需要依赖其它类的方法时,通常是new一个依赖类再调用类实例的方法,这种方法耦合度太高并且不容易测试,spring提出了依赖注入的思想,即依赖类不由程序员 ...

  5. AngularJS学习笔记之依赖注入

    最近在看AngularJS权威指南,由于各种各样的原因(主要是因为我没有money,好讨厌的有木有......),于是我选择了网上下载电子版的(因为它不要钱,哈哈...),字体也蛮清晰的,总体效果还不 ...

  6. 再学习之Spring(依赖注入)

    一.概述 Spring框架是以 简化Java EE应用程序的开发 为目标而创建的.Spring可以实现很多功能,但是这些功能的底层都依赖于它的两个核心特性,也就是依赖注入和面向切面编程.几乎Sprin ...

  7. Unity学习笔记(4):依赖注入

    Unity具体实现依赖注入包含构造函数注入.属性注入.方法注入,所谓注入相当赋值,下面一个一个来介绍 1:构造函数注入 1.1当类有多个构造函数时,可以通过InjectionConstructor特性 ...

  8. angular2 学习笔记 ( DI 依赖注入 )

    refer : http://blog.thoughtram.io/angular/2016/09/15/angular-2-final-is-out.html ( search Dependency ...

  9. Angular4.0从入门到实战打造在线竞拍网站学习笔记之三--依赖注入

    Angular4.0基础知识之组件 Angular4.0基础知识之路由 依赖注入(Dependency Injection) 正常情况下,我们写的代码应该是这样子的: let product = ne ...

随机推荐

  1. Asp.Net 之 前台绑定常用总结

    1.<%= 变量名 %> 里面放的是后台定义的变量名,如: <div> <p> <%= DateTime.Now.ToString() %></p ...

  2. H面试(23):求子数组最大和

    题目描述: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 例如输入的数组为1, -2 ...

  3. UVA 10700 Camel trading 无括号的表达式 贪心

    题意:给出只包含数字和+*的表达式,你可以自己安排每一个运算的顺序,让你找出表达式可能得到的最大值和最小值. 很明显,先乘后加是最小值,先加后乘能得到最大值. 其实不是很明显... 证明下: 数字的范 ...

  4. 借助AWR报告分析解决oracleCPU过高的问题(转)

    原文地址:http://www.cnblogs.com/crystal-guoguo/p/4213458.html 简介:在oracle数据库中,有两个非常实用的自带监控工具EM(Enterprise ...

  5. Oracle的REGEXP_SUBSTR函数简单使用方法

    REGEXP_SUBSTR延伸SUBSTR函数的功能.让你搜索一个正則表達式模式字符串. 这也相似于REGEXP_INSTR.而是返回子字符串的位置,它返回的子字符串本身. 语法 Oracle数据库中 ...

  6. 解决Swap file &quot;.ceshi.c.swp&quot; already exists!问题

    关于swp文件:使用vi,常常能够看到swp这个文件,那这个文件是怎么产生的呢.当你打开一个文件,vi就会生成这么一个.(filename)swp文件以备不測,假设你正常退出,那么这个.(filena ...

  7. 基于jquery的锚点滚动插件(百度百科效果) anchorScroll.js

    1.插进使用场景 请打开https://baike.baidu.com/item/%E6%97%A5%E6%9C%AC%E5%8A%A8%E7%94%BB#hotspotmining,查看百度百科页面 ...

  8. 编译时:virtual memory exhausted: Cannot allocate memory(转)

    一.问题 当安装虚拟机时系统时没有设置swap大小或设置内存太小,编译程序会出现virtual memory exhausted: Cannot allocate memory的问题,可以用swap扩 ...

  9. WebApi 数据保护操作未成功。这可能是由于未为当前线程的用户上下文加载用户配置文件导致的。当线程执行模拟时,可能会出现此情况。","ExceptionType":"System.Security.Cryptography.CryptographicException","StackTrace

    在调用System.Security.Cryptography.ProtectedData.Protect方法来保护私密信息时,IIS可能会报以下错误:CryptographicException: ...

  10. Unity3D - 资源管理

    一直没有总结过Unity的资源管理,都是随用随看文档.今天有人问起,总结一下.加深对Unity资源管理的理解. 主要參考了Unity官方文档之Resources和AssetBundle. Unity有 ...