概述
所谓眼见为实,Spring虽然是一个轻量级的框架,但涉及众多的概念,理解起来并不容易,因此,先参考资料写一个简单的Demo,从中洞见Spring的大体工作流程,为后面深入学习做铺垫。
本文的Demo很简单:模拟图书数据访问服务,即向数据库中添加图书信息,涉及IBookDAO接口与BookDAO实现类。
一、环境准备
1. JDK 1.8及以上;
2. Maven 3.5及以上
3. IDE,Eclipse,IntelliJ IDEA 等,本文采用Eclipse
二、创建一个Maven工程
第一步:在pom文件中添加必要的依赖:既然要使用Spring,自然要添加相关的依赖包,如下所示:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yingshulan.spring</groupId>
<artifactId>spring-learning</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spring-learning</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.3.0.RELEASE</spring.version>
</properties>
<profiles>
<profile>
<id>JDK1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<encoding>UTF-8</encoding>
</properties>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.4</version>
</dependency>
</dependencies>
</project>
第二步:DAO层源文件创建:创建IBookDAO接口与BookDAO实现类,仅作为简单示例,因此只包含一个方法,如下所示:
package com.yingshulan.spring_learning.api;
public interface IBookDAO
{
/**
* 添加图书
*/
public String addBook(String bookname);
}
package com.yingshulan.spring.spring_learning;
import com.yingshulan.spring_learning.api.IBookDAO;
/**
* 图书数据访问实现类,访问数据库不是本文的重点,为简单起见,这里只是模拟访问数据库
* 并没有真正存储图书信息到数据库中。
*/
public class BookDAO implements IBookDAO
{
public String addBook(String bookname)
{
// write book information to data base
// ...
// 模拟写图书信息到数据库成功,返回提示信息
return "添加图书" + bookname + "成功!";
}
}
第三步:Service层源文件创建:创建一个BookService类,如下:
package com.yingshulan.spring.spring_learning;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.yingshulan.spring_learning.api.IBookDAO;
public class BookService
{
private IBookDAO bookDAO;
public BookService()
{
// 第一步: 使用框架 API ClassPathXmlApplicationContext() 来创建应用程序的上下文。
// 这个 API 加载 beans 的配置文件并最终基于所提供的 API,它处理创建并初始化所有的对象,
// 即在配置文件中提到的 beans。
ApplicationContext ctx = new ClassPathXmlApplicationContext("IOCBeans01.xml");
// 第二步是使用已创建的上下文的 getBean() 方法来获得所需的 bean。
// 这个方法使用 bean 的 ID 返回一个最终可以转换为实际对象的通用对象。一旦有了对象,
// 你就可以使用这个对象调用任何类的方法。
bookDAO = (IBookDAO) ctx.getBean("bookdao");
}
/**
* Service层: 调用DAO层的方法写信息到数据库
* @param bookname
*/
public void storeBook(String bookname)
{
System.out.println("增加图书信息到数据库");
String result = bookDAO.addBook(bookname);
System.out.println(result);
}
}
第四步:为Bean创建配置文件:即第三步代码中的 “IOCBeans01.xml”,该文件是一个 XML 文件,这个文件需要在 src 目录(按照规范,一般在src/resource目录)下创建。通常开发人员保存该文件的名称为 Beans.xml 文件,当然你也可以设置成任何你喜欢的名称。但是你必须确保这个文件在 CLASSPATH 中是可用的,并在主应用程序中使用相同的名称。
Beans.xml 用于给不同的 bean 分配唯一的 ID(本例中只定义了一个bean,id为 “bookdao”),并且控制对象的创建,而不会影响 Spring 的任何源文件。例如,使用下面的文件,事实上定义了一个BookDAO类的bean,由于BookDAO类没有属性,构造方法也是默认的,因此,bean的定义没有涉及属性,后面我们将介绍更复杂的bean的定义。
<?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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="bookdao" class="com.yingshulan.spring.spring_learning.BookDAO"></bean>
</beans>
工作流程:
当 Spring 应用程序被加载到内存中时,框架利用了上面的配置文件来创建所有已经定义的 beans,并且按照标签的定义为它们分配一个唯一的 ID。你可以使用标签来传递在创建对象时使用不同变量的值。这些beans被创建后存在于Spring容器中,应用程序可以通过ID获取bean,bean本质上是对象,既然获取了bean,自然就能够调用bean的方法。
第五步:创建测试类,运行程序:创建一个测试类,调用Service层方法进行测试,如下:
package com.yingshulan.spring.spring_learning;
public class AppTest
{
public static void main(String[] args)
{
BookService bookservice = new BookService();
bookservice.storeBook("《深入浅出理解 Spring 3.X 精要》");
}
}
运行结果:
增加图书信息到数据库
添加图书《深入浅出理解 Spring 3.X 精要》成功!