Spring依赖注入的配置

1:构造器注入

类:

public class ExampleBean {

    private AnotherBean beanOne;
    private YetAnotherBean beanTwo;
    private int i;
    
    public ExampleBean(
        AnotherBean anotherBean, YetAnotherBean yetAnotherBean, int i) {
        this.beanOne = anotherBean;
        this.beanTwo = yetAnotherBean;
        this.i = i;
    }
}



配置文件:

bean id="exampleBean" class="examples.ExampleBean">

  
  
    
  
  
  
  
  
  




   *构造器参数类型配置

package examples;

public class ExampleBean {

    // No. of years to the calculate the Ultimate Answer
    private int years;

    // The Answer to Life, the Universe, and Everything
    private String ultimateAnswer;

    public ExampleBean(int years, String ultimateAnswer) {
        this.years = years;
        this.ultimateAnswer = ultimateAnswer;
    }
}

  配置文件:

针对上面的场景可以通过使用'type'属性来显式指定那些简单类型的构造参数的类型,比如:


  
  


  *构造参数索引

我们还可以通过index属性来显式指定构造参数的索引,比如下面的例子:


  
  


2:Setter注入

public class ExampleBean {

    private AnotherBean beanOne;
    private YetAnotherBean beanTwo;
    private int i;

    public void setBeanOne(AnotherBean beanOne) {
        this.beanOne = beanOne;
    }

    public void setBeanTwo(YetAnotherBean beanTwo) {
        this.beanTwo = beanTwo;
    }

    public void setIntegerProperty(int i) {
        this.i = i;
    }    
}


配置文件:



  
  

  
  
  




3:采用static工厂方法返回对象实例
类:
public class ExampleBean {

    // a private constructor
    private ExampleBean(...) {
      ...
    }
    
    // a static factory method; the arguments to this method can be
    // considered the dependencies of the bean that is returned,
    // regardless of how those arguments are actually used.
    public static ExampleBean createInstance (
            AnotherBean anotherBean, YetAnotherBean yetAnotherBean, int i) {

        ExampleBean eb = new ExampleBean (...);
        // some other operations...
        return eb;
    }
}

 


配置文件:

  
  
   



 
传给static工厂方法的参数由constructor-arg元素提供,这与使用构造器注入时完全一样。而且,重要的是,工厂方法所返回的实例的类型并不一定要与包含static工厂方法的类类型一致。
 
4:简单的例子
   *配置一个java.util.Properties实例
    
      
   
   
      
         jdbc.driver.className=com.mysql.jdbc.Driver
         jdbc.url=jdbc:mysql://localhost:3306/mydb
      
   

如果采用上面的配置,Spring容器将使用JavaBean PropertyEditor元素中的文本转换为一个java.util.Properties实例
 
5:引用其它的bean(协作者)、
   *
    第一种形式也是最常见的形式是通过使用标记指定bean属性的目标bean,通过该标签可以引用同一容器或父容器内的任何bean(无论是否在同一XML文件中)。XML 'bean'元素的值既可以是指定bean的id值也可以是其name
   *
    第二种形式是使用ref的local属性指定目标bean,它可以利用XML解析器来验证所引用的bean是否存在同一文件中。local属性值必须是目标bean的id属性值。如果在同一配置文件中没有找到引用的bean,XML解析器将抛出一个例外。如果目标bean是在同一文件内,使用local方式就是最好的选择(为了尽早地发现错误)。
   *第三种方式是通过使用ref的parent属性来引用当前容器的父容器中的bean。parent属性值既可以是目标bean的id值,也可以是name属性值。而且目标bean必须在当前容器的父容器中。使用parent属性的主要用途是为了用某个与父容器中的bean同名的代理来包装父容器中的一个bean(例如,子上下文中的一个bean定义覆盖了他的父bean)。
   


    



      
            <-- notice how we refer to the parent bean
      
    

6:集合的配置

通过元素可以定义和设置与Java Collection类型对应ListSetMapProperties的值。


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

7:集合的合并


    
        
            [email protected]
            [email protected]
        
    


    
        
        
            [email protected]
            [email protected]
        
    


    在上面的例子中,childbean的adminEmails属性的元素上使用了merge=true属性。当child bean被容器实际解析及实例化时,其 adminEmails将与父集合的adminEmails属性进行合并

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


8:强类型集合(仅适用于Java5+)

类:

public class Foo {
                
    private Map accounts;
    
    public void setAccounts(Map accounts) {
        this.accounts = accounts;
    }
}
配置文件:

    
        
            
                
                
                
            
        
    
foobean的accounts属性被注入之前,通过反射,利用强类型Map的泛型信息,Spring的底层类型转换机制将会把各种value元素值转换为Float类型,因此字符串9.99、2.753.99就会被转换为实际的Float类型
 
9:Nulls
 用于处理null值。Spring会把属性的空参数当作空字符串处理。以下的xml片断将email属性设为空字符串
配置文件:

  

这等同于Java代码: exampleBean.setEmail("")。而null值则可以使用元素可用来表示。例如:

  

上述的配置等同于Java代码:exampleBean.setEmail(null)
 
10:使用p名称空间配置属性

    
    
        

 


    
    
        
        
    

    

    
        
    


11:使用depends-on

depends-on属性可以用于当前bean初始化之前显式地强制一个或多个bean被初始化。下面的例子中使用了depends-on属性来指定一个bean的依赖。




若需要表达对多个bean的依赖,可以在'depends-on'中将指定的多个bean名字用分隔符进行分隔,分隔符可以是逗号、空格及分号等。下面的例子中使用了'depends-on'来表达对多个bean的依赖。


  




ApplicationContext实现加载上述配置时,设置为lazy的bean将不会ApplicationContext启动时提前被实例化,而not.lazy却会被提前实例化。

需要说明的是,如果一个bean被设置为延迟初始化,而另一个非延迟初始化的singleton bean依赖于它,那么当ApplicationContext提前实例化singleton bean时,它必须也确保所有上述singleton 依赖bean也被预先初始化,当然也包括设置为延迟实例化的bean。因此,如果Ioc容器在启动的时候创建了那些设置为延迟实例化的bean的实例,你也不要觉得奇怪,因为那些延迟初始化的bean可能在配置的某个地方被注入到了一个非延迟初始化singleton bean里面。



 

 

你可能感兴趣的:(SSH)