一.从XML文件中获取Bean的方法

1.采用BeanFactory方式


        Resource rs = new FileSystemResource("beans-config.xml");
        BeanFactory factory = new XmlBeanFactory(rs);
        HelloBean helloBean = (HelloBean)factory.getBean("helloBean");
采用BeanFactory方式,可以利用XmlBeanFactory从xml配置文件中获得bean,也可以使用其它方式,比如利用PropertiesFactoryBean从.property文件中获得。

2.采用ApplicationContext方式
采用BeanFactory对简单的应用程序来说就够了,可以获得对象管理上的便利性。
但是要获取一些特色和高级的容器功能,可以采用ApplicationContext。
ApplicationContext提供了一些高级的功能,比如:
1.提供取得资源文件更方便的方法
2.提供文字消息解析的方法
3.支持国际化(i18n)消息
4.可以发布事件,对事件感兴趣的Bean可以接收这些事件

Spring创始者建议采用ApplicationContext取代BeanFactory。
在实现ApplicationContext借口的类中,常用的几个:
FileSystemXmlApplicationContext:
可以指定XML定义文件的相对路径或
者绝对路径来读取定义文件。

ClassPathXmlApplicationCOntext:
可以从classpath中读取XML文件


XmlWebApplicationCOntext:
从Web应用程序的文件架构中,指定相对位置来读取定义文件。
一个简单的例子:

package cn.blogjava.hello;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class SpringDemo {
    public static void main(String[] args) {
        ApplicationContext context =
            new FileSystemXmlApplicationContext("beans-config.xml");       
        HelloBean helloBean = (HelloBean)context.getBean("helloBean");
        System.out.print("Name: ");
        System.out.println(helloBean.getName());
        System.out.print("Word: ");
        System.out.println(helloBean.getHelloWord());
    }
}

二.Type 2 IoC, Type 3 IoC
Type2是 利用setter方法完成依赖注入,这是Spring鼓励的。但也允许使用Type 3注入, 也就是利用构造函数完成注入。
例如:

package cn.blogjava.hello;

public class HelloBean {
   
    private String helloWord;
    private String name;
   
    public HelloBean() {
       
    }

    public HelloBean(String helloWord, String name) {
        this.helloWord = helloWord;
        this.name = name;
    }   
   
    public String getHelloWord() {
        return helloWord;
    }

    public void setHelloWord(String helloword) {
        this.helloWord = helloword;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
   
}

配置文件:
beans-config.xml


    "http://www.springframework.org/dtd/spring-beans.dtd">

   
       
            YYY!
       

       
            Hello!
       

   


三.属性参考
如果在Bean文件中已经有一个定义的Bean实例,可以让某个属性直接参考这个实例。

package cn.blogjava.hello;

import java.util.Date;

public class HelloBean {
   
    private String helloWord;
    private Date date;
   
    public HelloBean() {
       
    }

   
    public String getHelloWord() {
        return helloWord;
    }

    public void setHelloWord(String helloword) {
        this.helloWord = helloword;
    }
   
    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

配置文件
beans-config.xml


    "http://www.springframework.org/dtd/spring-beans.dtd">

   
   
       
            Hello!
       


       
           
       
               
   


如果某个Bean的实例只被参考一次,可以直接在属性定义时使用标签,并仅需要指定其"class"属性即可。


       
           
       
             

四.自动绑定
byType


    "http://www.springframework.org/dtd/spring-beans.dtd">

   
   
       
            Hello!
       

       
            YYY!
       
            
   

这里并没有指定helloBean的data属性,而是通过自动绑定,指定了"byType",所以会根据helloBean的setDate()方法所接受的类型,来判断定义文件中是否有类似的对象,并将之设定给helloBean的setDate(),如果无法完成绑定,会抛异常。

byName
根据id属性上指定的别名是否与setter名称一致来绑定。无法绑定,仅维持未绑定状态,不抛异常。


    "http://www.springframework.org/dtd/spring-beans.dtd">

   
   
       
            Hello!
       

       
            YYY!
       
            
   

autowire="constructor"
根据构造方法上的参数类型,来匹配。无法绑定抛异常。
autowire="autodetect"
会试着用constructor,byType等方式来建立依赖关系。

加入依赖检查
依赖检查有4种方式:
simple只检查简单的属性,例如int或者String类型对象是否完成依赖。
objects检查对象类型的属性是否完成依赖。
all检查所有的属性,none是默认值,不检查依赖性。


   
       
            Hello!
       

       
            YYY!
       
            
   

五.集合对象的注入
对于像数组、List、Set、Map等集合对象, 在注入前若必须填充一些对象到集合中,然后再将集合对象注入到Bean中时,可以交给Spring的IoC容器自动维护或者生成集合对象,并完成依赖注入。

SomeBean.java

package cn.blogjava.hello;

import java.util.List;
import java.util.Map;

public class SomeBean {
   
    private String[] someStrArray;
    private Some[] someObjectArray;
    private List someList;
    private Map someMap;
    public List getSomeList() {
        return someList;
    }
    public void setSomeList(List someList) {
        this.someList = someList;
    }
    public Map getSomeMap() {
        return someMap;
    }
    public void setSomeMap(Map someMap) {
        this.someMap = someMap;
    }
    public Some[] getSomeObjectArray() {
        return someObjectArray;
    }
    public void setSomeObjectArray(Some[] someObjectArray) {
        this.someObjectArray = someObjectArray;
    }
    public String[] getSomeStrArray() {
        return someStrArray;
    }
    public void setSomeStrArray(String[] someStrArray) {
        this.someStrArray = someStrArray;
    }
   
   
}

Some.java

package cn.blogjava.hello;

public class Some {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }   
   
    public String toString(){
        return name;
    }
}

beans-config.xml


    "http://www.springframework.org/dtd/spring-beans.dtd">

   
       
            YYY
       

   

   
   
       
            BYF
       

   

   
   
       
           
                Hello!
                Welcome!
           

       

       
       
           
               
               
           

       

       
       
           
               
                           
           

       

       
       
           
               
                    Hello YYY!
               

               
                   
               

           

       

   

       
   
   


测试类:SpringDemo.java
package cn.blogjava.hello;

import java.util.List;
import java.util.Map;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class SpringDemo {
    public static void main(String[] args) {
        ApplicationContext context =
            new FileSystemXmlApplicationContext("beans-config.xml");       
        SomeBean someBean = (SomeBean)context.getBean("someBean");

        //取得数组类型依赖注入对象
        String[] strs = (String[])someBean.getSomeStrArray();
        Some[] somes = (Some[])someBean.getSomeObjectArray();
        for(int i=0; i < strs.length; i++){
            System.out.println(strs[i] + "," + somes[i].getName());
        }
       
        System.out.println();
        //取得List类型依赖注入对象
        List someList = someBean.getSomeList();
        for(int i=0; i < someList.size(); i++) {
            System.out.println(someList.get(i));
        }
       
        System.out.println();
        //取得Map类型依赖注入对象
        Map someMap = someBean.getSomeMap();
        System.out.println(someMap.get("MapTest"));
        System.out.println(someMap.get("someKey1"));
    }
}



  list, set, map和props元素分别用来设置类型为List,Set,Map和Propertis的属性值。分别用来为bean传入集合值。
对应的spring的配置文件举例如下:

1.   
2. 3. "http://www.springframework.org/dtd/spring-beans.dtd" >   
4.   
5. < beans >   
6.   
7.  < bean  id ="chinese"  class ="Chinese" >   
8.  < property  name ="friends" >   
9.             < list >   
10.                 < value > 张三    
11.                 < value > 李四    
12.                 < value > 王五    
13.                
14.      
15.   < property  name ="score" >   
16.             < map >   
17.                 < entry  key ="数学" >   
18.                     < value > 60    
19.                    
20.                 < entry  key ="英语" >   
21.                     < value > 70    
22.                    
23.                 < entry  key ="语文" >   
24.                     < value > 80    
25.                    
26.                 < entry  key ="物理" >   
27.                     < value > 90    
28.                    
29.                 < entry  key ="化学" >   
30.                     < value > 95    
31.                    
32.                
33.      
34.   < property  name ="basicInfo" >   
35.             < props >   
36.                 < prop  key ="身高" > 165    
37.                 < prop  key ="体重" > 45kg    
38.                 < prop  key ="学历" > 大学本科    
39.                
40.       
41.    < property  name ="interest" >   
42.             < set >   
43.                 < value > 唱歌    
44.                 < value > 跳舞    
45.                 < value > 书法    
46.                
47.       
48.   
49.    
50.   
51.    




1.public   class  Chinese  implements  People   ...{  
2.     private  List friends  =   new  ArrayList();  
3.     private  Map score  =   new  HashMap();  
4.     private  Properties basicInfo  =   new  Properties();  
5.     private  Set interest  =   new  HashSet();  
6.     // 省略对应set方法   
7.     .  
8.} 
 
 
问:为什么数组啊 属性变量都要在bean里面设定呢?
答:维护方便。维护数据时,只需要改配置文件。