一、标准的Bean配置
在spring的HelloWorld中配置过一个Person的Bean,我们通过bean标签和它的class、id属性就可以配置一个标准的bean了,代码如下。至于其他的配置下面将逐一介绍,这里就不再做过的说明。
<bean id="person" class="com.escore.beans.Person"></bean>
二、spring XML命名空间的说明
这里不再展开讨论每个具体的作用,在后面那里用到了那里介绍。
命名空间 | 作用说明 |
beans | 支持声明bean,装配bean。Spring核心的命名空间 |
aop | 为切面编程提供的各类xml配置 |
context | 为Spring应用上下文提供的配置元素,如自动扫描 |
jdbc | 为spring的jdbc提供的配置元素 |
jee | 提供了与Java EE的继承,如jndi、ejb |
lang | 支持配置由Groovy、JRuby等脚本实现的Bean |
p | 提供便捷的装配Bean的方式 |
task | 为任务调度器提供的配置元素 |
tx | 提供声明式事务配置 |
util | 提供的各种工具配置元素,如配置一个集合bean |
我们先按照HelloWorld的方式建立一个java项目。主要涉及Person类、MainTest类和spring.xml配置文件。代码见下面的代码片段。
首先对Person类做一个简单的介绍,它是一本标准的Bean类,除了属性个属性对应的getter、setter方法外,还有四个重载的构造器方法,目的是为了测试构造器注入的一些问题。toString方法为了方便控制台查看,那个空参数的构造器是必须要写的,应为spring的容器需要使用。
第二个就是MainTest类,和HelloWorld测试类一样为了测试配置的不同bean,只要在getBean方法中更改id即可。
第三个是spring.xml配置文件,配置了构造器注入和属性注入的各种方式。
现在看第一个构造器配置。使用constructor-arg标签来进行构造器的注入,name表示构造器中对应的形参,value表示要注入的值。<value></value>子标签与value属性效果一样,但是如果有些值是特殊的格式,例如“<”要注入必须使用<!-[CDTATA[你要输入的值]]>的方式注入以避免冲突。这种用法必须要放入到value子标签才可以,value属性是不支持的。 实际上这里还有一个问题,那就是name表示的形参是不能方面签名的条件,也就是说如果是重载的构造器而且重载构造器的形式参数也一样,那么这种做法是无法判断你想用的是那一个构造器。
<bean id="person" class="com.escore.beans.Person">
<constructor-arg name="name" value="Tom"></constructor-arg>
<constructor-arg name="age" value="168"></constructor-arg>
<constructor-arg name="address">
<value><![CDATA[<ChangSha·湘江街道>]]></value>
</constructor-arg>
</bean>
先不管这个问题如何解决来看下面这个构造器注入的方式。还是需要使用constructor-arg标签和value,不再用name属性而是用type。type表示属性的类型。但是靠这种方式也是不行,我们可以用测试类来测试一下person2,因为我的Person类重载的三个有参构造器,其中有两个构造器都有两个String类型参数和一个int参数,导致无法准决判断用那个注入。
<bean id="person2" class="com.escore.beans.Person">
<constructor-arg value="Tom" type="String"></constructor-arg>
<constructor-arg value="168" type="int"></constructor-arg>
<constructor-arg type="String">
<value><![CDATA[<ChangSha·湘江街道>]]></value>
</constructor-arg>
</bean>
再来看一下index属性的方式来构造注入,它的问题与只用type的类似,也是无法确定构造器。
<bean id="person3" class="com.escore.beans.Person">
<constructor-arg value="Tom" index="0"></constructor-arg>
<constructor-arg value="8" index="2"></constructor-arg>
<constructor-arg index="1">
<value><![CDATA[<ChangSha·湘江街道>]]></value>
</constructor-arg>
</bean>
既然前面三个方式都有问题,那么怎么做才可行。下面的这种构造器注入才是可行的。结合type和index,当然构造的参数个数也必须匹配,这样就可以完全匹配唯一的构造器。其实上面这些问题的造成就是方法签名的问题(不清楚的可以查一下java方面签名的资料)。
<bean id="person4" class="com.escore.beans.Person">
<constructor-arg value="Tom" index="0" type="String"></constructor-arg>
<constructor-arg value="8" index="2" type="int"></constructor-arg>
<constructor-arg index="1" type="String">
<value><![CDATA[<ChangSha·湘江街道>]]></value>
</constructor-arg>
</bean>
四、属性注入
根据下面的代码片段,属性注入就是采用property标签加上name和alue将值注入到制定的对应的属性中即可。value的使用和constructor-arg的一样。值得注意的是,这里的name属性并不是指的类的成员变量的名称,而是setter风格的名称。例如setAddress()就是address。
<bean id="person5" class="com.escore.beans.Person">
<property name="name" value="Jerry"></property>
<property name="address">
<value><![CDATA[!BeiJing>]]></value>
</property>
</bean>
Person类的全部代码
public class Person {
private String name;
private int age;
private String address;
private float stature;
private int weight;
public Person() {
}
public Person(String name, String address, int age) {
super();
this.name = name;
this.age = age;
this.address = address;
}
public Person(String name, int weight, String address) {
super();
this.name = name;
this.weight = weight;
this.address = address;
}
public Person(String name, String address, float stature) {
super();
this.name = name;
this.address = address;
this.stature = stature;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public float getStature() {
return stature;
}
public void setStature(float stature) {
this.stature = stature;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", address=" + address + ", stature=" + stature + ", weight="
+ weight + "]";
}
}
MainTest类的全部代码
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.escore.beans.Person;
public class MainTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
Person person = (Person) ctx.getBean("person5");
System.out.println(person);
ctx.close();
}
}
spring.xml的全部配置
<?xml version="1.0" encoding="UTF-8"?>
<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">
<bean id="person" class="com.escore.beans.Person">
<constructor-arg name="name" value="Tom"></constructor-arg>
<constructor-arg name="age" value="168"></constructor-arg>
<constructor-arg name="address">
<value><![CDATA[<ChangSha·湘江街道>]]></value>
</constructor-arg>
</bean>
<bean id="person2" class="com.escore.beans.Person">
<constructor-arg value="Tom" type="String"></constructor-arg>
<constructor-arg value="168" type="int"></constructor-arg>
<constructor-arg type="String">
<value><![CDATA[<ChangSha·湘江街道>]]></value>
</constructor-arg>
</bean>
<bean id="person3" class="com.escore.beans.Person">
<constructor-arg value="Tom" index="0"></constructor-arg>
<constructor-arg value="8" index="2"></constructor-arg>
<constructor-arg index="1">
<value><![CDATA[<ChangSha·湘江街道>]]></value>
</constructor-arg>
</bean>
<!-- 推荐使用的构造器注入属性方式 -->
<bean id="person4" class="com.escore.beans.Person">
<constructor-arg value="Tom" index="0" type="String"></constructor-arg>
<constructor-arg value="8" index="2" type="int"></constructor-arg>
<constructor-arg index="1" type="String">
<value><![CDATA[<ChangSha·湘江街道>]]></value>
</constructor-arg>
</bean>
<!--*****************属性注入方法*************************-->
<bean id="person5" class="com.escore.beans.Person">
<property name="name" value="Jerry"></property>
<property name="address">
<value><![CDATA[!BeiJing>]]></value>
</property>
</bean>
</beans>