spring 构造函数注入

来源:互联网 发布:莎莎源码 解压密码 编辑:程序博客网 时间:2024/06/04 19:15

使用设值注入的方式有一点不好就是不能够确定对象的完整性和可用性,使用构造函数可以确定哪些属性是必需的,这样也可以避免使用的时候引用了未注入属性带来的麻烦。

构造函数注入有四种方式,都记录下来:

先写一个Book类,它有三个属性和带参数的构造方法以及一个展示自身属性的方法。

package com.spring.beans;public class Book {    private String name;    private String author;    private float price;    public Book(String author, float price) {        this.author = author;        this.price = price;    }    public Book(String name, String author) {        this.name = name;        this.author = author;    }    public Book(String name, String author, float price) {        this.name = name;        this.author = author;        this.price = price;    }    public String showMessage()    {      return " name :" + name + "  author :"+author+"  price:"+price;    }}

写一个测试类 :

    @Test    public void Test() throws BeansException {        ApplicationContext context =        new ClassPathXmlApplicationContext("applicationContext.xml");        Book book = (Book) context.getBean("book");        System.out.println(book.showMessage());    }

下边分别用四种方式配置构造函数注入 :

方式一 : 根据构索引注入(不推荐)

   <bean id = "book" class="com.spring.beans.Book">        <constructor-arg index="0" value="how jack grow up"/>        <constructor-arg index="1" value="jack"/>        <constructor-arg index="2" value="12.36"/>    </bean>

这里的index表示索引的位置。使用这种方式就必须知道构造函数中对应参数的位置。
当类有多个构造方法时,会自动根据xml中配置的参数个数去匹配对应的构造方法。当然这种方式会有一些不方便的地方,比如我配置成下面这样:

    <bean id = "book" class="com.spring.beans.Book">        <constructor-arg index="0" value="how jack grow up"/>        <constructor-arg index="1" value="12"/>    </bean>

但是Book类有两个带两个参数的构造方法,先测试一下执行的哪一个 :
输出结果 :

name :how jack grow up  author :12  price:0.0

可以看出来执行的是第二个。如果我给定第二个参数的类型为float:

    <bean id = "book" class="com.spring.beans.Book">        <constructor-arg index="0" value="how jack grow up"/>        <constructor-arg index="1" type="float" value="12"/>    </bean>

输出的结果 :

 name :null  author :how jack grow up  price:12.0

这样就正确了,但是如果Book还有一个属性page是float(假设),恰好有一个构造函数是这样的:

    public Book(float page, String author) {        this.page = page;        this.author = author;    }

执行结果 :

 name :null  author :how jack grow up  price:12.0

可以看出来还是比较麻烦的,我从来没用过种方式。

方式二,根据类型注入(不推荐)

    <bean id = "book" class="com.spring.beans.Book">        <constructor-arg type="float" value="12"/>        <constructor-arg type="java.lang.String" value="jack"/>        <constructor-arg type="java.lang.String" value="bookname"/>    </bean>

输出结果 :

 name :jack  author :bookname  price:12.0

可以看出来当有多个属性类型一样的时候也是比较麻烦的。

方式三 直接传值(不要用)

        <bean id = "book" class="com.spring.beans.Book">        <constructor-arg  value="jack"/>        <constructor-arg value="bookname"/>        <constructor-arg  value="12"/>    </bean>

直接传递值得方式需要严格按照顺序来,必然就会报异常。

方式四 按照属性值注入(推荐)

    <bean id = "book" class="com.spring.beans.Book">        <constructor-arg  name="author" value="jack"/>        <constructor-arg  name="name" value="bookname"/>        <constructor-arg  name="price" value="12"/>    </bean>

测试结果 :

 name :bookname  author :jack  price:12.0

当有集合的时候 :

下面是bookStore类 :

package com.spring.beans;import java.util.List;import java.util.Map;import java.util.Set;public class BookStore {public String name;public List<Book> bookList;public Set<Book> bookSet;public Map<String,Book> bookMap;    public BookStore(            String name, List<Book> bookList,             Set<Book> bookSet,             Map<String, Book> bookMap)    {        this.name = name;        this.bookList = bookList;        this.bookSet = bookSet;        this.bookMap = bookMap;    }}

bookstore里有book的集合,并且构造函数的形式参数也是集合,这样就需要像下面着用配置xml文件 :

    <bean id = "book1" class="com.spring.beans.Book">        <constructor-arg  name="author" value="jack"/>        <constructor-arg  name="name" value="how jack die"/>        <constructor-arg  name="price" value="12"/>    </bean>    <bean id = "book2" class="com.spring.beans.Book">        <constructor-arg  name="author" value="jack"/>        <constructor-arg  name="name" value="how jack grow up "/>        <constructor-arg  name="price" value="12"/>    </bean>    <bean id="bookstore" class="com.spring.beans.BookStore">        <constructor-arg name="name" value="jack's bookstore"/>        <constructor-arg name="bookList">            <list>                <ref bean="book1"/>                <ref bean="book2"/>            </list>        </constructor-arg>        <constructor-arg name="bookSet">            <set>                <ref bean="book1"/>                <ref bean="book2"/>            </set>        </constructor-arg>        <constructor-arg name="bookMap">            <map>                <entry key="mapbook1" value-ref="book1"/>                <entry key="mapbook2" value-ref="book2"/>            </map>        </constructor-arg>    </bean>

创建测试类 :

package com.spring.test;import com.spring.beans.Book;import com.spring.beans.BookStore;import org.junit.Test;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.core.env.SystemEnvironmentPropertySource;import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;public class MainTest {    @Test    public void Test() throws BeansException {        ApplicationContext context =        new ClassPathXmlApplicationContext("applicationContext.xml");        BookStore bookStore = (BookStore) context.getBean("bookstore");        ArrayList<Book> booklist = (ArrayList<Book>) bookStore.bookList;        HashSet<Book> bookset = (HashSet<Book>) bookStore.bookSet;        HashMap<String,Book> bookmap = (HashMap<String, Book>) bookStore.bookMap;        System.out.println(booklist.size());        System.out.println(bookset.size());        System.out.println(bookmap.size());        Iterator<String> keyset = bookmap.keySet().iterator();        while(keyset.hasNext())        {            Book book =(Book)bookmap.get(keyset.next());            System.out.println(book.showMessage());        }    }}

测试结果 :

222 name :how jack die  author :jack  price:12.0 name :how jack grow up   author :jack  price:12.0
0 0
原创粉丝点击