基于XML配置的装配
- 创建Bean的实现类
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;
}
// 使用属性的setter方法注入,提供默认的无参构造方法,并为注入的属性提供setter方法
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) + "]";
}
}
- 配置Bean
<?xml version="1.0" encoding="UTF-8"?>
<!-- - Application context definition for JPetStore's business layer. - Containsbean
references to the transaction manager and to the DAOs in - dataAccessContext-local/jta.xml(see
web.xml's "contextConfigLocation"). -->
<beans
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans">
<!-- 使用构造方法注入方式装配ComplexUser实例user1 -->
<bean id ="user1" class="assemble.ComplexUser">
<constructor-arg index="0" value="chenheng1"/>
<constructor-arg index="1" >
<list>
<value>唱歌</value>
<value>跳舞</value>
<value>爬山</value>
</list>
</constructor-arg>
<constructor-arg index="2">
<map>
<entry key="dalian" value="大连"/>
<entry key="beijing" value="北京"/>
<entry key="shanghai" 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="chenheng2"/>
<property name="hobbyList" >
<list>
<value>看书</value>
<value>学习</value>
</list>
</property>
<property name="residenceMap">
<map>
<entry key="shenyang" value="沈阳"/>
<entry key="tianjin" 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>
</beans>
- 测试
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 xfc =new ClassPathXmlApplicationContext("applicationContext.xml");
ComplexUser u1 = (ComplexUser)xfc.getBean("user1");//构造方法装配
System.out.println(u1);
ComplexUser u2 = (ComplexUser)xfc.getBean("user2");//setter方法装配
System.out.println(u2);
}
}
基于注解的装配
- @Component 仅仅表示一个组件对象(Bean),可以作用在任何层次上。
创建Bean的实现类
package annotation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
/**相当于@Component("annotationUser"),annotationUser为Bean的id,默认为首字母小写的类名**/
public class AnnotationUser {
@Value("xfc")
private String uname;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
}
配置注解
<?xml version="1.0" encoding="UTF-8"?>
<!-- - Application context definition for JPetStore's business layer. - Containsbean
references to the transaction manager and to the DAOs in - dataAccessContext-local/jta.xml(see
web.xml's "contextConfigLocation"). -->
<beans
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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans">
<context:component-scan base-package="annotation"/>
<!--使用context命名空间,通过Spring扫描包annotation及其子包下所有的Bean的实现类 -->
</beans>
测试
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import annotation.AnnotationUser;
public class TestAnnotation {
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext xfc = new ClassPathXmlApplicationContext("annotationContext.xml");
AnnotationUser u1 = (AnnotationUser)xfc.getBean("annotationUser");
System.out.println(u1.getUname());
}
}
- @Repository 该注解用于数据访问层(Dao)的类标识为Bean,功能与1相同
- @Service该注解用于业务逻辑层组件类(Service层),其功能于1相同
- @Controller该注解用于控制器组件类(Spring MVC 的 Controller)层,功能于1相同
- @Autowired该注解可以对成员变量、方法及构造方法进行标注,完成自动装配的工作。用来消除setter和getter方法。默认按照Bean的类型进行装配。
- @Resource,该注解与@Autowired功能一样,区别在于该注解是按照名称来装配注入的。其有两个属性–name和type。name属性指定Bean实例名称,即按照名称装配注入;type属性指定Bean类型,即按照Bean的类型进行装配。
- @Qualifier
下面通过一个实例讲解:
创建DAO层
package annotation.dao;
public interface TestDao {
public void save();
}
package annotation.dao;
import org.springframework.stereotype.Repository;
@Repository
public class TestDaoImpl implements TestDao {
public void save() {
// TODO Auto-generated method stub
System.out.println("testDao save");
}
}
创建Service层
package annotation.service;
public interface TestService {
public void save();
}
package annotation.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import annotation.dao.TestDao;
@Service
public class TestServiceImpl implements TestService {
@Resource
/* 相当于 @Autowired 默认按照Bean类型装配 */
private TestDao testDao;
public void save() {
// TODO Auto-generated method stub
testDao.save();
System.out.println("testService save");
}
}
创建Controller层
package annotation.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import annotation.service.TestService;
@Controller
public class TestController {
@Autowired
private TestService testService;
public void save() {
testService.save();
System.out.println("testController save");
}
}
配置注解
因为annotation.controller、annotation.dao、annotation.service都属于annotation的子包,所以不需要再配置annotationContext.xml
测试
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import annotation.controller.TestController;
public class TestMoreAnnotation {
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext xfc = new ClassPathXmlApplicationContext("annotationContext.xml");
TestController testcon = (TestController) xfc.getBean("testController");
testcon.save();
}
}