1.Spring家族
Spring发展到今天已经形成了一种开发的生态圈,Spring提供了若干个项目,每个项目用于完成特定的功能。
Spring已形成了完整的生态圈,也就是说我们可以完全使用Spring技术完成整个项目的构建、设计与开发。
Spring有若干个项目,可以根据需要自行选择,把这些个项目组合起来,起了一个名称叫全家桶,如下图所示:
这些并不是都要学习,额外重点关注Spring Framework、SpringBoot和SpringCloud:
Spring Framework:Spring框架,是Spring中最早最核心的技术,也是所有其他技术的基础。
SpringBoot:Spring是来简化开发,而SpringBoot是来帮助Spring在简化的基础上能更快速进行开发。
SpringCloud:这个是用来做分布式之微服务架构的相关开发。
2.Spring系统架构:
前面所说的spring指的是Spring Framework,那么其中都包括了哪些内容?
针对这些问题,我们将从系统架构图和课程学习路线来说明:
系统架构图:
(我们主要学习Spring Framework的4版本的架构图)
(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来完成单元测试和集成测试
课程学习路线:
介绍完Spring的体系系统后,从中我们可以得出对于Spring的学习主页包含四部分内容:
3.IOC、IOC容器、Bean、DI
IOC(Inversion of Control)控制反转
(1)什么是控制反转呢?
使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。
业务层要用数据层的类对象,以前是自己new的,现在自己不new了,交给别人(外部)来创建对象,别人(外部)就反转控制了数据层对象的创建权,这种思想就是控制反转。
(2)Spring和IOC之间的关系是什么呢?
Spring技术对IOC思想进行了实现
Spring提供了一个容器,称为IOC容器,用来充当IOC思想中的"外部"(IOC思想中的别人(外部)指的就是Spring的IOC容器)
(3)IOC容器的作用以及内部存放的是什么?
IOC容器负责对象的创建、初始化等一系列工作,其中包含了数据层和业务层的类对象被创建或被管理的对象在IOC容器中统称为Bean,IOC容器中放的就是一个个的Bean对象
DI(Dependency Injection)依赖注入
(1)什么是依赖注入呢?
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入
业务层要用数据层的类对象,以前是自己new的,现在自己不new了,靠别人(外部其实指的就是IOC容器)来给注入进来,这种思想就是依赖注入
spring框架进行自动注入对象,默认使用setter方法
(2)IOC容器中哪些bean之间要建立依赖关系呢?
这个需要程序员根据业务需求提前建立好关系,如业务层需要依赖数据层,service就要和dao建立依赖关系
介绍完Spring的IOC和DI的概念后,我们会发现这两个概念的最终目标就是:充分解耦,具体实现靠:
使用IOC容器管理bean(IOC)
在IOC容器内将有依赖关系的bean进行关系绑定(DI)
最终结果为:使用对象时不仅可以直接从IOC容器中获取,并且获取到的bean已经绑定了所有的依赖关系。
spring的IOC入门案例:
进行项目部署(忽略spring01),并导入jar包:
先写接口:
package com.du.dao;
public interface BookDao {
void add();
}
package com.du.service;
public interface BookService {
void save();
}
然后写实现类:
package com.du.dao.impl;
import com.du.dao.BookDao;
public class BookDaoImpl implements BookDao {
@Override
public void add() {
System.out.println("BookDaoImpl...add");
}
}
package com.du.service.impl;
import com.du.dao.BookDao;
import com.du.service.BookService;
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public String name;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public void setName(String name) {
this.name = name;
}
@Override
public void save() {
System.out.println("BookServiceImpl...save" + name);
bookDao.add();
}
}
之后创建spring的核心配置文件:
<?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">
<!--把所有对象创建到spring的IOC容器中,并起上名字
id:表示给对象起名字
class:类的全类名
-->
<bean id="bookDao" class="com.du.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.du.service.impl.BookServiceImpl">
<!--spring的依赖注入:property表示BookServiceImpl的属性,常规属性使用value赋值,
类型属性使用ref引用-->
<property name="name" value="季唯"/>
<property name="bookDao" ref="bookDao"/>
</bean>
</beans>
最后进行测试:
package com.du.test;
import com.du.service.BookService;
import com.du.service.impl.BookServiceImpl;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test01 {
BookService bookService;
@Test
public void test01(){
//1.获得IOC容器
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
//2.根据名字从容器中获取对象
bookService = (BookService) context.getBean("bookService");
bookService.save();
}
}
4.AOP
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高开发的效率。
AOP的相关术语
- Joinpoint(连接点):
所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点。
- Pointcut(切入点):
所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义。
- Advice(通知/增强):
所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知。通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。
- Introduction(引介):
引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或 Field。
- Target(目标对象):
代理的目标对象。
- Weaving(织入):
是指把增强应用到目标对象来创建新的代理对象的过程。spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装载期织入。
- Proxy(代理):
一个类被 AOP 织入增强后,就产生一个结果代理类。
- Aspect(切面):
是切入点和通知(引介)的结合。