• 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和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    5分钟带你了解Kafka的技术架构
    聊聊我的知识体系
    你分得清楚Maven的聚合和继承吗?
    为抖音而生的多闪,如何获取抖音的用户数据?
    消息中间件系列第3讲:使用消息队列需要考虑的几个问题
    消息中间件系列第2讲:如何进行消息队列选型?
    消息中间件系列第1讲:为什么要用消息队列?
    JVM规范系列开篇:为什么要读JVM规范?
    安全编码实践之三:身份验证和会话管理防御
    安全编码实践之二:跨站脚本攻击防御
  • 原文地址:https://www.cnblogs.com/growithus/p/11012468.html
Copyright © 2020-2023  润新知