Spring笔记

1.Spring 简介

写在开头,我只是一个初级到不能再初级的小菜鸟,如有错误请尽管指出~~
感谢各位大牛.

1.1 概述

1.1.1 为什么要用框架?

当一个方法中有部分代码在不断重复时,抽取出来弄成一个方法;
当很多类在操作同一段代码时,可以抽出来单独做一个类;
当很多类在做同一类事情的时候,可以抽出来作为一个jar包或做成框架;

这就是框架
替程序猿完成一部分代码,从而提高开发效率…

1.2 概念

Spring是分层的JavaSE及JavaEE应用于全栈的轻量级开源框架
以IoC(控制反转/反转控制)和AOP(面向切面编程)为核心
提供了表面层(SpringMVC)和持久层(SpringJDBC)以及业务层事务管理等众多模块的企业级应用技术.

Spring的本质是管理软件中的对象,即创建对象维护对象之间的关系;

1.2.1 优势

1.方便解耦,简化开发(低嵌入式设计)
通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的程序耦合;
2.AOP编程的支持
通过Spring的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP(面向对象编程)实现的功能可以通过AOP轻松应付.
3.声明式事务的支持
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理,提高开发效率和质量
4.方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作…
5.方便集成各种优秀框架
Spring可以降低各种框架的使用难度,提供了对各种优秀框架(Struts/Hibernate/Hessian/Quartz等)的直接支持…
6.降低JavaEE API的使用难度
Spring对 JavaEE API(如 JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些API 的使用难度大为降低。

一句话概括一下:
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架);

1.2.2 组成

在这里插入图片描述

1.3 Spring容器中的Bean

开发者:使用Spring框架主要是做两件事:1.开发Bean,,2.配置Bean..
对于Spring框架来说,他要做的就是根据配置文件来创建Bean实例,
并调用Bean实例的方法完成依赖注入..

容器中Bean的作用域
当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域…Spring支持以下几种作用域:
1.singleton:单例模式…
在整个Spring IoC容器中,singleton作用域得Bean将只生成一个实例.
bean标签中加入:

singleton="false"
scope="prototype"

2.prototype:每次通过容器的getBean()方法获取prototype作用域时,都将产生于一个新的Bean实例(多例模式)
3.request:在Web应用中使用Spring时,该作用域才有效;
4.session:该作用域将Bean的定义限制为HTTP会话,只在web-aware Spring ApplicationContext的上下文中有效

综上::如果不指定Bean的作用域,Spring默认使用singleton作用域,且尽量使用singleton作用域进行单例创建~

1.4 创建Bean的3种方式

1.使用构造器创建Bean实例
使用构造器创建Bean实例是最常见的情况,吐过不采用构造注入,Spring底层会调用Bean类的无参构造器来创建实例.因此要求Bean类提供无参的构造器.

采用默认的构造器创建Bean实例,Spring对Bean实例的所有属性执行默认初始化,即所有基本类型的值初始化为0或false,所有引用类型的值初始化为null…

2.使用静态工厂方法创建Bean
使用静态工厂方法创建Bean实例时class属性也必须指定,但此时class属性并不是指定Bean实例的实现类,而是静态工厂类…Spring通过该属性知道由哪个工厂类来创建Bean实例…

还需要使用factory-method属性来指定静态工厂方法,Spring将调用静态工厂方法返回一个Bean实例,一旦获得了指定Bean实例,Spring后面的处理步骤与采用普通方法创建Bean实例完全一样…

3.调用实例工厂方法创建Bean

2 Spring Boot

2.1 概念

emmm…Spring Boot是一个脚手架(而非框架),构建于Spring框架(Framework)基础之上,基于快速构建理念,提供了自动配置功能,可实现其开箱即用特性(创建完一个基本的项目以后,可零配置或者少量配置即可运行我们的项目),其核心主要有如下几个方面:

  • 起步依赖(Starter Dependency)。

  • 自动配置(Auto Configuration)。

  • 健康检查(Actator)-监控。

2.2 SpringBoot工厂在启动时会做什么?

–1…通过线程调用相关API 从指定路径查找相关的配置文件,class文件;
–2…调用IO对象从磁盘中读取文件(将文件内容读到内存::因为CPU只能从内存取数据);
–3…检测类是否有特定注解描述;
–4…Spring框架基于工厂对象(BeanFactory)为指定class创建其实例对象,基于配置文件的描述,对这些对象进行初始化操作;
–5…将对象存储到Spring框架管理的池中(Bean池)-其底层设计在这里是个Map;

2.3 一些SpringBoot中的注解

  • Component注解::
    是Spring中用于描述Bean类的一个注解。
    用于告诉Spring这个类的实例由Spring创建,当此对象由Spring创建和管理时,默认会将对象存储到池(Bean池)中。通俗来讲::ComponentScan做的事情就是告诉Spring从哪里找到bean;

  • @SpringBootTest注解::
    用于告诉spring框架,此测试类交给Spring管理。

  • @Autowired注解
    该描述属性时,用于告诉spring框架要为此属性注入一个值

  • @Qualifier(“name”)注解::
    配合@Autowired使用,
    用于指定将哪个bean的名字对应的对象–注入给描述的属性
    默认的名字为对应Bean名字的首字母小写…

  • @Lazy注解:
    用来描述类,spring管理的bean对象可以让bean延迟构建和初始化

  • @Scope注解
    描述类时用于指定类实例的作用域(默认单例)
    单例:默认情况下单例:singleton,通常会配合@Lazy使用,因为单例默认直接创建,spring框架不仅负责创建,还会把创建的bean存储到bean池中,运行结束自动销毁;
    多例:@Scope(“prototype”)::多例何时需要何时创建,spring框架不负责销毁 ,因为多例模式需要时才创建,所以不会配合@Lazy使用;

  • @PostConstruct注解::
    描述方法,生命周期初始化方法
    这样的方法中,通常会对创建好的对象再次进行一些初始化操作;

  • @PreDestroy注解::
    描述方法,生命周期销毁方法
    此方法会在对象销毁之前执行,实现资源销毁操作;

2.4 一点儿小拓展

2.4.1 Spring框架管理bean对象的优势?

Spring是一个资源整合框架(FrameWork),通过Spring可以将很多资源(自己写的对象或第三方提供的对象)整合在一起,然后进行应用和对外服务…Spring框架可以为由它管理的对象提供懒加载策略,作用域,生命周期方法,以实现对象对系统资源的有效使用…同时Spring还可以基于用户设计管理对象与对象之间的依赖关系,从而降低耦合,提高程序的可维护性和可扩展性…

2.4.2 @Autowired和@Qualifier注解的应用和作用?

@Autowired由spring框架定义,用于描述类中属性或相关方法。Spring框架在项目运行时如果发现由他管理的Bean对象中有使用@Autowired注解描述的属性或方法,可以按照指定规则为属性赋值(DI)。
其基本规则是:首先要检测容器中是否有与属性或方法参数类型相匹配的对象,假如有并且只有一个则直接注入。其次,假如检测到有多个,还会按照@Autowired描述的属性或方法参数名查找是否有名字匹配的对象,有则直接注入,没有则抛出异常。最后,假如我们有明确要求,必须要注入类型为指定类型,名字为指定名字的对象还可以使用@Qualifier注解对其属性或参数进行描述(此注解必须配合@Autowired注解使用)。

3 Spring MVC

3.1 Spring MVC工作流程(一)

1.用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;

2.DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)
4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息

数据转换:对请求消息进行数据转换。如String转换成Integer、Double等

数据格式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等

数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
5. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
6. 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
7. ViewResolver 结合Model和View,来渲染视图
8. 将渲染结果返回给客户端。

3.2 Spring MVC工作流程(二)

其实上面那一大堆,我自己看着都头大…
所以做了个小总结::

  • Dao层 :全称 Data Access Object. Dao层比较底层,负责与数据库打交道具体到对某个表/某个实体的增删改查…

  • Service层 : 叫做业务层或服务层,封装Dao层的操作,使一个方法对外表现为实现一种功能,例如网购生成订单时,不仅要插入订单信息记录,还要查询商品库存是否充足,购买是否超过限制等…

  • Controller层 :业务控制层,负责接收数据和请求,并且调用Service层实现这个业务逻辑…

一个小类比
Controller层像是一个服务员,他把客人(前端)点的菜(数据//请求的类型等等)进行汇总,什么口味//咸淡//量的多少,交给厨师长(Service层),厨师长则告诉案板厨师(Dao1)//汤料房(Dao2)//配菜厨师(Dao3)等等(统称为Dao层)我需要什么样的半成品,副厨们(Dao层)就负责完成厨师长(Service)交代的任务…

3.3 注解

注解留到下一篇文章来写./.啊哈哈哈
我只是把一些比较常见的注解拿出来说,…

4 SpringBoot 和 SpringMVC区别

SpringMVC开箱即用
resources中application.properties的优先级高于.yml文件

作用域–可以指定test测试阶段,可以指定compile完整阶段
待完善…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值