JavaEE开发JavaEE NoteJavaEE 学习专题

[JAVAEE]实验02:Spring Ioc

2019-03-06  本文已影响1人  Topus

一.实验目的:

(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 {
    
}

四、运行结果:

运行结果
上一篇下一篇

猜你喜欢

热点阅读