Bean的装配方式可以理解为将Bean依赖注入到Spring容器中,Bean的装配方式即Bean的依赖注入方式。Spring容器支持基于XML配置的装配、基于注解的装配以及自动装配等多种装配方式。本节将主要讲解基于XML配置的装配和基于注解的装配。
1.基于XML配置的装配
通过2.3节的学习之后,我们知道Spring提供了两种基于XML配置的装配方式:构造方法注入和属性setter方法注入。
目录结构

1.1创建Bean的实现类
在ch3应用src目录中,创建包assemble,在assemble包下创建类ComplexUser。在类ComplexUser中分别使用构造方法注入和setter注入
ComplexUser.java
package assemble;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ComplexUser {
private String uname;
private List<String> hobbyList;
private Map<String,String> residenceMap;
private Set<String> aliasSet;
private String[] array;
public ComplexUser(String uname, List<String> hobbyList, Map<String, String> residenceMap, Set<String> aliasSet,
String[] array) {
super();
this.uname = uname;
this.hobbyList = hobbyList;
this.residenceMap = residenceMap;
this.aliasSet = aliasSet;
this.array = array;
}
public ComplexUser() {
super();
// TODO Auto-generated constructor stub
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public List<String> getHobbyList() {
return hobbyList;
}
public void setHobbyList(List<String> hobbyList) {
this.hobbyList = hobbyList;
}
public Map<String, String> getResidenceMap() {
return residenceMap;
}
public void setResidenceMap(Map<String, String> residenceMap) {
this.residenceMap = residenceMap;
}
public Set<String> getAliasSet() {
return aliasSet;
}
public void setAliasSet(Set<String> aliasSet) {
this.aliasSet = aliasSet;
}
public String[] getArray() {
return array;
}
public void setArray(String[] array) {
this.array = array;
}
@Override
public String toString() {
return "ComplexUser [uname=" + uname + ", hobbyList=" + hobbyList + ", residenceMap=" + residenceMap
+ ", aliasSet=" + aliasSet + ", array=" + Arrays.toString(array) + "]";
}
}
1.2配置Bean
在Spring配置文件中,使用实现类ComplexUser配置Bean的两个实例。
<!-- 使用构造方法注入方式装配ComplexUser实例user1 -->
<bean id="user1" class="assemble.ComplexUser">
<constructor-arg index="0" value="cxk" />
<constructor-arg index="1">
<list>
<value>唱</value>
<value>跳</value>
<value>rap</value>
<value>篮球</value>
</list>
</constructor-arg>
<constructor-arg index="2">
<map>
<entry key="dalian" value="大连" />
<entry key="shenyang" value="沈阳" />
<entry key="shanghia" value="上海" />
</map>
</constructor-arg>
<constructor-arg index="3">
<set>
<value>100</value>
<value>101</value>
<value>102</value>
</set>
</constructor-arg>
<constructor-arg index="4">
<array>
<value>aaaaa</value>
<value>bbbbb</value>
</array>
</constructor-arg>
</bean>
<!-- 使用属性setter方法注入方式装配ComplexUser实例user2 -->
<bean id="user2" class="assemble.ComplexUser">
<property name="uname" value="wtf" />
<property name="hobbyList">
<list>
<value>看书</value>
<value>学spring</value>
</list>
</property>
<property name="residenceMap">
<map>
<entry key="dalian" value="大连" />
<entry key="shenyang" value="沈阳" />
<entry key="shanghia" value="上海" />
</map>
</property>
<property name="aliasSet">
<set>
<value>103</value>
<value>104</value>
<value>105</value>
</set>
</property>
<property name="array">
<array>
<value>ccccc</value>
<value>ddddd</value>
</array>
</property>
</bean>
1.3测试基于XML配置的装配方式
在ch3应用的test包中,创建测试类TestAssemble
TestAssemble.java
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import assemble.ComplexUser;
public class TestAssemble {
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
ComplexUser u1 = (ComplexUser)appCon.getBean("user1");
System.out.println(u1);
ComplexUser u2 = (ComplexUser)appCon.getBean("user2");
System.out.println(u2);
}
}
运行结果

2.基于注解的装配
在Spring框架中定义了一些列的注解,常用注解的使用见3.5+;
下面通过一个实例讲解@Component()
注:在Spring 4.0以上版本,配置注解指定包中的注解进行扫描前,需要事先导入Spring Aop的JAR包spring-aop-5.0.2.RELEASE.jar
目录结构

2.1创建Bean的实现类
在ch3应用src目录中,创建包annotation,在annotation包下创建类AnnotationUser.java。
AnnotationUser.java
package annotation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component()
/*
* 相当于@Component("annotationUser")或
* @Component(value="annotationUser"),annotationUser为Bean的id,默认为类名首字母的小写
*/
public class AnnotationUser {
@Value("基于注解装配")
private String uname;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
@Override
public String toString() {
return "AnnotationUser [uname=" + uname + "]";
}
}
2.2配置注解
现在有了Bean的实现类,但还不能进行测试,因为Spring容器并不知道去哪里扫描Bean对象。需要在配置文件中配置注解,这里我们在src目录中新建一个annotationContext.xml,注解配置方式如下:
annotationContext.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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 使用context命名空间,通过Spring扫描指定包下所有的Bean实现类,通过注释解析 -->
<context:component-scan base-package="annotation"/>
</beans>
2.3测试Bean实例
在ch3英语的test包中,创建测试类TestAnnotation,具体代码如下
TestAnnotation.java
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import annotation.AnnotationUser;
import assemble.ComplexUser;
public class TestAnnotation {
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext appCon = new ClassPathXmlApplicationContext("annotationContext.xml");
AnnotationUser au = (AnnotationUser)appCon.getBean("annotationUser");
System.out.println(au.getUname());
}
}
运行结果
