目录
一.Spring相关概念
1.1 初识Spring
1.1.1 Spring家族
Sp
ring并不是单一的一个技术,而是一个大家族,如下图所示:
这些技术并不是所有的都需要学习,需要重点关注的是
Spring Framework
、
SpringBoot
和
SpringCloud
:
我们今天所学习的Spring其实指的是Spring Framework。
1.1.2 Spring发展史
-
IBM在1997年提出了EJB思想,早期的Java EE开发大都基于该思想。
-
Rod Johnson在2002年出版的 Expert One-on-One J2EE Design and Development ,书中有阐述在开发中使用EJB该如何做。
-
Rod Johnson在2004年出版的 Expert One-on-One J2EE Development without EJB ,书中提出了比EJB思想更高效的实现方案,并且在同年将方案进行了具体的落地实现,这个实现就是Spring1.0。
-
随着时间推移,版本不断更新维护,目前最新的是Spring5
-
Spring1.0是纯配置文件开发
-
Spring2.0为了简化开发引入了注解开发,此时是配置文件加注解的开发方式
-
Spring3.0已经可以进行纯注解开发,使开发效率大幅提升,我们的课程会以注解开发为主
-
Spring4.0根据JDK的版本升级对个别API进行了调整
-
Spring5.0已经全面支持JDK8,现在Spring最新的是5系列所以建议大家把JDK安装成1.8版
-
1.1.3 Spring系统架构
1.x Spring Framework是Spring生态圈中最基础的项目,是其他项目的根基。
2.x Spring Framework的发展也经历了很多版本的变更,每个版本都有相应的调整
Spring Framework的5版本目前没有最新的架构图,而最新的是4版本,所以接下来主要研究的是4.x 的架构图
(1)核心层
-
Core Container:核心容器,这个模块是Spring最核心的模块,其他的都需要依赖该模块
(2)AOP层
-
AOP:面向切面编程,它依赖核心层容器,目的是==在不改变原有代码的前提下对其进行功能增强==
-
Aspects:AOP是思想,Aspects是对AOP思想的具体实现
(3)数据层
-
Data Access:数据访问,Spring全家桶中有对数据访问的具体实现技术
-
Data Integration:数据集成,Spring支持整合其他的数据层解决方案,比如Mybatis
-
Transactions:事务,Spring中事务管理是Spring AOP的一个具体实现,也是后期学习的重点内容
(4)Web层
-
这一层的内容将在SpringMVC框架具体学习
(5)Test层
-
Spring主要整合了Junit来完成单元测试和集成测试
1.2 Spring核心概念
1.2.1 IOC思想
简单来说,就是使用对象时,由主动new产生对象转换为由外部提供对
象,此过程中对象控制权 由程序转移到外部,此思想称
为控制反转。
1.2.2 IOC容器
Spring技术对IOC思想进行了实现,Spring提供了一个
IOC容器,用来充当IOC思想中的外部。
1.2.3 Bean
被创建或被管理的对象在IOC容器中统称为Bean。
1.2.4 DI
绑定对象与对象之间的依赖关系。比如说在项目的Service层需要用到Dao层的对象,我们不能在Service自己new一个,而是要通过DI,也就是依赖注入为Service层注入一个Dao层的对象。
二.IOC、DI快速入门
2.1 IOC快速入门
在这里,我们直接通过一个案例来进行IOC的快速入门。
步骤一: 在idea中
创建一个Maven项目
步骤二:
添加Spring的依赖jar包
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
步骤三:
添加案例中需要的类
创建BookService,BookServiceImpl,BookDao和BookDaoImpl四个类
public interface BookDao {
public void save();
}
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
}
public interface BookService {
public void save();
}
public class BookServiceImpl implements BookService {
private BookDao bookDao = new BookDaoImpl();
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
步骤4: 添加spring配置文件
resources下添加spring配置文件applicationContext.xml
步骤5:在配置文件中完成bean的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="Index of /schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="Index of /schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--bean标签标示配置bean
id属性标示给bean起名字
class属性表示给bean定义类型
-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"/>
</beans>
步骤6:获取IOC容器
使用Spring提供的接口完成IOC容器的创建,创建App类,编写main方法
public class App {
public static void main(String[] args) {
//获取IOC容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
}
步骤7:从容器中获取对象进行方法调用
public class App {
public static void main(String[] args) {
//获取IOC容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookService bookService = (BookService) ctx.getBean("bookService");
bookService.save();
}
}
步骤8:运行程序
Spring的IOC入门案例已经完成,但是在
BookServiceImpl
的类中依然存在
BookDaoImpl
对象的new操作,它们之间的耦合度还是比较高,这块该如何解决,就需要用到下面的
DI:依赖注入
。
2.2 DI快速入门
接下来通过DI来对入门案例进行改进,以理解DI
步骤1: 去除代码中的new
在BookServiceImpl类中,删除业务层中使用new的方式创建的dao对象
public class BookServiceImpl implements BookService {
//删除业务层中使用new的方式创建的dao对象
private BookDao bookDao;
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
步骤2: 为属性提供setter方法
在BookServiceImpl类中,为BookDao提供setter方法
public class BookServiceImpl implements BookService {
//删除业务层中使用new的方式创建的dao对象
private BookDao bookDao;
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
//提供对应的set方法
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
步骤3: 修改配置完成注入
在配置文件中添加依赖注入的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="Index of /schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="Index of /schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--bean标签标示配置bean
id属性标示给bean起名字
class属性表示给bean定义类型
-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<!--配置server与dao的关系-->
<!--property标签表示配置当前bean的属性
name属性表示配置哪一个具体的属性
ref属性表示参照哪一个bean
-->
<property name="bookDao" ref="bookDao"/>
</bean>
</beans>
注意:
配置中的两个bookDao的含义是不一样的
-
name="bookDao"中 bookDao 的作用是让Spring的IOC容器在获取到名称后,将首字母大写,前面加set找对应的 setBookDao() 方法进行对象注入
-
ref="bookDao"中 bookDao 的作用是让Spring能在IOC容器中找到id为 bookDao 的Bean对象给 bookService 进行注入
-
综上所述,对应关系如下:
步骤4:运行程序
使用DI对案例改进后,发现程序的结果并没有发生变化