一.实验目的:
(1)理解Spring Ioc 和 DI概念;
(2)掌握依赖注入的两种实现方式。
实验内容:模仿教材示例程序,利用Spring实现添加图书的功能。
实验步骤:
(1)创建Java工程项目,为项目添加Spring支持;
(2)创建实体类Book;
(3)创建dao层接口BookDao并在接口中定义方法public void save(Book book);
(4)创建dao层实现类BookDaoImpl(模拟访问数据库);
(5)创建service层接口BookService并在接口中定义方法public void add(Book book);
(6)创建service层实现类BookServiceImpl,添加属性private BookDao bookDao,add方法通过该属性
调用dao层的save方法。
(7)分别采用构造方法注入和属性的setter方法注入,实现bookDao的自动注入。
二、项目结构:
项目结构三、代码:
1.用于模拟数据库的存储操作的Dao包:
BookDao.java
package dao;
import entity.Book;
public interface BookDao {
//用于模拟数据库的存储操作
public void save(Book book);
}
BookDaoImpl.java(实现其接口的方法)
package dao;
import entity.Book;
//BookDao的实现类
public class BookDaoImpl implements BookDao{
// @override
//用于模拟数据库的存储操作(具体实现)
public void save(Book book) {
System.out.println("Books saved");
}
}
2.用于业务逻辑的Service包
BookService.java
package service;
import entity.Book;
public interface BookService {
//添加图书的方法
public void add(Book book);
}
BookServiceImpl.java(构造方法注入的实现类)
package service;
import dao.BookDao;
import entity.Book;
//方法一:使用构造方法注入
public class BookServiceImpl implements BookService {
//定义一个BookDao的属性
private BookDao bookDao;
//注意:这里并没有new bookDao;
//BookServiceImpl的构造方法,用于实现依赖注入接口对象bookDao
public BookServiceImpl(BookDao bookDao) {
super();
this.bookDao = bookDao;
}
//添加图书的方法(实现),相当于服务层的添加图书方法里面封装了数据操作save的的方法
public void add(Book book) {
bookDao.save(book);
System.out.println("使用构造方法注入!");
}
}
BookServiceImpl1.java(setter方法注入的实现类)
package service;
import dao.BookDao;
import entity.Book;
//方法二:使用属性的setter方法注入
public class BookServiceImpl1 implements BookService{
private BookDao bookDao;
//注意:这里并没有new bookDao;
//添加bookDao属性的setter方法,用于实现依赖注入
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public void add(Book book) {
//定义一个BookDao的属性
bookDao.save(book);
System.out.println("使用属性的setter方法注入!");
}
}
3.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 将指定的BookDaoImpl类托管给Spring,让Spring创建其实例 -->
<!-- 大白话说:就是麻烦人家Spring老人家帮忙实例化一个BookDaoImpl类,起名叫"myTestDao" -->
<bean id="myTestDao" class="dao.BookDaoImpl"></bean>
<!-- 构造方法注入,然后将BookServiceImpl类托管给Spring,让Spring创建其实例 -->
<!--大白话说:就是麻烦人家Spring老人家帮忙实例化一个BookServiceImpl类,然后把上面的myTestDao注入到其构造函数中的第一个参数 -->
<bean id="myTestService" class="service.BookServiceImpl">
<!-- 将myTestDao 注入到 BookServiceImpl类的属性bookDao上 -->
<!--index 用于定义参数,ref用于指定某个实例的引用 -->
<constructor-arg index="0" ref="myTestDao"/>
</bean>
<!-- 使用setter方法注入 -->
<bean id="myTestService2" class = "service.BookServiceImpl1">
<!-- 调用service.BookServiceImpl1类的setter方法,将myTestDao注入到BookServiceImpl1类的属性bookDao上-->
<property name="bookDao" ref ="myTestDao"></property>
</bean>
</beans>
4.测试类
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.BookService;
import entity.Book;
public class test {
public static void main(String[] args) {
//注意:这里还是没有new bookDao(数据库);
//初始化spring容器ApplicationContext,加载配置文件
ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
//测试构造方法注入
Book book = new Book();
BookService ts = (BookService)appCon.getBean("myTestService");
ts.add(book);
//测试setter方法注入
Book book2 = new Book();
BookService ts2 = (BookService)appCon.getBean("myTestService2");
ts2.add(book2);
}
}
5.entity包下的Book类(目前可以啥也不写)
package entity;
public class Book {
}
网友评论