文章目录
一、Spring简介
Spring是一个开源框架,它由Rod Johnson创建,它是为了解决企业应用开发的复杂性而创建的
Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情,然而,Spring的用途不仅限于服务器端的开发;从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受 益。
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
中间层框架、万能胶 容器框架
struts2 JavaBean 项目中的一个个类
spring IOC和AOP
hibernate
spring包括的功能有很多👀👀
spring tool suite官方下载地址:http://spring.io/tools/sts/all
在线安装教程很详细的网文地址:http://www.cnblogs.com/liuyungao/p/6213997
二、Spring中ioc的特点
我们直接看IoC在工程中的体现,接下来我们创建一个maven项目,至于怎么创建,不记得了看这https://blog.csdn.net/weixin_67450855/article/details/126146653?spm=1001.2014.3001.5502
项目创建好了嘞,会报错,所以我们就要在pom.xml中配置插件还有等等一些步骤,一步一步来咯
<properties>
<spring.version>5.0.1.RELEASE</spring.version>
<javax.servlet.version>4.0.0</javax.servlet.version>
<junit.version>4.12</junit.version>
</properties>
导入jar包依赖(注意格式❗❗) 如果报红,当前目录解决不了就切一个目录,再不行就把仓库清空
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- 2、导入spring依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 5.1、junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- 5.2、servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${javax.servlet.version}</version>
<scope>provided</scope>
</dependency>
导入jdk插件
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
更换工程目录
更换java编译器版本,web版本
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
右键项目-->properties-->Project Facets-->⬇⬇⬇
右键项目,更新工程
需求:
同时在用户模块、订单模块拿到所有的用户数据
需求变更1:
同时在用户模块、订单模块拿到所有的用户数据,并且要求用户数据是已经通过年龄排序的
对应策略:修改UserBiz中的list方法,添加排序功能
需求变更2:
同时在用户模块、订单模块拿到所有的用户数据、并且要求用户数据是在已经注册的时间序
对应策略:修改UserBiz中的list方法,添加排序功能、按时间点排序
那如果说客户又觉得还是改回原来的需求吧,这样代码是不是就改来改去
这个时候呢,我们可以用到接口多实现
但是这么做也有弊端:
最原始的方法就是频繁修改业务层biz层的代码,频繁修改bog会越来越多
接口多实现方法:凡是涉及到用户业务层调用的地方,都需要修改代码那我们该怎么去解决这个问题——IoC,接下来我们看看使用IoC是怎么解决这个问题的⬇⬇⬇⬇
IOC的主要作用就是管理整个项目的javabean,依靠注入、控制反转的特点进行管理
IOC的特点:依赖注入,控制反转
控制反转:指的是将创建对象的权利反转给Spring容器来完成
导入spring的配置文件 | 配置文件中内容⬇⬇⬇
所有的类将都配置到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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
</beans>
创建一个测试类
得出spring运行逻辑:
1.对spring框架的配置文件进行建模,建模后,spring-context.xml中所有的javabean的信息都
会加载进spring容器上下文
2.上下文中就包含了spring-context.xml所有对象,建模最终获取对象
在不用ioc状态下,我们需要根据需求不断更改代码,而使用ioc时我们更改代码只需要更改spring-context.xml中的即可⬇⬇⬇
三、依赖注入的3种方式
set注入
我们去Ioc_test中运行测试一下
构造注入
在Ioc_test中运行测试一下
自动搭配
byName
运行后
我们把UserAction中的userBiz改为userBiz1 ⬇⬇⬇
全部改好了之后我们在去运行一下,会报错如图所示:
报的错就是我们刚刚改动的地址
byType
当我们换成byType的时候
运行一下就不会报错了
看一个错误演示
byName: 是Spring管理的bean对象的ID进行查找 ,如果找不到则注入失败,反之成功
byType: 是Spring管理的bean对象接口实现类进行查找,如果没有或2个以上,则注入失败,反之成功
四、Spring与web容器的整合
为了解决问题的,最终我们的开发肯定是开发web应用的web网页程序,最终就是要运行起来,要拿到整个工程里的任何一个bin对象的,那么我们当前是通过建模的方式去拿的,那么我们不可能把建模的那段代码放到每一个servlet里面去做
why:建模的过程是十分耗时
项目启动两三分钟少之又少,如果每一次请求都要加这个文件,给客户的响应速度是极其慢的
如果要走上面那个建模就相当于睡觉了,也就相当于Thread.sleep(10000)
解决问题
建模是耗时间的, 怎么才能让建模执行一次,并且同时能让每一个Servlet拿到context对象?
1.建模必不可少
2.建模要保障只执行一次
3.建模后期望在每一个Servlet都能够拿到Spring的上下文对象ClassPathXmlApplicationContext
how 监听器的初始化方法
Tomcat一启动监听器就打印,那么它会保障一定不会给你建模,并且它还保证执行一次
Spring的上下文要存放在Tomcat上下文中
SpringLoadListener源码:
本章小结
1.Spring的理解及作用
容器框架 中间层框架 用来整合其他的第三方框架
有两大核心组件 第一个是ioc 第二个是aop
2.IOC的作用
特点:依赖注入、控制反转
控制反转:经创建对象的权利,有程序员手动new对象的权利转交给Spring容器完成
优点:便于维护,拥抱变化
3.依赖注入的方式
set注入
构造注入
自动装配
4.自动装配
byName:根据bean 的 id在Spring的上下文中进行寻找,匹配上了会自动注入给属性
byType:根据属性接口在Spring上下文中找对应的接口实现类,如果找到一个,就会自动注入;如果0或者2个以上就会报错
5.Spring如何与web容器集成
5.1.在监听器中初始化Spring上下文--建模
5.2.拿到tomcat上下文,将Spring上下文存储到tomcat中
5.3.在web.xml中配置监听器
5.4.在测试的servlet中进行测试,在servlet看能否拿到Spring上下文