Spring4-容器5-依赖配置详解

原文链接: https://my.oschina.net/u/3145136/blog/866551

1 直接变量 (基本类型, String类型等)


    
    
    
    
    

2 idref元素

idref元素用来将容器内其他bean的id(值是字符串-不是引用)传给元素 或者 




    
        
    

    上面的bean定义片段完全等同于(在运行时)下面片段:




    

    第一种形式比第二种形式更好,因为使用idref标签允许容器在部署时验证引用的bean是否存在。 在第二种形式中,传给 client bean中属性targetName的值并没有被验证。 只有当 client bean完全实例化的时候错误才会被发现(可能伴随着致命的结果)。如果 client bean是原型 bean。那么这个错误和异常可能只有再容器部署很长一段时间后才能被发现。

    与ProxyFactoryBean bean定义中使用元素指定AOP 拦截器配置 (版本不低于Spring 2.0)相同之处在于:当你指定拦截器名称的时候使用元素可以防止你拼错拦截器的id。

3 引用其他bean

    在  或者 可以使用ref 元素。该元素用来将bean中指定属性的值设置为对容器的另外一个bean的引用。该引用bean将被作为依赖注入,而且再注入之前会被初始化(如果协作者是单例)。xml的bean元素的值既可以目标bean的id属性也可以是其中一个目标bean的name 属性值。

4 使用parent属性引用父容器中的同名Bean

    通过parent属性指定目标bean来创建bean的引用,该bean是当前容器下的父级容器。parent属性值既可以是目标bean的id也可以是 name属性值。而且目标bean必须在当前容器的父级容器中。使用parent属性的主要用途是为了用某个与父级容器中的bean同名的代理来包装父级容器中的一个bean。



    


    class="org.springframework.aop.framework.ProxyFactoryBean">
    
         
    
    

4 内部bean

    所谓的内部bean就是指在  或者  元素内部使用定义bean。


    
    
         
            
            
        
    

    内部bean的定义不需要id或者name属性。容器会忽略这些属性值。同时容器也会忽略scope标志位。内部bean 总是 匿名的 并且他们总是伴随着外部bean创建。同时将内部bean注入到包含该内部bean之外的bean是不可能的。

5 集合

    在, 和元素中,你可以设置值和参数分别对应Java的集合类型ListSetMap, 和 Properties


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

map的key或者value值,或者set的value值还可以是以下任意元素:

bean | ref | idref | list | set | map | props | value | null

6 集合合并

    Spring元素支持父子Bean的集合的合并,子集中的元素值将覆盖父集中对应的值。


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

注意child`bean的定义中元素上的`merge=true属性的是表示需要集合合并。

上述的合并结果为:

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

, 和 集合类型的合并处理都基本类似。元素某个方面有点特殊,这和List集合类型的语义学有关 换句话说,比如维护一个有序集合的值,父bean的列表内容将排在子bean李彪内容的前面。

7 强类型集合

    Java 5 引入了泛型,这样你可以使用强类型集合。换句话说声明一个只能包含String类型元素的Collection ,如果使用Spring来给bean注入强类型的Collection,在向强类型Collection添加元素前,这些元素将被转换成String类型的。

public class Foo {

    private Map accounts;

    public void setAccounts(Map accounts) {
        this.accounts = accounts;
    }
}

    
        
            
                
                
                
            
        
    

foo bean的accounts 属性准备注入时,通过反射获得强类型Map元素类型的泛型信息。Spring的底层类型转换 机制会把各种value元素值转换为Float,因此字符串9.99, 2.75 和3.99将会转换为实际的Float 类型。

8 Null和空字符串

Spring会把空属性当做空字符串处理。以下的基于XML配置的片段将email属性设置为空字符串。


    

先前的例子等同于以下Java代码:

exampleBean.setEmail("")

元素处理null值,例如:


    
        
    

上面的配置等同于下面的Java代码:

exampleBean.setEmail(null)

9 XML使用p命名空间简化

    p命名空间不是定义在XSD文件而是存在于Spring内核中,不需要在XSD schema中定义。

    下面的例子展示了两种XML片段,其结果是一样的:第一个使用了标准XML格式,第二种使用了p命名空间。



    
        
    

    

接下来的例子包括了两种以上bean的定义,都引用了另外一个bean。



    
        
        
    

    

    
        
    

    正如你看到的,例子不仅使用p命名空间包含了一个属性值,而且使用了一个特殊的格式声明了一个属性的引用。在第一个bean 定义中使用了创建一个john bean 对jane bean的引用,第二个bean的定义使用了p:spouse-ref="jane",它们做了同样一件事情。在这个例子中spouse是属性名,而-ref部分声明了这不是一个直接的值而是另一个bean的引用。

    p命名空间没有标准XML格式那么灵活。举个例子,声明属性的引用是以Ref结尾的,采用p命名空间将会产生冲突,但是采用标准XML 格式则不会。我们建议你小心的选择并和团队成员交流你的想法,避免在XML文档中同时使用所有的三种方法。

10 c命名空间

c命名空间不是定义在XSD文件而是存在于Spring内核中,不需要在XSD schema中定义。

下面是一个使用C命名空间的例子



    
    

    
    
        
        
        
    

    
    

    极少数的情况下构造器参数的名称不可用(通常字节码没有经过调试信息编译),可以使用备份进行参数索引。


    因为XML的语法,索引标记需要_主导作为XML属性名称,这不能已数字开头(即使某些IDE这么允许)

11 组合属性名称

    当你设置bean属性时可以使用组合或者嵌套属性名称,只要路径上所有组件除了最终属性不为空。看以下bean的定义:


    

foo bean有一个fred属性,fred属性又有个bob属性,bob属性又有个属性,最后把 sammy属性设置值为123。为了是这个起作用,foofred属性和 fredbob属性在bean被构造后都不能为空,否则会抛出NullPointerException异常。

转载于:https://my.oschina.net/u/3145136/blog/866551

你可能感兴趣的:(Spring4-容器5-依赖配置详解)