在Spring配置文件中,用户不单可以将int,String等字面值注入Bean中,还可以注入集合,List的类型,以及自定义类型;
接下来,我们一起进入Spring注入参数的学习!
如果book Bean只被author Bean 引用,不被容器中其他Bean引用,在这种情况下我们就可以将book 以内部Bean的方式注入到Bean中。先建一个Author类,在类中增加两个属性,name 和 book,其中Book类是自定义的类;为了方便学习,我们在两个属性的set方法中各写一条输出语句,以便之后控制台的查看;
Author.class
package com.vtstar.entity;
/**
* @ClassName Author
* @Description TODO
* @Author XiaoWu
* @Date 2018/9/6 14:40
* @Version 1.0
**/
public class Author {
private String name;
private Book book = new Book();
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("Author name:"+name);
this.name = name;
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
System.out.println("我是内部Bean创建的Book 我的名字叫:" + book.getName() + " 价格为:" + book.getPrice());
this.book = book;
}
}
Book.class
package com.vtstar.entity;
/**
* @ClassName Book
* @Description TODO
* @Author XiaoWu
* @Date 2018/9/6 14:40
* @Version 1.0
**/
public class Book {
private String name;
private double price;
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("Book name:" + name);
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
System.out.println("Book price:" + price);
this.price = price;
}
}
定义内部Bean 和 声明Java中的匿名类相似,既没有名字,也不能被其他的Bean引用,只能在声明Bean的时候提供实例注入。在内部Bean中即使提供了id,name,scope属性,也会被忽略,scope默认为proptotype (非单例模式)。
控制台输出:
如果你想通过Spring容器在Book中的name里注入一个null值或者空字符串,你可以通过以下的配置来获取。
和Struts,Hibernate框架一样,Spring也支持级联属性的操作,如果你想在定义author时直接为book的属性提供注入值,可以采取如下配置方式:
值得一提的是在Author类中一定要实例化book类,不能只声明Book类,如果不实例化Book类,Spring容器不会允许你进行级联操作,就会抛出NullValueInNestedPathException异常;
所以为了程序能够正常启动,还是按照Spring的要求来办吧!
// private Book book; 错误的写法
private Book book = new Book();//正确的写法
控制台结果:
接下来我们来注入list set map properties常用的数据结构类型;
新建一个ListType类,相关的集合属性已经在这个类中建好;
package com.vtstar.entity;
import java.util.*;
/**
* @ClassName ListType
* @Description java.util包下的集合类型是最常用的数据结构类型,其中包括 List Set Map Porperties
* @Author XiaoWu
* @Date 2018/9/6 15:06
* @Version 1.0
**/
public class ListType {
//list集合
private List favorites = new ArrayList();
public List getFavorites() {
return favorites;
}
public void setFavorites(List favorites) {
this.favorites = favorites;
for (Object list :favorites) {
System.out.println("list [] :"+list.toString());
}
}
//set集合
private Set favorites2 = new HashSet();
public Set getFavorites2() {
return favorites2;
}
public void setFavorites2(Set favorites2) {
this.favorites2 = favorites2;
for (Object set: favorites2 ) {
System.out.println("set [] :"+set.toString());
}
}
//map集合
private Map jobs = new HashMap();
public Map getJobs() {
return jobs;
}
public void setJobs(Map jobs) {
this.jobs = jobs;
for (Object job: jobs.keySet()) {
System.out.println("map key == " + job + " value == " + jobs.get(job).toString());
}
}
//properties集合
private Properties mails = new Properties();
public Properties getMails() {
return mails;
}
public void setMails(Properties mails) {
this.mails = mails;
for (String prop:mails.stringPropertyNames()) {
System.out.println("properties key == " + prop + " value == " + mails.getProperty(prop));
}
}
//强类型集合
private Map jobTime = new HashMap();
public Map getJobTime() {
return jobTime;
}
public void setJobTime(Map jobTime) {
this.jobTime = jobTime;
for (Map.Entry job: jobTime.entrySet()) {
System.out.println("map key == " + job.getKey() + " value == " + job.getValue());
}
}
//集合合并
private Set favorites3 = new HashSet();
public Set getFavorites3() {
return favorites3;
}
public void setFavorites3(Set favorites3) {
this.favorites3 = favorites3;
for (Object set: favorites3 ) {
System.out.println("merge set [] :"+set.toString());
}
}
}
Spring中配置List类型的favorites属性。
吃饭
睡觉
打豆豆
List属性既可以通过
控制台输出结果:
抽烟
喝酒
烫头
控制台输出结果:
map属性中的
控制台输出结果:
properties类型可以看做是Map类型的特例。map元素中的键和值可以是任何类型的对象,而properties属性的键和值都只能是字符串。
[email protected]
[email protected]
控制台打印结果:
强类型集合在Spring中的配置和非强类型集合相同,但是Spring在注入强类型集合时会判断元素的类型,将设置值转换为对应的数据类型,如key在元素中的类型是String,value在元素中的类型是Integer。
控制台输出结果:
Spring支持集合合并的功能,允许子Bean继承父Bean的同名属性集合元素,并将子Bean中配置的集合属性值和父Bean中配置的集合属性值合并起来成为最终Bean的属性值。就像两个A,B水果篮子,A篮子中有香蕉,苹果;B篮子中有柠檬,菠萝蜜;这时把A篮子中的成员放置到一个B篮子里面,就组成一个最终的水果篮子,但是前提必须都是水果。
Java
.Net
Php
Html
Javascript
jQuery
merge="true"属性指示子Bean和父Bean中的同名属性值进行合并,如果为false就不会进行合并;
控制台输出: