Spring实战笔记2---Bean的装配
创建应用对象之间协作关系的行为通常成为装配,该篇的主要内容有两个,一个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的装配的更多相关文章
- spring实战四之Bean的自动装配(注解方式)
使用注解装配: 从spring2.5开始,Spring启用了使用注解自动装配Bean的属性,使用注解方式自动装配与在XML中使用 autowire 属性自动装配并没有太大区别,但是使用注解方式允许更细 ...
- spring实战二之Bean的自动装配(非注解方式)
Bean的自动装配 自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让Spring自动识别如何装配Bea ...
- spring实战五之Bean的自动检测
在spring实战四中,使用在Spring中增加<context:annotation-config>的方式告诉Spring,我们打算使用基于注解的自动装配,希望Spring特殊对待我们所 ...
- Spring学习记录(三)---bean自动装配autowire
Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系,少写几个ref autowire: no ---默认情况,不自动装配,通过ref手动引用 byName---根据 ...
- Spring4学习笔记 - 配置Bean - 自动装配 关系 作用域 引用外部属性文件
1 Autowire自动装配 1.1 使用:只需在<bean>中使用autowire元素 <bean id="student" class="com.k ...
- Spring学习日志之Bean的装配
Spring容器负责创建应用程序中的bean并通过依赖注入来协调这些对象之间的关系.但是,作为开发人员,要告诉Spring需要创建哪些bean并且如何将其装配在一起.当描述bean如何装配时,Spri ...
- Spring学习笔记--注入Bean属性
这里通过一个MoonlightPoet类来演示了注入Bean属性property的效果. package com.moonlit.myspring; import java.util.List; im ...
- Spring MVC系列-(2) Bean的装配
2. Bean的装配 Spring容器负责创建应用程序中的bean,并通过DI来协调对象之间的关系.Spring提供了三种主要的装配机制: XML显式配置: Java配置类进行显式配置: 隐式的bea ...
- Spring学习笔记(3)——Bean的注入方式
依赖注入 依赖注入支持属性注入.构造函数注入.工厂注入. 属性注入: 属性注入即通过setXxx()方法注入Bean的属性值或依赖对象 属性注入要求Bean提供一个默认的构造函数(无参构造函数),并为 ...
随机推荐
- SQLiteLog (1) no such Column:
今天在进入sqlite数据库查询的时候出现了这个问题,SQLiteLog (1) no such Column: BGZ 搜索得知这是因为数据库中没有这一列,我的sql语句为" ...
- 电驴 emule 源代码分析 (1)
关于电驴emule 的源代码,网上有一个 叫刘刚的人 分析的 非常多,可是假设你仅仅是看别人的分析,自己没有亲身去阅读代码的话,恐怕非常难 剖析整个系统. 关于emule 主要就是 连接 kad ...
- Enterprise Solution 企业管理软件开发框架
Enterprise Solution 开源项目资源汇总 Visual Studio Online 源代码托管 企业管理软件开发框架 Enterprise Solution 是一套管理软件开发框架,在 ...
- unity3d游戏开发学习之使用3dmax创建导弹模型
在着手研究Unity3D的游戏开发时,3D模型能够考虑从unity的assets store去获取,也能够从网上搜索下载,同一时候咱们也能够尝试下自己动手去做一些简单的模型. 这里就依据unity3d ...
- Swift - 列表项尾部附件点击响应(感叹号,箭头等)
列表单元格尾部可以添加各种样式的附件,如感叹号,三角箭头等.而且点击内容区域与点击附件的这两个响应事件是不同的,这样可以方便我们实现不同的功能(比如点击内容则查看详情,点击感叹号则编辑) 1 2 3 ...
- java中遍历MAP,嵌套map的几种方法
java中遍历MAP的几种方法 Map<String,String> map=new HashMap<String,String>(); map.put("us ...
- [置顶] head first 设计模式之----Observer pattern
浅谈设计模式之----观察者模式 观察者模式也是我们日常程序编写中碰到比较多的一种设计模式.首先,所谓观察者模式定义就是指:在对象之间定义了一对多的依赖,这样一来,当一个对象的状态发生变化的 ...
- tmd123.com
赞!完胜百度的搜索!比baidu.com好多了! 搜索用!非常像!比baidu.com好多了! mark一下 发现有人录制了101集swift视频教程好像持续更新中......
- QQ圈子降级为“应用”后应关注其隐私设置
在之前的QQ版本中,QQ圈子的权限设置在“系统设置”对话框的“权限设置”中,如图所示. 但是在更新后的2013SP1版本中,“系统设置”对话框中的“权限设置”已经没有了“圈子权限” QQ圈子成了应用管 ...
- 三次握手wireshark抓包分析,成功握手和失败握手
启动 点击start出现下面的对话框 wireshark是捕获机器上的 某一块网卡的网络包,当机器上有多块网卡的时候,需要选择一个网卡进行捕获操作. 选择网卡 >主页面上,直接点击选中后star ...