最近在重温Spring,因此决定写一系列的关于Spring学习的博客,一是为了加深自己的理解,二来希望能帮助更多的朋友掌握Spring。我用到的Spring版本是3.1.1。
Bean应该说是Spring中最基本的配置单位了,任何的操作都离不开Bean(好像是废话哈)。记得刚开始接触JavaEE的时候,看网上的教程通篇都是Bean啊Bean的,当时真是不知道Bean是何方神圣,英语不好还特意查了字典,发现Bean是豆子。。。这样就更难理解了。在我的理解中Bean就是一个类,在Spring中通过元素声明一个Bean,当合适的时候Spring容器来将这个Bean实例化,然后管理它的生命周期。
声明Bean很很简单,首先在命名空间中添加Bean的引用,一般类似下面这样:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
beans>
之后就可以在配置文件中自由的定义Bean了(友情提示:使用IntelliJ IDEA添加相应的命名空间后可以自动带出能出现的元素)。
为了下面讲解方便,我先写两个类–经典的员工Employee和部门Department:
Employee.java
public class Employee {
private String name;
private Date birthDate;
private int level;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
}
Department .java
public class Department {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
上面已经添加过Bean的命名空间了,因此我们就可以定义一个Employee和Department了:
id="employee" class="com.stream.spring.bean.entity.Employee" />
id="dept" class="com.stream.spring.bean.entity.Department" />
bean元素有几个属性值得注意:
Spring注入Bean属性有两种方式:构造器注入和setter方法注入。
构造器注入使用constructor-arg标签
<bean id="employee" class="com.stream.spring.bean.entity.Employee">
<constructor-arg name="name" value="stream" index="0"/>
bean>
name是构造器方法的参数,index是参数的位置,当注入的是Bean时可以使用ref属性。当使用构造器方法注入的时候,constructor-arg列表个数要个构造方法的参数个数一致,如下:
public Employee(String name,int level){
this.name = name;
this.level = level;
System.out.println("name,level");
}
/*public Employee(String name){
this.name = name;
System.out.println("name");
}*/
public Employee(int level){
this.level = level;
}
在Employee的构造方法中没有对应的只有一个参数的构造方法,这样在实例化Bean的时候会报错:
Unsatisfied dependency expressed through constructor argument with index 1 of type [int]: Ambiguous constructor argument types - did you specify the correct bean references as constructor arguments?
另外需要注意的是如果没有无参构造方法,那么在装配Bean属性的时候必须要有构造器注入,否则会报错。
setter方法注入使用property标签:
id="employee" class="com.stream.spring.bean.entity.Employee">
<property name="name" value="Stream" />
和构造器注入类似,name是Bean的属性名,当需要注入Bean时可以用ref属性。
setter方法只要保证在java类中有对应的setter方法即可,对顺序和个数没有限制。
当装配的属性是基本数据类型时可以直接使用value属性,当引用其它Bean时使用ref属性,当属性是集合时Spring也提供了对应的方法。
Spring提供了4种类型的集合配置元素:
元素名称 | 用途 | 声明方式 |
---|---|---|
list | 装配list类型的值,允许重复 | |
set | 装配set类型的值,不允许重复 | |
map | 装配map类型的值,key和value可以是任意类型 | |
props | 装配properties类型的值,key和value必须都是String类型 |
可以使用标签来显式的指定空值。