Spring:Bean基本管理

一.从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

<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
    "http://www.springframework.org/dtd/spring-beans.dtd"
>
< beans >
    
< bean  id ="helloBean"  class ="cn.blogjava.hello.HelloBean"   >
        
< constructor-arg  index ="0" >
            
< value > YYY! </ value >
        
</ constructor-arg >
        
< constructor-arg  index ="1" >
            
< value > Hello! </ value >
        
</ constructor-arg >
    
</ bean >
</ beans >


三.属性参考
如果在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

<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
    "http://www.springframework.org/dtd/spring-beans.dtd"
>
< beans >
    
< bean  id ="dateBean"  class ="java.util.Date" />
    
< bean  id ="helloBean"  class ="cn.blogjava.hello.HelloBean"   >
        
< property  name ="helloWord" >
            
< value > Hello! </ value >
        
</ property >
 
        
< property  name ="date" >
            
< ref  bean ="dateBean"   />
        
</ property >                 
    
</ bean >
</ beans >


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


        
< property  name ="date" >
            
< bean  class ="java.util.Date"   />
        
</ property >               


四.自动绑定
byType

<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
    "http://www.springframework.org/dtd/spring-beans.dtd"
>
< beans >
    
< bean  id ="dateBean"  class ="java.util.Date" />
    
< bean  id ="helloBean"  class ="cn.blogjava.hello.HelloBean"  autowire="byType" >
        
< property  name ="helloWord" >
            
< value > Hello! </ value >
        
</ property >
        
< property  name ="name" >
            
< value > YYY! </ value >
        
</ property >               
    
</ bean >
</ beans >

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

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

<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
    "http://www.springframework.org/dtd/spring-beans.dtd"
>
< beans >
    
< bean  id ="date"  class ="java.util.Date" />
    
< bean  id ="helloBean"  class ="cn.blogjava.hello.HelloBean"   autowire ="byName" >
        
< property  name ="helloWord" >
            
< value > Hello! </ value >
        
</ property >
        
< property  name ="name" >
            
< value > YYY! </ value >
        
</ property >              
    
</ bean >
</ beans >

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

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

     < bean  id ="helloBean"  class ="cn.blogjava.hello.HelloBean"   autowire ="autodetect" dependency-check="all" >
        
< property  name ="helloWord" >
            
< value > Hello! </ value >
        
</ property >
        
< property  name ="name" >
            
< value > YYY! </ value >
        
</ property >              
    
</ bean >


五.集合对象的注入
对于像数组、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

<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
    "http://www.springframework.org/dtd/spring-beans.dtd"
>
< beans >
    
< bean  id ="some1"  class ="cn.blogjava.hello.Some" >
        
< property  name ="name" >
            
< value > YYY </ value >
        
</ property >
    
</ bean >
    
    
< bean  id ="some2"  class ="cn.blogjava.hello.Some" >
        
< property  name ="name" >
            
< value > BYF </ value >
        
</ property >
    
</ bean >
    
    
< bean  id ="someBean"  class ="cn.blogjava.hello.SomeBean" >
        
< property  name ="someStrArray" >
            
< list >
                
< value > Hello! </ value >
                
< value > Welcome! </ value >
            
</ list >
        
</ property >
        
        
< property  name ="someObjectArray" >
            
< list >
                
< ref  bean ="some1" />
                
< ref  bean ="some2" />
            
</ list >
        
</ property >
        
        
< property  name ="someList" >
            
< list >
                
< ref  bean ="some1" />
                
< ref  bean ="some2" />             
            
</ list >
        
</ property >
        
        
< property  name ="someMap" >
            
< map >
                
< entry  key ="MapTest" >
                    
< value > Hello YYY! </ value >
                
</ entry >
                
< entry  key ="someKey1" >
                    
< ref  bean ="some1"   />
                
</ entry >
            
</ map >
        
</ property >
    
</ bean >
        
    
< bean  id ="helloBean"  class ="cn.blogjava.hello.HelloBean"   >
    
</ bean >
</ beans >


测试类: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 " ));
    }
}

成长的乐趣,在于分享!
大龄程序员,一路走来,感慨颇多。闲暇时写写字,希望能给同行人一点帮助。
本文版权归作者growithus和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/growithus/p/11012468.html