1 编写List、Map和Properties集合类型的注入配置格式。

参考答案

List集合注入方式的配置如下:

<bean id="messageBean"  class="com.util.MessageBean" >
	<property name="friends">
		<list>
			<value>Jack</value>
			<value>Tom</value>
		</list>
	</property>
</bean>

Map集合注入方式的配置如下:

<bean id="messageBean"  class="com.util.MessageBean" >
<property name="books">
<map>
<entry key="1001" value="Java语言基础"></entry>
<entry key="1002" value="Java Web基础“></entry>
<entry key="1003" value="Spring使用基础“></entry>
</map>
</property>
</bean>

Properties集合注入方式的配置如下:

<bean id="messageBean"  class="com.util.MessageBean" >
<property name="dbParams">
<props>
<prop key="username">root</prop>
<prop key="password">1234</prop>
<prop key="driverClassName">
		com.mysql.jdbc.Driver
</prop>
</props>
</property>
      …
</bean>

2 基于组件扫描技术实现DeptDAO和DeptService的IoC控制,并编写测试程序。

参考答案

步骤一:新建工程,导入jar包

新建名为SpringIoC_02_exec的web工程,在该工程导入如图-1所示的5个jar包。

图– 1

步骤二:新建DeptDAO,模拟JDBC实现对员工的增删改操作的接口

代码如下所示:

package org.tarena.dao;

public interface DeptDAO {
	public void add();
	public void delete();
	public void update();
}

步骤三:新建该类JdbcDeptDAO,模拟实现DeptDAO接口

使用注解@Repository表示持久层组件,代码如下所示:

package org.tarena.dao;

import org.springframework.stereotype.Repository;

@Repository
public class JdbcDeptDAO implements DeptDAO{

	public void add() {
		System.out.println("利用JDBC技术保存Dept信息");
	}

	public void delete() {
		System.out.println("利用JDBC技术删除Dept信息");
	}

	public void update() {
		System.out.println("利用JDBC技术更新Dept信息");
	}
}

步骤四:新建DeptService类

新建DeptService类,在该类中调用DeptDAO的add方法、update方法以及delete方法,并使用注解“@Resource”,将DeptDAO给DeptService注入,代码如下所示:

package org.tarena.service;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.tarena.dao.DeptDAO;

@Service
public class DeptService {
	
	private DeptDAO dao;
	@Resource
	public void setDao(DeptDAO dao) {
		this.dao = dao;
	}

	public void addDept(){
		System.out.println("添加部门操作处理");
		dao.add();
	}
	public void deleteDept() {
		System.out.println("删除部门操作处理");
		dao.delete();
	}

	public void updateDept() {
		System.out.println("修改部门操作处理");
		dao.update();
	}
}

@Resource注解标记可以用在字段定义或setter方法定义前面,默认首先按名称匹配注入,然后按照类型匹配注入。

步骤五:新建applicationContext.xml

该文件的核心代码如图-2所示。

图– 2

步骤六:新建类Test

新建类Test中,调用DeptService的addDept方法、updateDept方法以及deleteDept方法,进而调用DeptDAO的add方法、update方法以及delete方法,代码如图-3所示。

图– 3

步骤七:运行Test类

运行Tes1类,控制台的输出结果如图-4所示。

图- 4

从输出结果可以看出调用到了DeptDAO接口中的add方法、update方法以及delete方法,使用setter注入的方式将DeptDAO给DeptService注入成功。

DeptDAO接口的完整代码如下所示:

package org.tarena.dao;

public interface DeptDAO {
	public void add();
	public void delete();
	public void update();
}

JdbcDeptDAO类的完整代码如下所示:

package org.tarena.dao;

import org.springframework.stereotype.Repository;

@Repository
public class JdbcDeptDAO implements DeptDAO{

	public void add() {
		System.out.println("利用JDBC技术保存Dept信息");
	}

	public void delete() {
		System.out.println("利用JDBC技术删除Dept信息");
	}

	public void update() {
		System.out.println("利用JDBC技术更新Dept信息");
	}
}

DeptService类的完整代码如下所示:

package org.tarena.service;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.tarena.dao.DeptDAO;

@Service
public class DeptService {
	
	private DeptDAO dao;
	@Resource
	public void setDao(DeptDAO dao) {
		this.dao = dao;
	}

	public void addDept(){
		System.out.println("添加部门操作处理");
		dao.add();
	}
	public void deleteDept() {
		System.out.println("删除部门操作处理");
		dao.delete();
	}

	public void updateDept() {
		System.out.println("修改部门操作处理");
		dao.update();
	}
}

Test类的完整代码如下所示:

package org.tarena.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.tarena.service.DeptService;

public class Test {
	public static void main(String[] args) throws Exception {
		String conf = "applicationContext.xml";
		ApplicationContext ac = new ClassPathXmlApplicationContext(conf);
		DeptService service = ac.getBean("deptService", DeptService.class);
		service.addDept();
		service.updateDept();
		service.deleteDept();
	}
}

applicationContext.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"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
		http://www.springframework.org/schema/jee http:a//www.springframework.org/schema/jee/spring-jee-3.2.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
		http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd">

	<context:component-scan base-package="org.tarena" />
</beans>

3 描述下列注解标记的作用

@Component、@Repository 、@Service、@Scope、@Autowired、@Inject、@Value

参考答案

1. @Component为通用注解。

2. @Repository为持久层组件注解。

3. @Service为业务层组件注解。

4. @Scope为Bean的作用域注解。

5. @Autowired、@Inject为指定Bean之间依赖关系的注解。

6. @Value为注入Spring表达式值的注解。