创建应用对象之间协作关系的行为通常成为装配,该篇的主要内容有两个,一个Spring装配Bean的几种方式以及Spring表达式,事实上这两者是分不开的,在Spring中,对象无需自己负责查找或者创建与其关联的其它对象,相反容器负责把须要相互协作的对象一引用赋予各个对象,眼下我们先说声明式的装配,注解式的装配等溜到下篇再具体记录,在声明用的xml配置文件里,能够使用表达式来完毕一些简单的逻辑处理,和方法调用或者对象引用,在有些特殊的需求其中非它莫属,首先是装配Bean

声明Bean

<bean id="duke" class="com.springinaction.springidol.Juggler"/ >

该语句在Spring容器中声明了一个类型为com.springinaction.springidol.Juggler的对象,使用id为duke来引用该对象,这里说一句,在Spring容器中,对象之间的引用都是通过依赖注入的方式引用的,也就是说是通过xml配置文件来配置类和类之间的关系。

通过构造器注入

<bean id="duke" class="com.springinaction.springidol.Juggler" >
<constructor-arg value="15"/>
</bean>

在Juggler类中有一个仅仅有一个入參的构造器,參数类型是int,我们通过<bean>标签下的<constructor-arg>标签来定义入參的值,假设没有该标签,那么Spring容器将会调用Juggler类的默认构造器,假设该类中存在多个构造器,那么Spring容器依据传入的參数个数以及类型选择參数数量组多的那个构造器

上边的样例仅仅为Juggler类注入了一个简单值的參数,也就是String加上基本数据类型,假设參数类型是一个复杂类型的话,能够先生命一个该类型的Bean,然后在构造器注入的时候引用该类,例如以下

<bean id="duke" class="com.springinaction.springidol.Juggler" >
<constructor-arg value="15"/>
<constructor-arg ref="sonnet29"></constructor-arg>
</bean> <bean id="sonnet29" class="com.springinaction.springidol.Sonnet29"/>

注意在第二个參数上把value属性换成了ref,ref的值是声明的某个Bean的id引用

通过工厂方法创建Bean

有时候静态工厂方法是实例化对象的唯一方法,比方说在使用单例模式的情况下,整个应用仅仅同意有一个某类型的对象,这个时候就能够使用工厂方法创建Bean了,可是在类中须要提供静态的工厂方法来获得实例,下面是一个单例的样例,详细变量的含义不用太在意,仅仅是说一下创建的方式

package com.springinaction.springidol;

public class Stage {

	private Stage() {

	}

	private static class StageSingoletonHolder {
static Stage instance = new Stage();
} public static Stage getInstance() {
return StageSingoletonHolder.instance;
}
}

这个类中的静态工厂方法是getInstance(),在配置应用上下文文件的时候,就不能依照正常方式声明Bean了,由于不能再通过构造方法来创建对象,Spring提供了一个factory-method 属性,能够定义Bean的静态工厂方法,配置例如以下

<bean id="stage" class="com.springinaction.springidol.Stage"
factory-method="getInstance" />

在创建容器的时候Spring机会通过getInstance创建对象了



Bean的作用域

在声明Bean的时候能够设置Bean的作用域,眼下这个阶段用到的就仅仅有两个属性值,其它的等到兴许碰到的时候再来学习,请看例如以下两个配置

<bean id="duke" class="com.springinaction.springidol.Juggler"
scope="singleton" /> <bean id="duke" class="com.springinaction.springidol.Juggler"
scope="prototype" />

singleton代表在该Spring容器中这个定义的Bean仅仅能有一个实例,prototype代表在该Spring容器其中每次调用方法获得Bean的时候多会生成一个新的实例,有必要讨论一下的就是singleton,假设没有设置scope,那么该值就是默认值,主要想说一下这个单一实例的含义,该单例跟上述静态工厂方法的单例是截然不同的,该单例方式是针对于Spring容器的也就是应用上下文中的单例,在调用应用上下文对象的getBean()方法获得指定的bean的时候假设没有设置prototype值,那么应用上下文对象就会从容器中找到已经生成好的该Bean的对象返回回来,假设设置了prototype值,那么在每次调用getBean的时候都会生成一个新的Bean对象。假设其它的应用上下文中也有声明该类型的Bean那么也会在其它应用上下文中穿件新的对象,甚至实在同一个应用上下文中定义了两个该类型的Bean也会生成两个对象,仅仅只是id引用不一样而已,所以说这并非纯粹上的单例模式。

初始化和销毁Bean

实例化一个Bean或者从容器中移除一个Bean的时候可能须要做一些额外的处理,所以Spring提供了定义初始化和销毁时候的方法配置例如以下

<bean id="duke" class="com.springinaction.springidol.Juggler"
init-method="turnOnLights" destroy-method="turnOffLights" />

init-method属性定义了Bean初始化时候调用的方法,destrory-method属性定义了Bean销毁时调用的方法,假设为每个Bean都声明这种两个方法未免太过麻烦,所以Spring还提供过了定义默认初始和销毁方法配置例如以下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-init-method="turnOnLights"
default-destroy-method="turnOffLights"></beans>

在beans标签中定义default-init-method和default-destroy-method方法在期中定义的Bean中,每一个bean的默认初始化和销毁方法都会是上边定义的两个方法。

注入Bean属性

通常javaBean的属性都是私有属性,仅仅能通过对应的getter和setter方法,Spring的注入属性的方法也是通过配置xml配置文件,先来说一说有注入的方式,再来看详细的配置方法。

注入Bean的属性是通过<property>标签来完毕,属性分为一下几种:

*注入简单值(String或者基本数据类型)

*注入其它的Bean(注入同样类型的已经是声明的bean)

*注入内部Bean(类似于内部类)

*注入集合

*注入空值

下面的配置文件将会一次展示上述的注入方式,配置文件例如以下

	<bean id="duke" class="com.springinaction.springidol.Juggler">
<!-- 注入简单值 -->
<property name="property1" value="property"></property>
<property name="property2" value="15"></property>
<!-- 注入其它Bean -->
<property name="property3" ref="property3"></property>
<!-- 注入内部Bean -->
<property name="property4" >
<bean class="com.springinaction.springidol.Property4"/>
</property>
<!-- 注入空值 -->
<property name="property5" ><null/></property>
<!-- 注入集合 -->
<!-- List -->
<property name="List">
<list>
<value>item1</value>
<ref bean="item2"/>
<bean class="com.springinaction.springidol.Item3"/>
<null/>
</list>
</property>
<!-- Set -->
<property name="Set">
<set>
<value>item1</value>
<ref bean="item2"/>
<bean class="com.springinaction.springidol.Item3"/>
<null/>
</set>
</property>
<!-- Map -->
<property name="Map">
<map>
<entry key="item1" value="item1"/>
<entry key="item1" value-ref="item2"/>
<entry key-ref="item3" value="item3"/>
</map>
</property>
<!-- Properties -->
<property name="props">
<props>
<prop key="item1">item1</prop>
</props>
</property>
</bean>

从上往下整理一遍<property>标签中name属性代表的是Bean中属性的名称,value值代表的属性值,可是仅仅能表示简单的值,ref能够引用一个已经声明的Bean,值是Bean的id,在引用简单值的时候Spring会依据属性的详细类型做自己主动的类型转换,所以我们看第二个注入值是一个字符串“15”,可是属性的类型是int。

我们能够在属性内部声明一个Bean当作是属性的值,这就是所说的注入内部Bean,该Bean仅仅在属性标签内才实用,和内部类的特性比較像,可是不能像内部类一样创建一个静态公开的内部类,能够在类以外调用,在Spring中内部bean是不能被外部引用的。

Spring提供了注入控值的配置,也就是给属性注入null值使用<null/>标签。

假设属性的类型是集合,我们不必去集成一个集合类然后通过注入bean的方式注入,能够直接利用Spring提供的集合标签来注入。

首先是List由标签<list>表示,在该标签中有四种表示值的方式,我都已经列出来了,简单值、Bean引用、内部Bean、空值。

再是Set 由标签<set>表示,set和list的作用差点儿相同,可是在set中不能出现反复的值

然后是Map由标签<map>表示,该标签下的<entry>标签表示的是map中的一个元素,分别有一下四种属性值key、key-ref、value、value-ref,map的键值能够是不论什么类型的值,简单值使用不带ref后缀的属性,Bean引用使用带ref后缀的属性引入Bean。

最后是Properties由标签<props>表示,props中的键值仅仅能是String类型的值,<prop>代表了Properties中的一个元素,详细配置方法见上边的配置演示样例。

Spring实战笔记2---Bean的装配的更多相关文章

  1. spring实战四之Bean的自动装配(注解方式)

    使用注解装配: 从spring2.5开始,Spring启用了使用注解自动装配Bean的属性,使用注解方式自动装配与在XML中使用 autowire 属性自动装配并没有太大区别,但是使用注解方式允许更细 ...

  2. spring实战二之Bean的自动装配(非注解方式)

    Bean的自动装配 自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让Spring自动识别如何装配Bea ...

  3. spring实战五之Bean的自动检测

    在spring实战四中,使用在Spring中增加<context:annotation-config>的方式告诉Spring,我们打算使用基于注解的自动装配,希望Spring特殊对待我们所 ...

  4. Spring学习记录(三)---bean自动装配autowire

    Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系,少写几个ref autowire: no ---默认情况,不自动装配,通过ref手动引用 byName---根据 ...

  5. Spring4学习笔记 - 配置Bean - 自动装配 关系 作用域 引用外部属性文件

    1 Autowire自动装配 1.1 使用:只需在<bean>中使用autowire元素 <bean id="student" class="com.k ...

  6. Spring学习日志之Bean的装配

    Spring容器负责创建应用程序中的bean并通过依赖注入来协调这些对象之间的关系.但是,作为开发人员,要告诉Spring需要创建哪些bean并且如何将其装配在一起.当描述bean如何装配时,Spri ...

  7. Spring学习笔记--注入Bean属性

    这里通过一个MoonlightPoet类来演示了注入Bean属性property的效果. package com.moonlit.myspring; import java.util.List; im ...

  8. Spring MVC系列-(2) Bean的装配

    2. Bean的装配 Spring容器负责创建应用程序中的bean,并通过DI来协调对象之间的关系.Spring提供了三种主要的装配机制: XML显式配置: Java配置类进行显式配置: 隐式的bea ...

  9. Spring学习笔记(3)——Bean的注入方式

    依赖注入 依赖注入支持属性注入.构造函数注入.工厂注入. 属性注入: 属性注入即通过setXxx()方法注入Bean的属性值或依赖对象 属性注入要求Bean提供一个默认的构造函数(无参构造函数),并为 ...

随机推荐

  1. SQLiteLog (1) no such Column:

           今天在进入sqlite数据库查询的时候出现了这个问题,SQLiteLog (1) no such Column: BGZ 搜索得知这是因为数据库中没有这一列,我的sql语句为" ...

  2. 电驴 emule 源代码分析 (1)

    关于电驴emule 的源代码,网上有一个  叫刘刚的人 分析的 非常多,可是假设你仅仅是看别人的分析,自己没有亲身去阅读代码的话,恐怕非常难  剖析整个系统. 关于emule  主要就是 连接 kad ...

  3. Enterprise Solution 企业管理软件开发框架

    Enterprise Solution 开源项目资源汇总 Visual Studio Online 源代码托管 企业管理软件开发框架 Enterprise Solution 是一套管理软件开发框架,在 ...

  4. unity3d游戏开发学习之使用3dmax创建导弹模型

    在着手研究Unity3D的游戏开发时,3D模型能够考虑从unity的assets store去获取,也能够从网上搜索下载,同一时候咱们也能够尝试下自己动手去做一些简单的模型. 这里就依据unity3d ...

  5. Swift - 列表项尾部附件点击响应(感叹号,箭头等)

    列表单元格尾部可以添加各种样式的附件,如感叹号,三角箭头等.而且点击内容区域与点击附件的这两个响应事件是不同的,这样可以方便我们实现不同的功能(比如点击内容则查看详情,点击感叹号则编辑) 1 2 3 ...

  6. java中遍历MAP,嵌套map的几种方法

    java中遍历MAP的几种方法 Map<String,String> map=new HashMap<String,String>();    map.put("us ...

  7. [置顶] head first 设计模式之----Observer pattern

    浅谈设计模式之----观察者模式      观察者模式也是我们日常程序编写中碰到比较多的一种设计模式.首先,所谓观察者模式定义就是指:在对象之间定义了一对多的依赖,这样一来,当一个对象的状态发生变化的 ...

  8. tmd123.com

    赞!完胜百度的搜索!比baidu.com好多了! 搜索用!非常像!比baidu.com好多了! mark一下 发现有人录制了101集swift视频教程好像持续更新中......

  9. QQ圈子降级为“应用”后应关注其隐私设置

    在之前的QQ版本中,QQ圈子的权限设置在“系统设置”对话框的“权限设置”中,如图所示. 但是在更新后的2013SP1版本中,“系统设置”对话框中的“权限设置”已经没有了“圈子权限” QQ圈子成了应用管 ...

  10. 三次握手wireshark抓包分析,成功握手和失败握手

    启动 点击start出现下面的对话框 wireshark是捕获机器上的 某一块网卡的网络包,当机器上有多块网卡的时候,需要选择一个网卡进行捕获操作. 选择网卡 >主页面上,直接点击选中后star ...