在Spring中,对象无需自己负责查找或创建与其关联的其他对象。相反,容器负责把需要相互协作的对象引用赋予各个对象。创建应用对象之间协作关系的行为通常称为装配(wiring),这也是依赖注入的本质。

1.声明Bean

1.1 创建Spring配置

在XML文件中声明Bean时,Spring配置文件的根元素是来源于Spring beans命名空间所定义的<beans>元素。以下是一个典型的Spring XML配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:lang="http://www.springframework.org/schema/lang" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/lang
http://www.springframework.org/schema/lang/spring-lang-3.1.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.1.xsd"> <!-- Bean declaration go here --> </beans>

在<beans>元素内,可以放置所有的Spring配置信息,包括<bean>元素的声明。

Spring核心框架自带的10个命名空间配置如下:

1.2 声明一个简单的Bean

    <bean>元素是Spring中最基本的配置单元,通过该元素Spring将创建一个对象。Spring使用反射来创建Bean。

1.3 通过构造器注入

     1) 通过构造器注入对象引用
<bean id="zookeeperSources" class="com.dangdang.config.service.easyzk.support.spring.ZookeeperSourceFactoryProxy" >
<constructor-arg name="appName" value="${server.name}" />
<constructor-arg name="configFactory" ref="configFactory" />
<constructor-arg name="nodes" value=""/>
</bean>

2) 通过工厂化方法创建Bean

<bean id="zookeeperSources" class="com.dangdang.config.service.ZookeeperSource" factory-method="create"/>

1.4 Bean的作用域

    所有的Spring Bean默认都是单例。当容器分配一个Bean时,它总返回Bean的同一个实例。为了让Spring在每次请求时都为Bean产生一个新的实例,我们只需配置Bean的scope属性为prototype。
<bean id="zookeeperSources" class="com.dangdang.config.service.ZookeeperSource" scope="prototype"/>

Spring的作用域选项:

1.5 初始化和销毁Bean

    为Bean定义初始化和销毁操作,只需使用init-method和destroy-method参数来配置<bean>元素。init-method属性指定了在初始化Bean时要调用的方法,destroy-method属性指定了Bean从容器移除前要调用的方法。
<bean id="auditor" class="com.springinaction.springidol.Auditor" init-method="turnOnLights" destroy-method="turnOffLights" />

可以使用<beans>元素的default-init-method和default-destroy-method为应用上下文中所有的Bean设置共同的初始化和销毁方法。

<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/spring-beans-3.1.xsd" default-init-method="
turnOnLights" default-destroy-method="turnOffLights">
</beans>

2.注入Bean属性

2.1注入简单值

<bean id =“kenny" class="com.ouc.springinaction.test">
<property name ="song" value="Bells" />
</bean>
  一旦test被实例化,Spring就会调用<property>元素所指定属性的setter方法为该属性注入值。

2.2 引用其他Bean

<bean id =“saxon" class="com.ouc.springinaction.saxontest"></bean>
<bean id =“kenny" class="com.ouc.springinaction.test2">
<property name ="song" value="Bells" />
<property name ="saxonIns" ref="saxon" />
</bean>

Spring提倡面向接口编程,面向接口编程与依赖注入协作实现了松散耦合。

2.3 注入内部Bean

<bean id =“saxon" class="com.ouc.springinaction.saxontest"></bean>
<bean id =“kenny" class="com.ouc.springinaction.test2">
<property name ="song" value="Bells" />
<property name ="saxonIns">
<bean class="com.ouc.springinaction.saxontest">
/property>
</bean>

内部Bean是通过直接声明一个<bean>元素作为<property>元素的子节点而定义的。

   内部Bean没有ID属性,使用内部Bean的最大缺点:不能被复用,内部Bean仅适用于一次注入,而且不能被其他Bean所引用。

2.4 使用Spring的命名空间p装配属性

  命名空间p的schema URI为http://www.springframework.org/schema/p.
<bean id =“kenny" class="com.ouc.springinaction.test3">
p:song = "Bells"
p:saxonIns-ref = "saxon" />
</bean>

使用p:作为<bean>元素所有属性的前缀来装配Bean的属性。-ref后缀作为一个标识来告知Spring应该装配一个引用。

2.5 装配集合

 Spring提供了4种类型的集合配置元素。
   <props>要求键和值都必须为String类型,而<map>允许键和值可以是任意类型

<bean id =“hank" class="com.ouc.springinaction.test4">
<property name ="ins">
<set>
<ref bean = "guitar" />
<ref bean = "cymbal" />
<ref bean = "harmonica" />
<ref bean = "harmonica" />
</set>
</property>
</bean>
<bean id =“hank" class="com.ouc.springinaction.test4">
<property name ="ins">
<list>
<ref bean = "guitar" />
<ref bean = "cymbal" />
<ref bean = "harmonica" />
</list>
</property>
</bean>

装配Map集合

<bean id =“hank" class="com.ouc.springinaction.test4">
<property name ="ins">
<map>
<entry key="GUITAR" value-ref = "guitar" />
<entry key="GUITAR1" value-ref = "guitar1" />
<entry key="GUITAR2" value-ref = "guitar2" />
</map>
</property>
</bean>

    装配Properties集合
<bean id =“hank" class="com.ouc.springinaction.test4">
<property name ="ins">
<props>
<prop key="GUITAR"> STRUM </prop>
<prop key="CYMBAL"> CRASH </prop>
</props>
</property>
</bean>

● <property> 元素用于把值或Bean引用注入到Bean的属性中。
   ● <props> 元素用于定义一个java.util.Properties类型的集合值。

   ● <prop> 元素用于定义<props>集合的一个成员。
   装配空值
   为了覆盖自动装配的值或不能完全确定属性的值是否为null,此时,必须显示地为该属性装配一个null值。

<property name ="nullIns"><null/></property>

2.6 使用表达式装配

  Spring表达式语言(SpEL)拥有许多特性,包括:
  ● 使用Bean的ID来引用Bean;
  ● 调用方法和访问对象的属性;
  ● 对值进行算术、关系和逻辑运算;
  ● 正则表达式匹配;
  ● 集合操作。
 字面值
<property name="cappacity" value="#{1e4}" />
 引用Bean、Properties和方
<property name="ins" value="#{saxno.song}" />
<property name="ins" value="#{saxno.song()?.toUpperCase()}" />

使用?.运算符代替点(.)来访问toUpperCase()方法。
  操作类

  使用T()运算符会调用类作用域的方法和常量,通过该运算符可以访问指定类的静态方法和常量。

<property name="mathplier" value="#{T(java.lang.Math).PI}" />
<property name="randomNum" value="#{T(java.lang.Math).random()}" />

使用SpEL进行数值运算

<property name="area" value="#{T(java.lang.Math).PI * circle.radius ^ 2}" />

比较值

<property name="hasCap" value="#{count.total le 10000}" />

逻辑表达式

<property name="outStock" value="#{!pro.available}" />
<property name="outStock" value="#{not pro.available}" />

  条件表达式

<property name="song" value="#{keny.song != null ? keny.song : 'Green'}" />
<property name="song" value="#{keny.song ?: 'Green'}" />

SpEL正则表达式

<property name="validEmail" value="#{admin.email matches '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.com'}" />

使用<util:list>元素在Spring里配置一个包含City对象的List集合。

<util:list id ="cities">
<bean class="com.habuma.spel.city"
p:name="Chicago" p:state="IL" p:population="2556321" />
p:name="Chicago1" p:state="IL1" p:population="2556312" />
p:name="Chicago2" p:state="IL2" p:population="2556311" />
</util:list>

访问集合成员

<property name="choseCity" value="#{cities[2]}" />
<property name="choseCity" value="#{cities['Chicago']}" />

两种特殊的选择属性的方式:systemEnvironment和systemProperties。

   systemEnvironment包含了应用程序所在机器上的所有环境变量。
<property name="homePath" value="#{systemEnvironment['HOME']}" />
   systemProperties包含了Java应用程序启动时所设置的所有属性。

<property name="homePath" value="#{systemProperties['app.home']}" />

查询集合成员
  从城市集合中查询人口多于10000的城市。
  使用查询运算符(.?[])

<property name="bigCities" value="#{cities.?[population gt 10000]}" />

使用".^[]"和".$[]",从集合中查询第一匹配项和最后一个匹配项。

 投影集合
 集合投影是从集合的每一个成员中选择特定的属性放入一个新的集合中。
 用(.![])投影运算符投影集合。
<property name="cityNames" value="#{cities.![name]}" />

Spring学习笔记—装配Bean的更多相关文章

  1. #Spring实战第二章学习笔记————装配Bean

    Spring实战第二章学习笔记----装配Bean 创建应用对象之间协作关系的行为通常称为装配(wiring).这也是依赖注入(DI)的本质. Spring配置的可选方案 当描述bean如何被装配时, ...

  2. spring学习总结——装配Bean学习二(JavaConfig装配bean)

    通过Java代码装配bean 前言:上面梳理了通过注解来隐式的完成了组件的扫描和自动装配,下面来学习下如何通过显式的配置的装配bean: 使用场景:比如说,你想要将第三方库中的组件装配到你的应用中,在 ...

  3. spring学习总结——装配Bean学习三(xml装配bean)

    通过XML装配bean Spring现在有了强大的自动化配置和基于Java的配置,XML不应该再是你的第一选择了.不过,鉴于已经存在那么多基于XML的Spring配置,所以理解如何在Spring中使用 ...

  4. spring学习总结——装配Bean学习一(自动装配)

    一.Spring配置的可选方案 Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系.但是,作为开发人员,你需要告诉Spring要创建哪些bean并且如何将其装配在一起.当描 ...

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

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

  6. Spring学习(二)--装配Bean

    一.Spring装配机制 Spring提供了三种主要的装配机制: 1.在XML中进行显示配置 2.在Java中进行显示配置 3.隐式的bean发现机制和自动装配--自动化装配bean Spring可以 ...

  7. Spring学习笔记-装配Bean-02

    什么是装配 创建应用对象之间写作关系的行为通常称为装配(wiring),这也是依赖注入(DI)的本质. Spring配置的可选方案 Spring提供了3中主要的装配机制: ● 在XML中进行显式配置. ...

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

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

  9. spring学习总结——装配Bean学习四(导入和混合配置)

    情景:在典型的Spring应用中,我们可能会同时使用自动化和显式配置(JavaConfig)或者XML配置,幸好在Spring中,这些配置方案都不是互斥的.你尽可以将JavaConfig的组件扫描和自 ...

随机推荐

  1. [codeforces 55]D. Beautiful numbers

    [codeforces 55]D. Beautiful numbers 试题描述 Volodya is an odd boy and his taste is strange as well. It ...

  2. linux中comm命令用法

    linux系统中comm命令用法详解 linux系统下的comm命令是一个非常实用的文件对比命令. comm命令功能:   选择或拒绝两个已排序的文件的公共的行. comm命令语法:comm [-12 ...

  3. 【GoLang】GoLang 错误处理 -- 使用 error is value 的思路处理,检查并处理error

    吐血推荐: https://dave.cheney.net/2016/04/27/dont-just-check-errors-handle-them-gracefully 参考资料: https:/ ...

  4. C#之系统自带保存属性

    源代码下载链接 程序开发很多时候需要根据运行环境做不通的参数配置,通过写ini之类的文本文件是一种方法,但这种方法也同时会把数据暴露 Winform开发中可以将需要配置的字段属性保存到程序中(其实也是 ...

  5. sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法

    启动SQL Server 2008 Management Studio 工具菜单----选项----Designers(设计器)----阻止保存要求重新创建表的更改  取消勾选即可.

  6. CSS3 文本3D效果

    代码如下: <!DOCTYPE html> <html> <head> <style> h1 { color: #3D3D3D; font-size: ...

  7. Linux/Unix命令

    MAC 中自定义环境变量 打开:nano .bash_profile 查看:cat text 保存退出:Ctrl+C,Y #在.bash_profile 中添加tree alias tree=&quo ...

  8. 在Debian上用Bind 配置DNS服务器

    1 什么是DNS 初学者可能不理解DNS到底是什么,干什么用.我是在1998年大学毕业时才听说这个词的.那时我在聊天室碰到潍坊信息港的一个网管,我恬不知耻地说我也是个网管,他说也维护DNS吗?我说,D ...

  9. ASM:《X86汇编语言-从实模式到保护模式》1-4章:处理器,内存和硬盘基础

    其实很久之前就学完了实模式了,但是一直没有总结,感觉现在直接在书上做笔记的弊端就是有些知识点不能很很深刻地记下来(毕竟手写最明显的优点就是能深刻地记住知识,但是就是用太多的时间罢了).一下内容都是一些 ...

  10. MFC Initinstance中DoModal()返回-1

    新建一个基于对话框的MFC应用程序,在App的Initinstance中调用对话框DoModal()来显示对话框,这是框架的内容,应用程序框架生成的全部是正常的. 当把我对话框的资源文件提取到一个资源 ...