Spring程序开发步骤

image.png

最开始的调用方式 比如想在UserServiceImpl调用UserDaoImpl 是通过new一个UserDao完成的
现在使用了Spring 是通过Spring的反射创建Bean对象来完成对象的创建,能够解耦合
为什么说是解耦合了呢? 因为spring通过xml配置文件来创建对象,如果想修改这个对象,可以直接在tomcat服务器里把这个xml文件进行修改,这样就完成了解耦
image.png

image.png
image.png

Spring配置文件

image.png
scope主要的作用就是在spring容器中存在的对象数量,singleton就是只是一个对象,prototype是每次getBean时都会重新创建一个新的对象
request session global session都是在创建完对象之后spring会把这个对象放在容器的同时放到这些域里
singleton是在spring容器创建的时候 创建的 ,prototype是在getBean时创建(相当于懒汉)

Bean的三种实例化方式

无参构造方法
工厂静态
工厂实例化

静态工厂
image.png
image.png
Spring通过这个getUser方法

工厂实例化
image.png
image.png

依赖注入

image.png
依赖注入:它是Spring框架核心IOC的具体实现。
在编写程序的时候,通过控制反转,把对象的创建交给了Spring,但是代码中不可能出现没有依赖的情况,IOC解耦只是降低他们的依赖关系,但不会消除,例如:业务层仍会调用持久层的方法。
那这种业务层和持久层的依赖关系在使用了Spring之后,就让Spring来维护,简单的说,就是等框架把持久层传入到业务层,不用自己去获取

两种 一种set注入 一种构造器注入
image.png
通过配置文件告诉spring 注入了
image.png

image.png

基本数据类型注入

image.png

知识要点

image.png

Spring注解开发

image.png
image.png
image.png
image.png
配置类
image.png
Spring会将当前方法的返回值以指定名称存储到Spring容器中

image.png
PropertySource 读取配置文件内容,然后通过value注解存到属性里
image.png
image.png

image.png
采用注解配置就不用applicationContext.xml文件了 直接获取那个Spring核心配置类即可
image.png

ApplicationContext应用上下文获取方式

image.png

image.png
image.png

不用每次使用的时候都去实例化ApplicationContext了 可以直接使用 直接获取应用上下文
image.png

image.png

image.png
image.png

image.png

SpringMVC

image.png

image.png

image.png

image.png

image.png

image.png

SpringMVC执行流程

image.png

image.png

image.png

image.png

SpringMVC注解

image.png

image.png

数据响应方式

image.png

image.png

必须带username参数才能访问
image.png

image.png
ModelAndView 想传数据就用addObject方法 想转页面就执行setViewName方法
image.png
只使用model return 返回的还是页面
image.png
HttpServletRequest是原生的不常用
image.png

回写数据

image.png
ResponseBody告诉SpringMVC不要进行视图跳转,直接进行数据响应
image.png
实际业务中很少会返回字符,一般都是会返回json格式的数据
使用json转换工具
image.png
image.png
image.png

返回对象或集合

想让SpringMVC自动帮助 把对象和集合转换成json格式的 需要配置处理器映射器

image.png

image.png
上述方式虽然可以返回json格式的字符串但是设置还是比较麻烦 ,因此可以使用mvc注解驱动代替上述配置
image.png
image.png

SpringMVC获得请求

image.png

获得基本参数类型

image.png

获得POJO类型参数

image.png
只需要把POJI写在参数处SpringMVC会自动的把参数对应到属性中

获得数组

image.png
封装对象在数组中通常用VO对象来操作
image.png

image.png

image.png

获得集合

image.png

image.png
要在参数里加上ReuqestBody注解
image.png

静态资源访问的配置

image.png

加在spring-mvc.xml
image.png
mapping是访问资源的地址 后面的location是访问资源的路径
image.png
也可以使用来解决静态资源的访问,这个配置表示如果找不到匹配的地址就交给原始的容器tomcat去寻找资源

请求乱码解决

image.png

参数绑定注解 requestParam

image.png
image.png

Restful风格的参数

image.png
不是使用?id=xx 的方式去传递参数 而是直接把参数当做地址的一部分传递
image.png
只有Restful风格的url 和请求方式 才使用PathVariable注解进行占位符的匹配获取工作
其实很好区分就是看是否使用requestMapping中的参数是否使用{name}这种方式
image.png
Screenshot_2022-06-29-20-10-20-226_com.quark.browser.jpg
Screenshot_2022-06-29-20-10-34-467_com.quark.browser.jpg

@RestController = @Controller + @ResponseBody

使用@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面。

若返回json等内容到页面,则需要加@ResponseBody注解。

使用@RestController这个注解,返回json,视图解析器无法解析jsp,html页面。

@PathVariable(路径变量)

Servlet相关API

image.png

获取请求头

image.png

文件上传

image.png
image.png

image.png

image.png

image.png
image.png
image.png

多文件上传

同文件名可以使用MultipartFile[] 数组来解决
image.png

image.png
image.png

名称不一样的可以直接添加一个参数即可
image.png

拦截器

image.png

interceptor和filter区别

image.png
image.png

image.png
配置拦截器 拦截所有的请求资源,兵器转到MyInterceptor1去处理
image.png
image.png

在目标方法之前执行preHandle 判断请求的参数如果有yes 就返回true并且继续其他的操作,如果为空或者不为yes就转发到error.jsp页面 并返回false
image.png
在目标执行后的方法,拦截完成之后首先会执行 目标方法之前的方法 返回true之后会执行 具体的URL所要访问的页面,但是执行完成后并不会马上return回ModelAndView,而是执行 拦截器中 的 postHandle(目标方法执行后)的方法,比如此例子中,在方法内的attribute存放的是itcast,但是通过拦截器后 会执行拦截器中的 执行目标方法之后的方法, 所以attribute中的name 内容变成了itheima,
image.png

拦截器链条
image.png
先执行拦截器1的前置方法 再执行拦截器2的前置方法
然后执行目标资源,紧接着执行拦截器2的后置方法 再执行拦截器1的后置方法,然后再执行拦截器2的完成方法 和1的完成方法
分析:首先是拦截器的前置方法,执行完1的就执行完2的,完成前置方法了就需要去执行目标资源,执行完目标资源时 此时因为是后进入的拦截器2的 所以就先执行拦截器2的后置方法(参考for循环嵌套)然后执行拦截器1的后置方法
如何确定哪个先执行? 更改配置文件的顺序既可

拦截未登陆的用户
image.png
image.png

SpringMVC异常处理

image.png

异常处理两种方式

image.png

image.png


默认异常展示页面,value表示设置的页面,此处是erro,当发生异常并且在controller也没有解决,并往上抛异常就会到 配置的配置异常处理器当中,如果没有对专门的异常设置对应的页面的话就会走默认异常页面。
image.png

自定义异常处理

image.png
通过instanceof判断异常是自定的还是 其他的

  1. /*
  2. 参数Exception
  3. 返回值 ModelAndView:跳转到错误视图信息
  4. */
  5. public class MyExceptionResolver implements HandlerExceptionResolver{
  6. public ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response,Object o,Exception e){
  7. ModelAndView modelAndView = new ModelAndView();
  8. if( e instanceof MyException){
  9. modelAndView.addObject("info","自定义异常");
  10. }else{e instanceof ClassCastException){
  11. modelAndView.addObject("info","类型转换异常");
  12. }
  13. modelAndView.setView("error");
  14. return modelAndView;
  15. }
  16. }

image.png

SpringAOP

AOP简介

image.png

不修改源码既可对方法进行增强! 比如进行日志的记录 减少代码重复性,提高开发效率并且便于维护
image.png
image.png

jdk动态代理proxy

学一个技术,要知道技术因何而产生,才能有学下去的目标和动力,才能更好的理解
首先,要明确为什么要存在代理呢?
存在一个常见的需求:怎样在不修改类A代码的情况下,在调用类A的方法时进行一些功能的附加与增强呢?
先不考虑什么代理不代理的,我们设计一个简单的实现方案:
新创建一个类B,类B组合类A,在类B中创建一个方法b,方法b中调用类A中的方法a,在调用前和调用后都可以添加一些自定义的附加与增强代码。 当有需求需要调用类A的方法a并且想要添加一个附加功能时,就去调用类B的方法b即可实现上述需求;

动态代理

AOP概念

image.png
目标方法和增强 称为切面

织入:目标对象通过增强(方法/逻辑)生成代理对象的过程
,增强中的过程叫织入,织入完成过后的产物叫切面

AOP开发事项

image.png
image.png

image.png

MyAspect 是切面对象,保存的是增强的方法!
target是目标对象 是要被增强的!!
aop:aspect ref=”此处填保存增强方法的!!”
aop:before method=”此处填的是切面里的增强方法的方法名!!” pointcut=”excution(public void com.itheima.aop.Target.save())”
pointcut填的是要被增强的方法名
image.png
测试
image.png

image.png

切点表达式

image.png
Target类下的任意方法 参数 也是任意个数

image.png
aop包下的任意类 任意方法 任意 参数 这个比较常用

image.png
aop包以及下面的子包

image.png

通知的类型

image.png

image.png
用pjp.proceed()方法把环绕方法里的两部分内容分割开
image.png

抽取切点表达式

要为这个切点配置很多 增强方法 不如直接把这个切点 抽取出来然后使用 pointcut-ref引用即可
image.png

基于注解的AOP开发

image.png

增加一个Component注解 交给spring去管理并设置名称,然后添加Aspect注解表示这个bean是一个切面类 保存的是通知的方法! 然后想用哪个方法去增强哪个切点就需要Before After Around等 这种注解表示 通知的方式 和通知的是哪个方法(使用哪个方法就在哪个方法的上面加上注解),并指定那个切点表达式,告诉它是要给哪个类啊 哪个方法去增强

image.png

  1. 开启组件扫描和AOP自动代理

image.png
测试类
image.png

注解类型

image.png

image.png

Spring的事务控制

image.png
image.png image.png
image.png
image.png
超时时间,比如要去查询一个东西,如果查的很慢就不能一直查下去

image.png

什么是声明式事务控制

image.png

xml切点方法配置事务

image.png
image.png
事务平台管理器,就是告诉Spring使用的是哪套api
image.png

实际上配置aop和配置 事务都差不多 都是通过 spring的aop来给某个类某个方法俗称切点,去用通知 去增强的,在这里配置事务,显然是和数据库相关的,所以除了你要增强的切点,外 还要配置平台事务管理器,就是让spring去管理数据库的事务,所以要在这里告诉spring你用的哪个jdbc(不同的持久化框架可能使用不同的jdbc),之后和aop的相关操作类似,都是让spring去给切点加上通知或者是事务,让spring去管理,最后将配置好的事务或者通知 增加到具体的类或方法上(就是织入)。

image.png
给叫transfer的方法设置单独的 事务属性配置,一个方法默认是一个事务,可以给该事务配置属于自己的默认参数配置

image.png
表示通配符 比如 update表示 update 开头的方法都使用这个事务配置

image.png

基于注解的声明式事务控制

image.png
给transfer加上 @Transactional注解即可让该方法使用注解

使用注解还需要在配置文件中加上注解的配置
image.png