快速业务通道

详解Spring 3.0基于Annotation的依赖注入实现 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
ctor、autodetect),同一个类型可能存在多个 Bean ,如果被注入的属性是数组、集合或者 Map,这可能没有问题,但是如果只是简单的引用类型,则会抛出 异常。解决方法有如下几种:

取消该 Bean 的自动装配特性,使用显式的注入。我们可能不希望某个 Bean 被当作其他 Bean 执行 自动封装时的候选对象,我们可以给该 <bean> 增加 autowire-candidate="false"。(autowire- candidate 属性和 autowire 属性相互独立,互不相干。某个 Bean 可以将 autowire-candidate 设置为 false,同时使用 autowire 特性。) 另外,我们可以设置 <beans> 的 default-autowire- candidates 属性,可以在该属性中指定可以用于自动装配候选 Bean 的匹配模式,比如 default- autowire-candidates="*serv,*dao",这表示所有名字以 serv 或者 dao 结尾的 Bean 被列为候选,其 他则忽略,相当于其他 Bean 都指定为 autowire-candidate="false",此时可以显式为 <bean> 指定 autowire-candidate="true"。在 <bean> 上指定的设置要覆盖 <beans> 上指定的设 置。

如果在多个类型相同的 Bean 中有首选的 Bean,那么可以将该 <bean> 的 primary 属性设置 为 "true" ,这样自动装配时便优先使用该 Bean 进行装配。此时不能将 autowire-candidate 设为 false。

如果使用的是 Java 5 以上版本,可以使用注解进行更细粒度的控制。

使用 @Autowired 和 @Qualifier 注解执行自动装配

使用 @Autowired 注解进行装配,只能是根据类型进行匹配。@Autowired 注解可以用于 Setter 方法 、构造函数、字段,甚至普通方法,前提是方法必须有至少一个参数。@Autowired 可以用于数组和使用 泛型的集合类型。然后 Spring 会将容器中所有类型符合的 Bean 注入进来。@Autowired 标注作用于 Map 类型时,如果 Map 的 key 为 String 类型,则 Spring 会将容器中所有类型符合 Map 的 value 对 应的类型的 Bean 增加进来,用 Bean 的 id 或 name 作为 Map 的 key。

@Autowired 标注作用于普通方法时,会产生一个副作用,就是在容器初始化该 Bean 实例的时候就会 调用该方法。当然,前提是执行了自动装配,对于不满足装配条件的情况,该方法也不会被执行。

当标注了 @Autowired 后,自动注入不能满足,则会抛出异常。我们可以给 @Autowired 标注增加一 个 required=false 属性,以改变这个行为。另外,每一个类中只能有一个构造函数的 @Autowired.required() 属性为 true。否则就出问题了。如果用 @Autowired 同时标注了多个构造函数 ,那么,Spring 将采用贪心算法匹配构造函数 ( 构造函数最长 )。

@Autowired 还有一个作用就是,如果将其标注在 BeanFactory 类型、ApplicationContext 类型、 ResourceLoader 类型、ApplicationEventPublisher 类型、MessageSource 类型上,那么 Spring 会自 动注入这些实现类的实例,不需要额外的操作。

当容器中存在多个 Bean 的类型与需要注入的相同时,注入将不能执行,我们可以给 @Autowired 增 加一个候选值,做法是在 @Autowired 后面增加一个 @Qualifier 标注,提供一个 String 类型的值作为 候选的 Bean 的名字。举例如下:

@Autowired(required=false)   @Qualifier("ppp")   public void setPerson(person p){}

详解Spring 3.0基于Annotation的依赖注入实现(5)

时间:2011-08-13 IBM 张建平

@Qualifier 甚至可以作用于方法的参数 ( 对于方法只有一个参数的情况,我们可以将 @Qualifer 标 注放置在方法声明上面,但是推荐放置在参数前面 ),举例如下:

@Autowired(required=false)   public void sayHello(@Qualifie

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号