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. ASP.net MVC中页面跳转

    @Html.ActionLink("Home Name", "Index", "Home")Home name 是 跳转链接的名Index  ...

  2. Apache 网站301重定向

    1. Apache模块 开启rewrite 2..htaccess文件中 <IfModule mod_rewrite.c> Options +FollowSymlinks RewriteE ...

  3. C#结构

    namespace STRUCT_TEST{ class Program { struct A { public int X;//不能直接对其进行赋值 public int Y; public sta ...

  4. seaJS 简单例子,理解seaJS

    学习心得: 记得第一次学underscore的时候,去的官网(不管什么都是官网好),呼啦一长列语法,我就一个个看,看完也不知道underscore是做什么的.就是现在underscore我也用不上,学 ...

  5. GDB常用命令

    一. gdb使用流程 1.编译生成可执行文件 gcc -g hello.c -o hello 2.启动gdb gdb hello 3. 在main处设置断点 break main 4.运行程序 run ...

  6. 安装和配置Mantis<项目管理工具>

    说明: 黑色加粗部分为配置文档修改或添加的内容,例如index.cgi意思为修改或添加index.cgi 红色加粗部分为操作控制而非直接输入,例如空格意思为此处需要按下空格键 一.介绍 Apache: ...

  7. android 的数学公式图片转换

    在应用中的数学公式是不能直接以文本显示和输入的,包括在一些学习类网站上看到的公式,他们都是以gif图片的形式展示出来的.而怎么样生成各种各样的gif图片形式的数学公式呢,此处未作深入研究,我所知道的是 ...

  8. GitHub开源项目总结

    SwipeRefreshLayout 地址:https://github.com/hanks-zyh/SwipeRefreshLayout 首页轮播的Tab样式,PagerSlidingTab 地址: ...

  9. html入门问题_2016-10-29

    在mac机器上,用Safari打开html文件 1. 如果html里有中文,则在<head><meta http-equiv="Content-Type" con ...

  10. flash 定义二维数组

    一种二维数组的定义方法   //假设二维数组为 [5][7]var  xn:Number = 5;var  yn:Number = 7; //定义一数值变量var  temp:Number = 0; ...