Spring装配

在spring容器内拼凑bean叫作装配。装配bean的时候,你是在告诉容器,

需要哪些bean,以及容器如何使用依赖注入将它们配合在一起。

  理论上,bean装配可以从任何资源获得,包括属性文件,关系数据库

等,但xml是最常见的spring 应用系统配置源。Spring中的几种容器都支

持使用xml装配bean,包括:

  XmlBeanFactory ,

  ClassPathXmlApplicationContext ,

  FileSystemXmlApplicationContext ,

  XmlWebApplicationContext

  基本的xml配置包括如下几个方面:

  

  1.添加一个bean

  2.设置bean的属性

  2.1 手动设置

  2.1.1 通过Setter方法

  2.1.2 通过构造器

  2.2 自动设置

  其中bean的属性即为bean里的成员变量,这些成员变量值的获得可以

通过 setter方法,例如某个属性为name,则setter方法为setName(String

name);或者通过构造器在类被实例化时初始化。Setter方法(例如

setName方法)或者构造器的调用都可以通过在xml文件里进行配置,从而

实现让spring容器来自动进行。

  1.添加一个bean

  以下是一个例子:

  <bean

id = “mybean”

Class = “blog.spring.MyBean”

Singleton = “false”

init-method = “initMethod”

destroy-method = “destroyMethod”

autowire = “autowire type”

/>  id = “mybean”

  Class = “blog.spring.MyBean”

  Singleton = “false”

  init-method = “initMethod”

  destroy-method = “destroyMethod”

  autowire = “autowire type”

  />

  下面是对该标签里各个属性的解释:

  Id : 标识该bean的名称,通过factory.getBean(“id”)来获得实例



  Class : 该bean的类路径。

  Singleton : 默认为true,即单实例模式,每次getBean(“id”)时

获取的都是同

  一个实例,如果设置为false,即原型模式,则每次获取的是新创建

  的实例。

  Init-method : 在bean实例化后要调用的方法(bean里定义好的方法)



  Destroy-method : bean从容器里删除之前要调用的方法。

  Autowire : 其属性要通过何种方法进行属性的自动装配。

  对于上述的各个属性,id和class是必要的,其他的则可以省略。例

如如果设置了autowire的值,则表明需要自动装配,否则是手动装配。

  2.通过Setter方法手动设置bean里的属性

  Bean里的属性通过<property>标签来标识。有以下几种情况:

  ● 简单类型属性

  <bean id = “mybean” class = “blog.spring.MyBean”>

  <property name = “name”>

  <value>springTest</value>

  </property>

  </bean>

  ● 引用其他bean

  <bean id = “mybean” class = “blog.spring.MyBean” />

  <bean id = “mybean1” class = “blog.spring.MyBean1”>

  <property name = “name”>

  <ref bean = “mybean” />

  </property>

  </bean>

  也可以将<ref>改为

  <bean class = “..”>

  这样叫做内部bean,缺点是无法在其他地方重用这个bean的实例。

  ● 装配集合

  共有以下几种集合的装配:

  ****装配List和数组****

  <property name = ”nameList”>

  <list>

  <value>something</value>

  <ref bean = “blog.spring.MyBean” />

  <value>otherThing</value>

  </list>

  </property>

  ****装配Set****

  <property name = ”nameList”>

  <set>

  <value>something</value>

  <ref bean = “blog.spring.MyBean” />

  <value>otherThing</value>

  </set>

  </property>

  ****装配Map****

  <property name = ”nameList”>

  <map>

  <entry key = “key1”>

  <value>value1</value>

  </entry>

  <entry key = “key2”>

  <ref bean = “mybean” />

  </entry>

  </map>

  </property>

  ****装配Properties****

  <property name = ”nameList”>

  <props>

  <prop key = “prop1”>value1</prop>

  <prop key = “prop2”>value2</prop>

  </props>

  </property>

  ● 设置null

  要将一个属性null,需要通过<null />标签,如果不设置,则属性为

默认值(在实例化时)而不是null。

  <property name=”name”><null /> </property>

  3.通过构造器手动设置bean里的属性

  假设有如下一个bean:

  Public class MyBean {

  Public MyBean( String arg1, MyBean1 arg2, String arg3 )

  }

  则可以在xml里这样配置该bean:

  <bean id = “mybean” class = “blog.spring.MyBean”>

  <constructor-arg index = “1”>

  <value>springTest</value>

  <constructor-arg>

  <constructor-arg index = “0”>

  <ref bean = “mybean1” />

  <constructor-arg>

  </bean>

  其中的index是用来标识该参数在构造函数里的位置的,并从0开始。

  4.让spring完成自动装配

  例如:

  <bean

id = “mybean”

class = “blog.spring.MyBean”

autowire = “autowire type”

/>  id = “mybean”

  class = “blog.spring.MyBean”

  autowire = “autowire type”

  />

  下面是几种autowire type的说明:

  ● byname : 试图在容器中寻找和需要自动装配的属性名相同的bean

或id,如果没有找到相应的bean,则这个属性未被装配上。

  ● byType : 试图在容器中寻找一个与需要自动装配的属性类型相同

的bean或id,如果没有找到,则该属性未被装配上。

  ● constructor : 试图在容器中寻找与需要自动装配的bean的构造

函数参数一致的一个或多个bean,如果没找到则抛出异常。

  ● autodetect : 首先尝试使用constructor来自动装配,然后再使

用byType方式。

  从上面可以看出,如果某个bean不手动设置autowire属性,则默认为

手动装配。如果需要将所有bean都设置为自动装配时,可以通过在

<beans>标签中设置default-autowire属性。<beans>标签是整个xml文档

的根,在它下面就是一个个的<bean>。

  其中default-autowire的值也有byName,byType,constructor,

autodetect四种。

  例如配置如下:

  <beans default-autowire = “byName”>

  ...

  </beans>

  自动装配可能带来不确定性问题。例如使用byType时可能同时发现两

个相同的类型,则不知道该采用哪一个。所以可能混合采用自动和手动装

配。例如,对某个bean设置为自动装配,而对其某个属性则手动明确的设

置其值,例如:

  <bean id = “mybean” class = “blog.spring.MyBean”

Autowire = “byType”

>  Autowire = “byType”

  >

  <property name = “name”>

  <ref bean = “myBean1”>

  </property>

  </bean>

  通过这样的配置,对mybean里的name属性进行手动装配,而对除name

外的其他属性就进行自动装配。

================================================================

==================

另一篇文章相关:

Spring ApplicationContext.xml配置的12个技巧

Spring是一个强有力的java程序框架,其被广泛应用于java的程序中。它

用 POJO提供了企业级服务。 Spring利用依赖注入可以获得简单而有效的

测试能力。Spring beans,依赖关系,以及服务所需要的bean都将在配置

文件中予以描述,配置文件一般采用XML格式。然而XML配置文件冗长而不

易使用,在你进行一 个使用了大量bean的大项目中它将变得难以阅读和

控制。



在这篇文章中我将给你展示12种的有关Spring XML配置文件的最佳技巧。

它们中的一些具有更多的实际意义,而不仅是最好的技巧。请注意另外一

些因素,例如域模型的设计,会影响到XML配置,但是这篇文章更关注于

XML配置的可读性和可操控性。



1.避免使用自动装配

Spring 可以通过bean类的自省来实现自动装配依赖,这样的话你就不必

明确地描述bean的属性或者构造函数的参数。根据属性名称活匹配类型,

bean属性可以 自动进行装配。而构造函数可以根据匹配类型自动装配。

你甚至可以设置自动装配进行自动侦测,这样Spring替你就会选择一个合

适的机制。请看下面的例 子:





Spring 可以通过bean类的自省来实现自动装配依赖,这样的话你就不必

明确地描述bean的属性或者构造函数的参数。根据属性名称活匹配类型,

bean属性可以 自动进行装配。而构造函数可以根据匹配类型自动装配。

你甚至可以设置自动装配进行自动侦测,这样Spring替你就会选择一个合

适的机制。请看下面的例 子:



<bean id="orderService"

class="com.lizjason.spring.OrderService"

autowire="byName"/>



OrderService 类的属性名被用来和容器中的一个bean实例进行匹配。自

动装配会默默的保存一些类型信息并降低混乱。然而,由于它会牺牲掉这

种配置的直观性和可维护性, 你在实际的项目中将不会用到它。许多指

南和陈述材料都把它吹捧为Spring的一个非常cool的特性,而没有提到它

的这个缺点。依我之见,就像 Spring的对象池一样,它更多了一些商业

味道。它看起来好像可以使XML配置文件更精简一些,但实际上却增加其

复杂性,尤其是在你的较大规模的工程中 已经定义了很多bean的时候更

是如此。Spring允许你混合使用自动和手动装配,但是这种矛盾会使XML

配置更加的令人费解。



2.使用命名规范

和Java 编码的理念一样,在项目中始终用清晰的,描述性的,一致的命

名规范对开发人员理解XML配置非常有用。拿bean ID举例来说,你可以遵

循Java类中属性的命名规范。比如说,OrderServiceDAO的bean ID应该是

orderServiceDAO。对于大项目来说,在bean ID前加包名来作为前缀。



3.使用简化格式

简化格式有利于减少冗余,因为它把属性值和引用作为属性,而不是子元

素。看下面的例子:


<bean id="orderService"


class="com.lizjason.spring.OrderService">


<property name="companyName">


<value>lizjason</value>


</property>


<constructor-arg>


<ref bean="orderDAO">


</constructor-arg>


</bean>

以上程序可以重新以简化格式书写为:


<bean id="orderService"


class="com.lizjason.spring.OrderService">


<property name="companyName"


value="lizjason"/>


<constructor-arg ref="orderDAO"/>


</bean>

简化格式在1.2版本时已经可用了,但请注意不存在<ref local="...">这

种简化格式不仅可以较少你的代码输入量,而且可以使XML配置更加的清

晰。当你的配置文件中存在大量的bean定义时,它可以显著地提高可读性





4.尽量使用type而不是index去解决构造函数参数的匹配问题

当构造函数中有多个同类型的参数时,Spring只允许你使用从0开始的

index或者value标签来解决这个问题。请看下面的例子:


<bean id="billingService"


class="com.lizjason.spring.BillingService">


<constructor-arg index="0" value="lizjason"/>


<constructor-arg index="1" value="100"/>


</bean>

最好用type属性取代上面的做法:


<bean id="billingService"


class="com.lizjason.spring.BillingService">


<constructor-arg type="java.lang.String"


value="lizjason"/>


<constructor-arg type="int" value="100"/>


</bean>



用index可以稍微减少冗余,但是它更容易出错且不如type属性可读性高

。你应该仅在构造函数中有参数冲突时使用index。



5.如可能,尽量复用bean定义

Spring 提供了一种类似于继承的机制来降低配置信息的重复并使XML配置

更加的简单。一个子bean可以从它的父bean继承配置信息,本质上这个父

bean就像 它的子bean的一个模板。这是一个在大型项目中必须使用的特

性。所有你要做的就是把父bean的abstract属性置为true,并在子bean中

加 以引用。例如:


<bean id="abstractService" abstract="true"


class="com.lizjason.spring.AbstractService">


<property name="companyName"


value="lizjason"/>


</bean>





<bean id="shippingService"


parent="abstractService"


class="com.lizjason.spring.ShippingService">


<property name="shippedBy" value="lizjason"/>


</bean>

shippingService bean继承了abstractService bean的属性companyName

的值lizjason。注意,如果你为bean声名一个class或工厂方法,这个

bean将会默认为abstract



6.

尽量使用

ApplicationContext

装配bean,而不是用import

像Ant脚本中imports一样,

Spring的

import

元素对于模块化bean的装配非常有用,例如:


<beans>


<import resource="billingServices.xml"/>


<import resource="shippingServices.xml"/>


<bean id="orderService"


class="com.lizjason.spring.OrderService"/>


<beans>

然而,比起在XML中用imports预装配这些bean,利用ApplicationContext

来配置它们将更加灵活,也可以使XML配置更加的易于管理。你可以像下

面这样传递一个bean定义数组到ApplicationContext的构造函数中:

String[] serviceResources =

{"orderServices.xml",

"billingServices.xml",

"shippingServices.xml"};

ApplicationContext orderServiceContext = new

ClassPathXmlApplicationContext(serviceResources);



7.用id来标识bean

你可以用id 或名字作为bean的标识。用id可读性较差,但是它可以影响

XML分析器使bean的reference有效。如果id由于XML IDREF约束而无法使

用,你可以用name作为bean的标识。XML IDREF约束是指id必须以字母开

始(或者是在XML声名了的一个标点符号),后面可以是字母,数字,连字

符,下划线,冒号或full stops(不知道怎么翻译好)。在实际应用中很少

会遇到XML IDREF约束问题。



8.在开发阶段使用依赖检查

你可以为bean的dependency-check属性设置一个值来取代默认的none,比

如说simple,objects或者all,这样的话容器将替你做依赖有效性的检查

。当一个bean的所有属性(或者某些属性目录)都被明确设置,或利用自动

装配时将会非常有用。


<bean id="orderService"


class="com.lizjason.spring.OrderService"


dependency-check="objects">


<property name="companyName"


value="lizjason"/>


<constructor-arg ref="orderDAO"/>


</bean>

在这个例子中,容器将确保这些属性不是privitives或者保证

collections是为orderService bean设置的。为所有的bean设置默认的依

赖检查是可能的,但这个特性由于有些bean的属性不需要设置而很少使用





9.为每个配置文件加一个描述注释

在XML配置文件中最好使用有描述性的id和name,而不是成堆的注释。另

外,加一个文件描述头将会非常有用,这个描述可以概括文件中定义的

bean。另一个选择,你可以在

description

元素中加入描述信息。例如:


<beans>


<description>


This file defines billing service


related beans and it depends on


baseServices.xml,which provides


service bean templates...


</description>


...


</beans>



description



素的一个好处就是工具可以很容易的把描述信息从这个元素中提取出来。



10.

和team members沟通变更

当你修改java源码后,要确保更改了配置文件中的相应部分并把这个情况

告知你的team members。XML配置文件也是代码,它们是程序的重要组成

部分,但它们很难阅读和维护。大多数时间里,你需要同时看XML配置文

件和java代码才能知道是怎么回事。



11.

setter

注入和构造函数注入,优先使用前者

Spring提供了三种注入方式:构造函数注入,setter注入和方法注入。一

般我们使用前两种。


<bean id="orderService"


class="com.lizjason.spring.OrderService">


<constructor-arg ref="orderDAO"/>


</bean>





<bean id="billingService"


class="com.lizjason.spring.BillingService">


<property name="billingDAO"


ref="billingDAO">


</bean>

在这个例子中,orderService bean用了构造函数注入,而

BillingService

bean用了setter注入。构造函数注入可以确保bean正确地构建,但是

setter注入更加的灵活和易于控制,特别是当class有多个属性并且它们

中的一些是可选的情况是更是如此。



12. 不要滥用注入

就像前面提到的,Spring的

ApplicationContextEclipse and IntelliJ,java代码更加的易于阅读,

维护和管理比使XML文件

可以替你创建

java

对象



但不是所有的

java

对象都应该通过注入创建。例如



域对象就不应该通过

ApplicationContext

创建。Spring是一个优秀的框架,但是考虑到可读性和可操控性,基于

XML配置的配置会在定义很多bean的时候出现麻烦。过渡使用依赖注入将

会使XML配置更加的复杂和冗长。切记,当使用高效的IDE时,例如



结论

XML是Spring 流行的配置格式。存在大量bean定义时,基于XML的配置会

变得冗长而不易使用。Spring提供了丰富的配置选项。适当地使用这些选

项可以使XML配 置更加的清晰,但其它的一些选项,例如自动装配,可能

会降低可读性和可维护性。参考本文中提到的这些技巧可能会帮助你创建

干净而易读的XML配置文件


<bean

id="beanId"(1)

name="beanName"(2)

class="beanClass"(3)

parent="parentBean"(4)

abstract="true | false"(5)

singleton="true | false"(6)

lazy-init="true | false | default"(7)

autowire="no | byName | byType | constructor | autodetect |

default"(8)

dependency-check = "none | objects | simple | all | default"(9



depends-on="dependsOnBean"(10)

init-method="method"(11)

destroy-method="method"(12)

factory-method="method"(13)

factory-bean="bean">(14)

</bean>

(1)、id: Bean的唯一标识名。它必须是合法的XML ID,在整个XML文档

中唯一。

(2)、name: 用来为id创建一个或多个别名。它可以是任意的字母符合

。多个别名之间用逗号或空格分开。

(3)、class: 用来定义类的全限定名(包名+类名)。只有子类Bean不

用定义该属性。

(4)、parent: 子类Bean定义它所引用它的父类Bean。这时前面的class

属性失效。子类Bean会继承父类Bean的所有属性,子类Bean也可以覆盖父

类Bean的属性。注意:子类Bean和父类Bean是同一个Java类。

(5)、abstract(默认为”false”):用来定义Bean是否为抽象Bean。

它表示这个Bean将不会被实例化,一般用于父类Bean,因为父类Bean主要

是供子类Bean继承使用。

(6)、singleton(默认为“true”):定义Bean是否是 Singleton(单

例)。如果设为“true”,则在BeanFactory作用范围内,只维护此Bean的

一个实例。如果设为 “flase”,Bean将是Prototype(原型)状态,

BeanFactory将为每次Bean请求创建一个新的Bean实例。

(7)、lazy-init(默认为“default”):用来定义这个Bean是否实现

懒初始化。如果为“true”,它将在BeanFactory启动时初始化所有的

Singleton Bean。反之,如果为“false”,它只在Bean请求时才开始创建

Singleton Bean。

(8)、autowire(自动装配,默认为“default”):它定义了Bean的自

动装载方式。

1、“no”:不使用自动装配功能。

2、“byName”:通过Bean的属性名实现自动装配。

3、“byType”:通过Bean的类型实现自动装配。

4、“constructor”:类似于byType,但它是用于构造函数的参数的自动

组装。

5、“autodetect”:通过Bean类的反省机制(introspection)决定是使

用“constructor”还是使用“byType”。

(9)、dependency-check(依赖检查,默认为“default”):它用来确

保Bean组件通过JavaBean描述的所以依赖关系都得到满足。在与自动装配

功能一起使用时,它特别有用。

1、 none:不进行依赖检查。

2、 objects:只做对象间依赖的检查。

3、 simple:只做原始类型和String类型依赖的检查

4、 all:对所有类型的依赖进行检查。它包括了前面的objects和simple



(10)、depends-on(依赖对象):这个Bean在初始化时依赖的对象,这

个对象会在这个Bean初始化之前创建。

(11)、init-method:用来定义Bean的初始化方法,它会在Bean组装之后

调用。它必须是一个无参数的方法。

(12)、destroy-method:用来定义Bean的销毁方法,它在BeanFactory

关闭时调用。同样,它也必须是一个无参数的方法。它只能应用于

singleton Bean。

(13)、factory-method:定义创建该Bean对象的工厂方法。它用于下面

的“factory-bean”,表示这个Bean是通过工厂方法创建。此时,

“class”属性失效。

(14)、factory-bean:定义创建该Bean对象的工厂类。如果使用了

“factory-bean”则“class”属性失效。



下面列出<ref>元素的所有可用的指定方式:

bean:可以在当前文件中查找依赖对象,也可以在应用上下文

(ApplicationContext)中查找其它配置文件的对象。

local:只在当前文件中查找依赖对象。这个属性是一个XML IDREF,所以

它指定的对象必须存在,否则它的验证检查会报错。

external:在其它文件中查找依赖对象,而不在当前文件中查找。

总的来说,<ref bean="..."/>和<ref local="..."/>大部分的时候可以

通用。“bean”是最灵活的方式,它允许你在多个文件之间共享Bean。而

“local”则提供了便利的XML验证。


如何使用spring的作用域:

<bean id="role" class="spring.chapter2.maryGame.Role"

scope="singleton"/>

这里的scope就是用来配置spring bean的作用域,它标识bean的作用域。

在spring2.0之前bean只有2种作用域即:singleton(单例)、non-

singleton(也称 prototype), Spring2.0以后,增加了session、

request、global session三种专用于Web应用程序上下文的Bean。因此,

默认情况下Spring2.0现在有五种类型的Bean。当然,Spring2.0对 Bean

的类型的设计进行了重构,并设计出灵活的Bean类型支持,理论上可以有

无数多种类型的Bean,用户可以根据自己的需要,增加新的Bean类 型,

满足实际应用需求。

1、singleton作用域

当一个bean的作用域设置为singleton, 那么Spring IOC容器中只会存在

一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹

配,则只会返回bean的同一实例。换言之,当把 一个bean定义设置为

singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。

这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针

对该bean的后续请求和引用都 将返回被缓存的对象实例,这里要注意的

是singleton作用域和GOF设计模式中的单例是完全不同的,单例设计模式

表示一个ClassLoader中 只有一个class存在,而这里的singleton则表示

一个容器对应一个bean,也就是说当一个bean被标识为singleton时 候,

spring的IOC容器中只会存在一个该bean。

配置实例:

<bean id="role" class="spring.chapter2.maryGame.Role"

scope="singleton"/>

或者

<bean id="role" class="spring.chapter2.maryGame.Role"

singleton="true"/>

2、prototype

prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,

或者以程序的方式调用容器的

getBean()

方法)都会产生一个新的bean实例,相当与一个new的操作,对于

prototype作用域的bean,有一点非常重要,那就是Spring不能对一个

prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是

装配完一个prototype实例后,将它交给客户端,随后就对该prototype实

例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周

期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法

都将不会被调用。 清除prototype作用域的对象并释放任何prototype

bean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被

singleton作用域bean占用资源的一种可行方式是,通过使用 bean的后置

处理器,该处理器持有要被清除的bean的引用。)

配置实例:

<bean id="role" class="spring.chapter2.maryGame.Role"

scope="prototype"/>

或者

<beanid="role" class="spring.chapter2.maryGame.Role"

singleton="false"/>

3、request

request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean

仅在当前HTTP request内有效,配置实例:

request、session、global session使用的时候首先要在初始化web的

web.xml中做如下配置:

如果你使用的是Servlet 2.4及以上的web容器,那么你仅需要在web应用

的XML声明文件web.xml中增加下述ContextListener即可:

<web-app>

...

<listener>

<listener-

class>org.springframework.web.context.request.RequestContextList

ener</listener-class>

</listener>

...

</web-app>


,如果是Servlet2.4以前的web容器,那么你要使用一个

javax.servlet.Filter的实现:

<web-app>

..

<filter>

<filter-name>requestContextFilter</filter-name>

<filter-

class>org.springframework.web.filter.RequestContextFilter</filte

r-class>

</filter>

<filter-mapping>

<filter-name>requestContextFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

...

</web-app>


接着既可以配置bean的作用域了:

<bean id="role" class="spring.chapter2.maryGame.Role"

scope="request"/>

4、session

session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时

该bean仅在当前HTTP session内有效,配置实例:

配置实例:

和request配置实例的前提一样,配置好web启动文件就可以如下配置:

<bean id="role" class="spring.chapter2.maryGame.Role"

scope="session"/>

5、global session

global session作用域类似于标准的HTTP Session作用域,不过它仅仅在

基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概

念,它被所有构成某个 portlet web应用的各种不同的portlet所共享。

在global session作用域中定义的bean被限定于全局portlet Session的

生命周期范围内。如果你在web中使用global session作用域来标识bean

,那么web会自动当成session类型来使用。

配置实例:

和request配置实例的前提一样,配置好web启动文件就可以如下配置:

<bean id="role" class="spring.chapter2.maryGame.Role"

scope="global session"/>

6、自定义bean装配作用域

在spring2.0中作用域是可以任意扩展的,你可以自定义作用域,甚至你

也可以重新定义已有的作用域(但是你不能覆盖singleton和 prototype

),spring的作用域由接口

org.springframework.beans.factory.config.Scope来定 义,自定义自

己的作用域只要实现该接口即可,下面给个实例:

我们建立一个线程的scope,该scope在表示一个线程中有效,代码如下:

publicclass MyScope implements Scope ...{

privatefinal ThreadLocal threadScope = new ThreadLocal()

...{

protected Object initialValue() ...{

returnnew HashMap();

}

};

public Object get(String name, ObjectFactory objectFactory)

...{

Map scope = (Map) threadScope.get();

Object object = scope.get(name);

if(object==null) ...{

object = objectFactory.getObject();

scope.put(name, object);

}

return object;

}

public Object remove(String name) ...{

Map scope = (Map) threadScope.get();

return scope.remove(name);

}

publicvoid registerDestructionCallback(String name,

Runnable callback) ...{

}

public String getConversationId() ...{

// TODO Auto-generated method stub

returnnull;

}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值