Spring框架在依赖注入方面是非常灵活和强大的,多了解点一些注入的方式、方法,绝对能优化配置。

idref

idref属性可以传入一个bean的名称,虽然它是指向一个bean的引用,但是得到的是该bean的id名。

1
2
3
4
5
6
7
8
9
10
11
<beans>

    <bean id="movieService" class="DefaultMovieService"/>

    <bean id="cinema" class=“Cinema">
<property name="serviceRef">
<idref bean="movieService"/>
</property>
</bean> </beans>

它和直接设置serviceRef属性的value为movieService的区别是前者是能够保证必须有一个名movieService的bean存在于当前的spring容器中,如果没有则Spring容器会在初始化阶段就会报错;而后者仅仅是一个字符串,spring容器在初始化不会做任何检查,很可能将异常推后到运行时抛出。

内部bean

bean的定义是可以嵌套的。

1
2
3
4
5
6
<beans>
<bean id=“movieService" class="DefaultMovieService"/>
<bean id="cinema" class=“Cinema">
<property name="movieService" ref=“movieService"/>
</bean>
</beans>

可以改为这种方式。

1
2
3
4
5
    <bean id="cinema" class="Cinema">
<property name="movieService">
<bean class="DefaultMovieService"/>
</property>
</bean>

这样内部bean就不需要一个名字的,当然这也意味着它无法被其他bean引用了。当然即使你给它起了名字,Spring容器也会忽略这个名字,其他bean也无法引用它。neibubean的scope始终和waibubean的scope保持一致。

对集合的注入

Java的集合框架中包含很多集合元素,比如List、Map、Set等。Spring支持对这些集合元素的注入。

1
2
3
4
5
6
7
8
    <bean id="accountService" class="AccountService">
<property name="accounts">
<map>
<entry key="bowen" value="1234"/>
<entry key="tom" value="3456"/>
</map>
</property>
</bean>
1
2
3
4
5
6
7
8
9
    <bean id="cookbook" class="Cookbook">
<property name="recipe">
<list>
<value>noodle</value>
<value>rice</value>
<value>meat</value>
</list>
</property>
</bean>

还可以直接配置java的Properties。

1
2
3
4
5
6
7
8
9
    <bean id="databaseSource" class="DatabaseSource">
<property name="source">
<props>
<prop key="port">2012</prop>
<prop key="host">localhost</prop>
<prop key="schema">db1</prop>
</props>
</property>
</bean>

嵌套属性名注入

Spring支持使用嵌套属性注入值。

Restaurant.java
1
2
3
4
5
6
7
8
9
10
11
12
public class Restaurant {

    private Person manager;

    public Person getManager() {
return manager;
} public void setManager(Person manager) {
this.manager = manager;
}
}
Person.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Person {

    private String name;
private int age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}
1
2
3
4
5
6
    <bean id="restaurant" class="huangbowen.net.service.Restaurant">
<property name="manager">
<bean class="huangbowen.net.PAndCNamespace.Person"/>
</property>
<property name="manager.age" value="20"/>
</bean>

需注意除了最后一个属性,其他属性不能为空值。

使用depends-on属性

当你初始化一个bean时,需要另一个bean先被初始化,这种情况很常见。虽然Spring在最大程度上能自动按照你期望的顺序来初始化bean(比如构造器注入的bean会优先初始化),但是不保证总能符合你的心意。你可以使用depends-on属性来显示指定bean的初始化顺序。

1
2
3
4
5
6
7
8
9
10
11
12
<beans>

   <bean id="movieService" class="DefaultMovieService"/>

    <bean id="cinema" class=“Cinema” depends-on="movieService">
<property name="serviceRef">
<idref bean="movieService"/>
</property>
</bean> </beans>

也可以同时deppends-on多个对象。

1
2
3
4
5
    <bean id="cinema" class=“Cinema” depends-on=“movieService,accountService">
<property name="serviceRef">
<idref bean="movieService"/>
</property>
</bean>

Spring-Context之八:一些依赖注入的小技巧的更多相关文章

  1. MEF依赖注入调试小技巧!

    自从哥的项目使用MEF以来,天天那个纠结啊,甭提了.稍有错误,MEF就报错,但就不告诉你哪错了,大爷的. 后来看了MEFX的相关调试方法,感觉也不太理想,根本不够直观的看到错误原因,也许是没有深入学习 ...

  2. (转)Spring读书笔记-----Spring核心机制:依赖注入

    Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的.因此,我们说这些对象间存在依赖关系.加入A组件调用了B组件的方法,我们就 ...

  3. spring 控制反转与依赖注入原理-学习笔记

    在Spring中有两个非常重要的概念,控制反转和依赖注入:控制反转将依赖对象的创建和管理交由Spring容器,而依赖注入则是在控制反转的基础上将Spring容器管理的依赖对象注入到应用之中: 所谓依赖 ...

  4. Spring核心机制:依赖注入

    转载:http://www.cnblogs.com/chenssy/ Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的.因 ...

  5. Spring读书笔记-----Spring核心机制:依赖注入

    spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入.今天就和大家一起来学习一下 依赖注入的基本概念 依赖注入(Dependecy Injection),也称为IoC(I ...

  6. Spring源码剖析依赖注入实现

    Spring源码剖析——依赖注入实现原理 2016年08月06日 09:35:00 阅读数:31760 标签: spring源码bean依赖注入 更多 个人分类: Java   版权声明:本文为博主原 ...

  7. 回客科技 面试的 实现ioc 容器用到的技术,简述BeanFactory的实现原理,大搜车面试的 spring 怎么实现的依赖注入(DI)

    前言:这几天的面试,感觉自己对spring 的整个掌握还是很薄弱.所以需要继续加强. 这里说明一下spring的这几个面试题,但是实际的感觉还是不对的,这种问题我认为需要真正读了spring的源码后说 ...

  8. Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入

    Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入 Spring4整合quartz2.2.3中Job任务使用@Autowired不能注入 >> ...

  9. Spring的核心机制依赖注入

    原文地址:http://developer.51cto.com/art/200610/33311.htm 本文主要讲解依赖注入(设值注入.构造注入),作用是可以使Spring将各层的对象以松耦合的方式 ...

随机推荐

  1. STL 跨模块 调用 异常 解决

    本文为转载别人的,以作收藏之用 百度了一天,现在把结论放上边: 1.不要用STL(std::string属于STL)来跨模块传输数据,例如:dll(so)之间,dll(so)和exe(elf)之间. ...

  2. Win10上使用SVN遇到的一些问题

    最近使用上了Win10,遇到了很多问题,前一段时间是MVC3项目的问题,今天又遇到了SVN工具使用的相关问题.我这个环境是WIN 10,64位,SVN工具是TortoiseSVN-1.9.2.2680 ...

  3. ActionBar

    Android actionBar 修改背景色 本来是想着自定义标题栏,发现老是出错.貌似4.0以上版本都不能自定义标题栏(我到现在都搞不清标题栏和actionBar的区别到底是什么!).原来需要自定 ...

  4. Cracking-- 4.7 在一颗二叉树中找两个节点的第一个共同祖先

    分别记录从 root 到 node1 的path 到 node2的path,再找其中共同的部分 struct Node{ int val; struct Node *left; struct Node ...

  5. Caused by: java.lang.UnsatisfiedLinkError: Couldn't load BaiduMapVOS_v2_1_3: findLibrary returned nu

    我是在整合百度LBS服务与百度语音识别服务的时候遇到这个问题的........ 解决办法是:不要导armeabi-v7a这个文件夹即可. 貌似还有的人试一下以下这种方法(这种方法来自:http://w ...

  6. css定位position认识

    1.绝对定位(position: absolute) 2.相对定位(position: relative) 3.固定定位(position: fixed) 绝对定位 设置position:absolu ...

  7. Fresco简单的使用—SimpleDraweeView

    本文出处:http://blog.csdn.net/u011164565/article/details/51330778 Fresco是一个第三方库,github官网地址:https://githu ...

  8. Web调用FastReport的配置问题

    1.修改配置webconfig文件 IIS6: <system.web> <httpHandlers> <add path="FastReport.Export ...

  9. 基于Chrome内核(WebKit.net)定制开发DoNet浏览器

    1.    源起 a)     定制.Net浏览器 本人是一名C#开发者,而作为C#开发者,做客户端应用中最头痛的一件事就是没有一个好的UI解决方案, WinFrom嘛,效率虽然还不错,但是做一些特殊 ...

  10. ubuntu引导修复

    很多人在自己电脑上装了双系统,我自己装了win7和ubuntu14.04,主要还是用win7,但是有时候win7系统崩溃掉时只能重装咯,重装后发现ubuntu的引导不见了,我也试过在windows下修 ...