Spring中,<bean>标签里面有一个属性叫autowire,其取值范围有'default','byName','byType','constructor','no';这里主要举例说明一下'byName'的用法,'byType'与之类似,主要是用对象的类型来注入值,这里就不一一赘述了,先附上beans.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"
default-autowire="byName">
<!-- 上面的default-autowire可配置全局 -->
<bean id="userDAO" class="com.castiel.dao.impl.UserDAOImpl">
<property name="daoId" value="0"/>
</bean>
<bean id="userDAO1" class="com.castiel.dao.impl.UserDAOImpl">
<property name="daoId" value="1"/>
</bean>
<bean id="userDAO2" class="com.castiel.dao.impl.UserDAOImpl">
<property name="daoId" value="2"/>
</bean>
<!-- scope作用域 取值:singleton(默认值);prototype;request;session;global session; -->
<!-- singleton(单例):无论取多少次这个对象,获得的都是同一对象 -->
<!-- prototype(原型):每次取对象都是按照原型重新new一个:例如Action一般使用这个配置 -->
<!-- autowire:default是指全局设置 -->
<bean id="userService" class="com.castiel.service.UserService" scope="singleton" autowire="byName">
</bean>
</beans>
这里,我们设置了Spring容器中beanId='userService'的autowire属性为'byName',在xml最上面我们分别建立了userDAO、userDAO1、userDAO2这三个对象,这三个对象都有一个'daoId'的变量,我们要做的事情是,把userDAO、userDAO1、userDAO2这三个对象自动注入到userSerive这个对象中。
下面我们贴上UserService这个类的代码:
package com.castiel.service;
import com.castiel.dao.UserDAO;
import com.castiel.model.User;
public class UserService {
private UserDAO userDAO;
private UserDAO userDAO1;
private UserDAO userDAO2;
public UserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
public UserDAO getUserDAO1() {
return userDAO1;
}
public void setUserDAO1(UserDAO userDAO1) {
this.userDAO1 = userDAO1;
}
public UserDAO getUserDAO2() {
return userDAO2;
}
public void setUserDAO2(UserDAO userDAO2) {
this.userDAO2 = userDAO2;
}
public void add(User u){
this.userDAO.save(u);
}
}
由于要进行测试,我们要在UserDAOImpl类中建立一个名称为'daoId'的变量,并重写toString()方法,用于打印'daoId'的值:
package com.castiel.dao.impl;
import com.castiel.dao.UserDAO;
import com.castiel.model.User;
public class UserDAOImpl implements UserDAO {
private int daoId;
public int getDaoId() {
return daoId;
}
public void setDaoId(int daoId) {
this.daoId = daoId;
}
@Override
public void save(User u) {
// TODO Auto-generated method stub
System.out.println("开始存储数据!");
System.out.println("存储User...");
//这里编写持久化到数据库的代码,如JDBC,或使用hibernate,ibatis等框架
System.out.println("用户持久化到数据库完成!");
}
@Override
public String toString(){
return "daoId="+daoId;
}
}
最后,我们编写一个测试方法验证是否注入成功:
package com.castiel.service;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.castiel.service.UserService;
public class UserServiceTest {
/**测试类生成方式**/
/**
* 1.选中src下com.castiel.service包中的UserService
* 2.右键new jUnit Test Case
* 3.点击NEXT
* 4.选择需要测试的方法
* 5.点击Finish
* 6.把生成出来的*Test.java文件拖到test下com.castiel.service包中
* @throws Exception
*/
@Test
public void testAdd() throws Exception {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService)applicationContext.getBean("userService");
System.out.println(userService.getUserDAO().toString());
System.out.println(userService.getUserDAO1().toString());
System.out.println(userService.getUserDAO2().toString());
}
}
打印结果表示已经用autowire='byName'的方式注入成功,打印结果附图: