spring注入方式详解(转自chinaunix博客luojingqing)

一、使用setter方式完成依赖注入

 
下面是Bean和beans-config.xml文件。
 
public class HelloBean {  

    private String helloWord;  

    

    //...省略getter、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="helloBean"  
          class="onlyfun.caterpillar.HelloBean">  
        <property name="helloWord">
            <value>Hello!Justin!</value>
        </property>  
    </bean>  
</beans>
 
public class SpringDemo {  
    public static void main(String[] args) {  
        Resource rs = new FileSystemResource("beans-config.xml");  
        BeanFactory factory = new XmlBeanFactory(rs);  
        
        HelloBean hello = (HelloBean) factory.getBean("helloBean");  
        System.out.println(hello.getHelloWord());  
    }  
}
 
二、使用constructor方式完成注入
 
public class HelloBean {
    private String name;
    private String helloWord;

    // 建议有要无参数建构方法
    public HelloBean() {
    }
    
    public HelloBean(String name, String helloWord) {
        this.name = name;
        this.helloWord = helloWord;
    }

    //...省略getter、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="helloBean"  
          class="onlyfun.caterpillar.HelloBean">  
        <constructor-arg index="0">
            <value>Justin</value>
        </constructor-arg>  
        <constructor-arg index="1">
            <value>Hello</value>
        </constructor-arg>  
    </bean>  
</beans>
 
public class SpringDemo {  
    public static void main(String[] args) {  
        ApplicationContext context =  
            new FileSystemXmlApplicationContext("beans-config.xml");
          
        HelloBean hello = (HelloBean) context.getBean("helloBean");
        System.out.print("Name: ");
        System.out.println(hello.getName());
        System.out.print("Word: ");
        System.out.println(hello.getHelloWord());  
    }  
}
 
三、属性参考
 
public class HelloBean {  
    private String helloWord;  
    private Date date;  
    
    //...省略getter、setter方法    
}
 
<beans>  
    <bean id="dateBean" class="java.util.Date"/>  
    <bean id="helloBean" class="onlyfun.caterpillar.HelloBean">  
        <property name="helloWord">  
            <value>Hello!</value>  
        </property>  
        <property name="date">  
            <ref bean="dateBean"/>  
        </property>  
    </bean>  
</beans>
 
public class SpringDemo {  
    public static void main(String[] args) {  
        ApplicationContext context =  
            new FileSystemXmlApplicationContext("beans-config.xml");
          
        HelloBean hello = (HelloBean) context.getBean("helloBean");
        System.out.print(hello.getHelloWord());
        System.out.print(" It's ");
        System.out.print(hello.getDate());
        System.out.println(".");
    }  
}
 
四、“byType”自动绑定
 
将“三”中的配置文件改为下面,即可完成bean属性的按类型自动绑定。
 
<beans>  
    <bean id="dateBean" class="java.util.Date"/>  
    <bean id="helloBean" class="onlyfun.caterpillar.HelloBean" autowire="byType">  
        <property name="helloWord">  
            <value>Hello!</value>  
        </property>  
    </bean>  
</beans>
 
五、“byName”自动绑定
 
将“三”中的配置文件改为下面,即可完成bean属性的按名称自动绑定。
 
<beans>  
    <bean id="dateBean" class="java.util.Date"/>  
    <bean id="helloBean" class="onlyfun.caterpillar.HelloBean" autowire="byName">  
        <property name="helloWord">  
            <value>Hello!</value>  
        </property>  
    </bean>  
</beans>
 
六、“constructor”自动绑定
 
将“三”中的配置文件改为下面,即可完成bean属性的按构造方法自动绑定。在建立依赖关系时,Srping容器会试图比对容器中的Bean实 例类型,及相关的构造方法上的参数类型,看看在类型上是否符合,如果有的话,则选用该构造方法来建立Bean实例。如果无法绑定,则抛出 org.springframework.beans.factory.UnsatisfiedDependencyException异常。
 
<beans>  
    <bean id="dateBean" class="java.util.Date"/>  
    <bean id="helloBean" class="onlyfun.caterpillar.HelloBean" autowire="constructor">  
        <property name="helloWord">  
            <value>Hello!</value>  
        </property>  
    </bean>  
</beans>
 
六、“autodetect”自动绑定
 
将“三”中的配置文件改为下面,即可完成bean属性的自动绑定,这个自动绑定是Spring会尝试用入constructor来处理依赖关系的建立,如果不行,则再尝试用byType类建立依赖关系。
 
<beans>  
    <bean id="dateBean" class="java.util.Date"/>  
    <bean id="helloBean" class="onlyfun.caterpillar.HelloBean" autowire="autodetect">  
        <property name="helloWord">  
            <value>Hello!</value>  
        </property>  
    </bean>  
</beans>
 
七、依赖检查方式
 
在自动绑定中,由于没办法从定义文件中,清楚地看到是否每个属性都完成设定,为了确定某些依赖关系确实建立,您可以假如依赖检查, 在<bean>标签使用时设定"dependency-check",可以有四种依赖检查方式:simple、objects、all、 none。
 
simple:只检查简单的类型(像原生数据类型或字符串对象)属性是否完成依赖关系,。
objects:检查对象类型的属性是否完成依赖关系。
all:则检查全部的属性是否完成依赖关系。
none:设定是默认值,表示不检查依赖性。
 
<beans>  
    <bean id="dateBean" class="java.util.Date"/>  
    <bean id="helloBean" class="onlyfun.caterpillar.HelloBean" autowire="autodetect" dependeny-check="all">  
        <property name="helloWord">  
            <value>Hello!</value>  
        </property>  
    </bean>  
</beans>
 
八、集合对象注入
 
对于像数组、List、Set、Map等集合对象,在注入前必须填充一些对象至集合中,然后再将集合对象注入至所需的Bean时,也可以交由Spring的IoC容器来自动维护或生成集合对象,并完成依赖注入。
 
public class SomeBean {
    private String[] someStrArray;
    private Some[] someObjArray;
    private List someList;
    private Map someMap;

    public String[] getSomeStrArray() {
        return someStrArray;
    }
    public void setSomeStrArray(String[] someStrArray) {
        this.someStrArray = someStrArray;
    }
    public Some[] getSomeObjArray() {
        return someObjArray;
    }
    public void setSomeObjArray(Some[] someObjArray) {
        this.someObjArray = someObjArray;
    }
    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 class Some {
    private String name;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String toString() {
        return name;
    }
}
 
<?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="onlyfun.caterpillar.Some">
        <property name="name">
            <value>Justin</value>
        </property>
    </bean>
    
    <bean id="some2" class="onlyfun.caterpillar.Some">
        <property name="name">
            <value>momor</value>
        </property>
    </bean>
    
    <bean id="someBean" class="onlyfun.caterpillar.SomeBean">
        <property name="someStrArray">
            <list>
                <value>Hello</value>
                <value>Welcome</value>
            </list>
        </property>
        
        <property name="someObjArray">
            <list>
                 <ref bean="some1"/>
                 <ref bean="some2"/>
            </list>
        </property>
        
        <property name="someList">
            <list>
                 <value>ListTest</value>
                 <ref bean="some1"/>
                 <ref bean="some2"/>
            </list>
        </property>
        
        <property name="someMap">
            <map>
                 <entry key="MapTest">
                     <value>Hello!Justin!</value>
                 </entry>
                 <entry key="someKey1">
                     <ref bean="some1"/>
                 </entry>
            </map>
        </property>
    </bean>  
</beans>
 
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.getSomeObjArray();
        for(int i = 0; i < strs.length; i++) {
            System.out.println(strs[i] + ","  
                    + somes[i].getName());
        }

        // 取得List型态依赖注入对象
        System.out.println();
        List someList = (List) someBean.getSomeList();  
        for(int i = 0; i < someList.size(); i++) {
            System.out.println(someList.get(i));
        }
        
        // 取得Map型态依赖注入对象
        System.out.println();
        Map someMap = (Map) someBean.getSomeMap();
        System.out.println(someMap.get("MapTest"));
        System.out.println(someMap.get("someKey1"));
    }  
}
posted @ 2012-03-05 15:49  卡尔の钢琴手  阅读(1544)  评论(0编辑  收藏  举报