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
- Spring 构造函数注入
- spring 构造函数注入
- spring 构造函数注入
- spring中构造函数注入
- 【原创】Spring构造函数的注入...
- spring在构造函数中注入对象
- Spring构造函数注入的问题
- Spring的construct(构造函数)注入
- spring注入方式-构造函数优缺点
- spring注入:构造注入
- Spring注入与无参构造函数自定义构造函数
- Spring注入与无参构造函数自定义构造函数
- Spring内核研究-set方法注入和构造函数注入
- Spring依赖属性注入和构造函数注入
- Spring内核研究-set方法注入和构造函数注入
- spring + maven 属性注入和构造函数注入(1)
- Spring构造函数注入,无法注入的问题
- spring构造注入
- 小金掰呀掰不够玉米 (sdut oj)
- 【算法和数据结构】1.5--数据结构之栈
- MarkDown学习笔记
- hdu 1800 Flying to the Mars(多解)
- iOS-IBDesignable/IBInspectable动态改变控件属性
- spring 构造函数注入
- KiCad设计PCB-33-串口下载、AT24C02电路、CAN、蜂鸣器
- C/C++练习7---求某个范围内的所有素数 (sdut oj)
- 机器学习解决问题的步骤
- NYOJ39-水仙花数
- (if-else语法)求ab中的最大值
- PLSQL Developer 11 使用技巧 (持续更新)
- POJ - 3984
- js实现tab栏切换效果(一)