文章目录
参考资料
运行环境
- windows10
- IDEA 2021.1 专业版
- JDK8
- Spring-5.0.5
一、Spring 概述
Srpring 是一种轻量级框架,称作Java EE 的春天,当前的主流框架。
学习目的是使现有技术更加易用,推进编码最佳实践
内容包括:
- IOC容器
- AOP实现
- 数据访问支持
- 简化JDBC / ORM 框架
- 声明式事务
- Web 集成
1.1 Spring 产生背景
问题的产生:
面向对象方法设计的软件系统中,其底层实现都是由 N 个对象组成的,所有的对象通过彼此合作,最终实现系统的业务逻辑。但是,系统越庞大,对象关系就越复杂,从而导致系统的耦合度越高,涉及维护就越困难。
解决问题的方法:
- 如何降低系统之间、模块之间和对象之间的耦合度,是软件工程永远追求的目标之一。
- 为了解决对象之间的耦合度过高的问题,软件专家 Michael Mattson 提出了 IOC理论。
- 目前IOC理论已被成功引用到实践中,很多的J2EE项目均采用了IOC框架产品Spring。
- 早期的Spring就是纯IOC框架和AOP的产品,不过后来就用了Spring整个生态圈,比如SpringMVC、SpringCloud、SpringBoot等。
1.2 两大核心技术 IOC/DI + AOP
IOC,全称 Inversion of Control,即控制反转;DI,全称 Dependency Injection,即依赖注入
AOP,全称 Aspect Oriented Programming,即面向切面编程。
二、Spring核心技术
2.1 IOC/DI
IOC即控制反转,可以把对象比作齿轮,它们之间的关系比作齿轮对象相互协同转动。
IOC主要原理:借助“第三方”实现具有依赖关系的对象之间的解耦。
如图,IOC容器,使得 A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方“了,全部对象的控制权上缴给“第三方” IOC容器,主动创建变为了被动注入,这就是“控制反转” (依赖注入)这个名称的由来。
传统的Web开发,加上Spring管理:
2.1.1 案例:IOC实现解耦
以传统Web开发为例,DAO层和Service层的交互通常是:
DAO层:
UserDao.java
public interface UserDao{
int add(User user);
}
UserDaoImpl.java
public class UserDaoImpl implements UserDao{
@Override
public int add(User user){
//...JDBC交互
}
}
Service层:
UserService.java
public interface UserService{
int addUser(User user);
}
UserServiceImpl.java
public class UserServiceImpl implements UserService{
UserDao userDao = new UserDaoImpl();
public int addUser(User user){
return userDao.add(user);
}
}
可以发现在UserServiceImpl.java
中声明了DAO层对应的接口,并通过多态的方式声明了接口实现类的实例。不过 UserDao userDao = new UserDaoImple()
这一句已经固定,IOC的容器就是将指定的类作为Bean
注入给userDao
,而不需要在代码里面进行实例化,比如:
public class UserServiceImpl implements UserService{
UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public int addUser(User user){
return userDao.add(user);
}
}
通过这种方式以后,并不能直接通过 new UserServiceImpl()
使用业务层的逻辑代码,而需要通过Spring提供的对象来获取到Bean
(即IOC容器里存储的对象)。
实现依赖注入通常有两种方式,注解和XML配置,笔者这里先进行XML配置的学习。
接下来通过一个需求的实现来体验IOC/DI容器的作用。
需求:定义一个实体类表示人类,使用MVC架构设计并通过依赖注入的方式实现调用对象的方法。
Maven项目的依赖:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.uni</groupId>
<artifactId>MyBatisFastUse</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 日志管理 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- lombok 自动生成无参、有参构造、get、set方法-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>