Spring官方文档阅读- 一些简单的配置(内部bean,集合,dpend-on,延迟初始化)

此文章参考 Spring文档翻译

IoC容器为了避免在实例化Bean是出现错误,一般在实例Container是就会提前装配Scope为singleton(默认)的bean。如果此Bean有其他依赖的Bean ,则其他依赖Bean也会被装配。

Inner beans (内部Bean)  :


	
	
		 
			
			
		
	

内部bean定义不需要定义的id或名称; 如果指定,容器不使用这样的值作为标识符。 容器在创建时也忽略scope标志:内部bean 总是匿名的,它们总是用外部bean创建。 将内部bean注入到协作bean中而不是注入到封闭bean中或者独立访问它们是不可能的。

作为一种角落情况,可以从自定义范围接收销毁回调,例如。 对于包含在单例bean内的请求范围内部bean:内部bean实例的创建将绑定到其包含的bean,但销毁回调允许它参与请求范围的生命周期。 这不是一个常见的情况; 内部bean通常简单地共享它们被包含bean的范围。

Collections 集合

         Java Collection 类型 List Set Map Properties 的属性和参数我们一般直接在元素中就可以设置,如下。

	
	
		
			[email protected]
			[email protected]
			[email protected]
		
	
	
	
		
			a list element followed by a reference 
	
		
			
			
		
	
	
	
		
			just some string
			
		
	

容器还支持集合的合并。 一个应用程序开发人员可以定义一个父类型  或者``元素继承并覆盖父集合中的值。 也就是说,子集合的值是合并父和子集合的元素的结果,子集合元素覆盖父集合中指定的值。

	
		
			
				[email protected]
				[email protected]
			
		
	
	
		
			
			
				[email protected]
				[email protected]
			
		
	

child bean定义的adminEmails属性的元素上使用merge = true属性。 当child bean被容器解析和实例化时,生成的实例会有一个adminEmails``Properties集合,其中包含子集adminEmailscollection与父集合'adminEmails`集合的合并结果。

[email protected]
[email protected]
[email protected]

不能合并不同的集合类型(例如一个Map和一个List),如果这样做,一个Exception被抛出。 merge属性必须在下层,继承,子定义上指定; 在父集合定义上指定merge属性是多余的,并且不会导致所需的合并。


Null and empty string values (null和空字符串)

Spring将空参数的属性等作为空的字符串处理。 以下基于XML的配置元数据片段将email属性设置为空的“String”值(“”)。

<bean class="ExampleBean">
	<property name="email" value=""/>
bean>

以上配置等同于以下Java代码:

exampleBean.setEmail("")

元素用来处理null值。 例如:

<bean class="ExampleBean">
	<property name="email">
		<null/>
	property>
bean>

以上配置等同于以下Java代码:

exampleBean.setEmail(null)

XML shortcut with the p-namespace (使用P命名空间简化操作)

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean name="classic" class="com.example.ExampleBean">
		<property name="email" value="[email protected]"/>
	bean>

	<bean name="p-namespace" class="com.example.ExampleBean"
		p:email="[email protected]"/>
beans>
 个人不喜欢这样,还是用 property 节点检查修改起来更加的方便 
 
  

Compound property names (组合属性名称)

    <bean id="foo" class="foo.Bar">

        <property name="fred.bob.sammy" value="123" />

    bean>

关于depends-on :

    如果bean是另一个的依赖,通常意味着一个bean被设置为另一个的属性。 通常你用element 在XML中配置依赖。 然而,有时bean之间的依赖不直接; 例如,类的静态块初始化,又比如数据库驱动程序注册。  depends-on 属性可以在使用此元素的bean初始化之前明确强制一个或多个bean被初始化。 以下示例使用 depends-on属性来表示对单个bean的依赖关系:


多个依赖可以用逗号,空格,分号隔开

	



Lazy-initialized beans(延迟初始化bean)

默认情况下,ApplicationContext实现急切地创建和配置所有singleton bean作为初始化过程的一部分。 通常,这种预实例化是期望的,因为配置或周围环境中的错误被立即发现,而不是数小时或甚至数天之后。 当这种行为不是所期望的,你可以通过将bean定义标记为延迟初始化来阻止单例bean的预实例化。 一个延迟初始化的bean告诉IoC容器在第一次请求时而不是在启动时创建一个bean实例。

在XML中,此行为由元素上的lazy-init属性控制; 例如:


但是,当一个延迟初始化的bean是单例bean的依赖,而这个单例bean又 不是  lazy初始化时,ApplicationContext在启动时创建延迟初始化的bean,因为它必须满足singleton的依赖。因此延迟加载的bean会被注入单例bean。



你可能感兴趣的:(Spring文档阅读笔记)