Spring是于2003 年兴起的一个轻量级的Java 开源框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design
中阐述的部分理念和原型衍生而来,为了解决企业应用开发的复杂性而创建的。
Spring框架的主要优势之一就是服务各自打包,允许使用者自由选择服务和定制服务。同时可以集成各种其他优秀的框架
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ffnn9KEh-1603980194499)(assets/image-20201028070446607.png)]
从简单性、可测试性和松耦合的角度而言,任何Java
应用都可以从Spring
中受益。
Spring的核心是控制反转(IOC
)和面向切面(AOP
)。
简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。
Spring 官网
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-68mDuqxx-1603980194501)(assets/image-20200909195909915.png)]
Spring项目 官网
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TcrtIAU5-1603980194503)(assets/image-20200909200005767.png)]
容器性质,方便解耦,简化开发
Spring提供的
IoC
容器,可以将对象间的依赖关系交由Spring容器进行控制,避免硬编码所造成的过度程序耦合。
AOP编程的支持
通过Spring的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
声明式事务的支持
通过声明式方式灵活的进行事务的管理,提高开发效率和质量
集成各种优秀框架
Spring不仅不排除其他各种优秀的框架,同时对这些框架(Mybatis、Quartz等)提供了很好的支持
降低JavaEE API的使用难度
Spring对JavaEE API 进行了封装,使得这些API降低了使用难度
良好的设计,容易扩展,很多可重用的组件
由于Spring是一个具有容器性质的框架,因此Spring框架由大约20个模块组成的特性组成,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E0ALzESn-1603980194506)(assets/image-20201009162424400.png)]
思考: 之前项目使用三层架构是否存在问题?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-78WQpKYn-1603980194509)(assets/image-20200909165520086.png)]
这种架构虽然能够使项目解耦,但是三层之间的相互调用就会带来一个新的问题:
web
层调用service
层就是在web
层创建service
层对象,然后调用其方法service
层调用dao
层也是在service
层创建dao
层对象,然后调用其方法如果每层之间掉用比较频繁,就会频繁的创建对象,增大资源的消耗,且每层与每层的耦合度还是相对较高。
为了更好的解耦,降低模块之间的依赖程度,我们尝试将对象创建的过程交给专门的对象创建工厂管理。工厂对象可以选择创建一个容器,将所有创建好的对象放入容器中,也可以每次返回给我们新的对象。这样当web
层想要调用service
层时,直接从容器中获取service
对象即可。其项目图如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XkryyUTA-1603980194511)(assets/image-20200909171150553.png)]
Spring IoC就是一个类似这样的容器
Ioc (Inverse of Control)
控制反转,将对象的创建以及对象直接的依赖关系反转给Spring 容器,程序本身不进行维护。如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rnJo3DpK-1603980194515)(assets/image-20201011183545095.png)]
准备Spring 开发所需jar包
可以从官网下载提供的Spring 仓库中下载(https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release),也可以从提供的资料里面找到。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZYITu3Ii-1603980194518)(assets/image-20201028070710793.png)]
下载解压后可以看到:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5H5LHjVM-1603980194520)(assets/image-20201011184405345.png)]
注意: 使用的Spring版本为 5.1.9.Release
将核心容器jar包以及辅助包导入项目lib目录下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QClycglb-1603980194523)(assets/image-20201028071148764.png)]
commons-logging / log4j 属于日志工具
创建pojo类
内容如下:
package com.briup.ioc.basic;
public class User {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
}
first.xml
,放入com.briup.ioc.basic目录下。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K0ywuSBt-1603980194524)(assets/image-20201028071725606.png)]
给配置文件追加约束
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UPUT7a2y-1603980194526)(assets/image-20201011192052332.png)]
<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
https://www.springframework.org/schema/beans/spring-beans.xsd">
beans>
在配置文件中添加需要被Spring容器管理的资源
<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
https://www.springframework.org/schema/beans/spring-beans.xsd">
bean>
beans>
测试
创建测试类
内容如下:
package ioc_day1;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.briup.ioc.basic.User;
public class IOCTest_day1 {
@Test
public void first() {
ApplicationContext ac =
new ClassPathXmlApplicationContext(
"com/briup/ioc/basic/first.xml");
User user = ac.getBean(User.class);
System.out.println(user);
}
}
结果如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yJXDZok5-1603980194529)(assets/image-20201028072532349.png)]
ApplicationContext
结构图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YyvAEj7p-1603980194531)(assets/image-20201011194054333.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ymf34fgj-1603980194533)(assets/image-20201011200215290.png)]
BeanFactory
和ApplicationContext
的区别
Spring容器的顶层接口,ApplicationContext是其子接口
ApplicationContext接口,它由BeanFactory接口派生而来,包含BeanFactory的所有功能
BeanFactory 创建容器时不会创建对象,当从容器里面获取对象时才会创建
ApplicationContext 创建容器时就会创建对象
ApplicationContext
实现类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bXOOJ4PF-1603980194535)(assets/image-20201011201743451.png)]
ClassPathXmlApplication
从类的根路径下加载配置文件
FileSystemXmlApplication
从磁盘路径加载配置文件,配置文件可以在磁盘任何位置
AnnotationConfigApplicationContext
用注解配置容器对象时,需要使用此类来创建spring容器,后面会着重讲这个
获取对象细节
在配置文件中配置对象,没有唯一标识时,可以通过Class类型的对象来获取