• Spring框架


    1 Spring 框架

       Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。

      这些模块是:核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。比如:Core Container 中的 Core 组件是Spring 所有组件的核心,Beans 组件和 Context 组件是实现IOC和依赖注入的基础,AOP组件用来实现面向切面编程。

      Spring 4.x版本:

      目前最新的5.x版本中 Web 模块的 Portlet 组件已经被废弃掉,同时增加了用于异步响应式处理的 WebFlux 组件。

    • Spring Core: 基础,可以说 Spring 其他所有的功能都需要依赖于该类库。主要提供 IoC 依赖注入功能。
    • Spring Aspects : 该模块为与AspectJ的集成提供支持。
    • Spring AOP :提供了面向切面的编程实现。
    • Spring JDBC : Java数据库连接。
    • Spring JMS :Java消息服务。
    • Spring ORM : 用于支持Hibernate等ORM工具。
    • Spring Web : 为创建Web应用程序提供支持。
    • Spring Test : 提供了对 JUnit 和 TestNG 测试的支持。  

      Spring 官网列出的 Spring 的 6 个特征:

    • 核心技术 :依赖注入(DI),AOP,事件(events),资源,i18n,验证,数据绑定,类型转换,SpEL。
    • 测试 :模拟对象,TestContext框架,Spring MVC 测试,WebTestClient。
    • 数据访问 :事务,DAO支持,JDBC,ORM,编组XML。
    • Web支持 : Spring MVC和Spring WebFlux Web框架。
    • 集成 :远程处理,JMS,JCA,JMX,电子邮件,任务,调度,缓存。
    • 语言 :Kotlin,Groovy,动态语言。

    2 常见注解:

      @Controller:返回一个页面,传统springmvc,对应于前后端不分离的情况。

      @Controller + @ResponseBody:返回json或xml数据

      @RestController:返回json或xml数据,写入 HTTP 响应(Response)中,这种情况属于 RESTful Web服务,这也是目前日常开发所接触的最常用的情况(前后端分离)。

    3 Spring bean

      作用域:

    • singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
    • prototype : 每次请求都会创建一个新的 bean 实例。
    • request : 每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。
    • session : 每一次HTTP请求都会产生一个新的 bean,该bean仅在当前 HTTP session 内有效。
    • global-session: 全局session作用域,仅仅在基于portlet的web应用中才有意义,Spring5已经没有了。Portlet是能够生成语义代码(例如:HTML)片段的小型Java Web插件。它们基于portlet容器,可以像servlet一样处理HTTP请求。但是,与 servlet 不同,每个 portlet 都有不同的会话

      单例bean的线程安全

      问题:

      当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。

      解决方法:

      a 在Bean对象中尽量避免定义可变的成员变量(不太现实)。

      b 在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在 ThreadLocal 中(推荐的一种方式)。

      @bean与@component的区别

    1. 作用对象不同: @Component 注解作用于,而@Bean注解作用于方法
    2. @Component通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中(我们可以使用 @ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean告诉了Spring这是某个类的示例,当我需要用它的时候还给我。
    3. @Bean 注解比 Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册bean。比如当我们引用第三方库中的类需要装配到 Spring容器时,则只能通过 @Bean来实现。

      一个类声明为spring的注解的方式

      我们一般使用 @Autowired 注解自动装配 bean,要想把类标识成可用于 @Autowired 注解自动装配的 bean 的类,采用以下注解可实现:

    • @Component :通用的注解,可标注任意类为 Spring 组件。如果一个Bean不知道属于哪个层,可以使用@Component 注解标注。
    • @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
    • @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao层。
    • @Controller : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面

      bean的生命周期

      Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean

      简单理解:

      

      详细:

      

      

      Bean的完整生命周期经历了各种方法调用,这些方法可以划分为以下几类:

        1、Bean自身的方法:  

        这个包括了Bean本身调用的方法和通过配置文件中<bean>的init-method和destroy-method指定的方法

        2、Bean级生命周期接口方法:  

        这个包括了BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean这些接口的方法

        3、容器级生命周期接口方法:  

        这个包括了InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 这两个接口实现,一般称它们的实现类为“后处理器”。

        4、工厂后处理器接口方法:  

        这个包括了AspectJWeavingEnabler, ConfigurationClassPostProcessor, CustomAutowireConfigurer等等非常有用的工厂后处理器接口的方法。工厂后处理器也是容器级的。在应用上下文装配配置文件之后立即调用。

    4 spring框架中用到的设计模式

    • 工厂设计模式 : Spring使用工厂模式通过 BeanFactoryApplicationContext 创建 bean 对象。
    • 代理设计模式 : Spring AOP 功能的实现。
    • 单例设计模式 : Spring 中的 Bean 默认都是单例的。
    • 模板方法模式 : Spring 中 jdbcTemplatehibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
    • 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
    • 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
    • 适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller

    5 SpringMVC

      基于spring的mvc框架。

      后端项目分为 Service层(处理业务)、Dao层(数据库操作)、Entity层(实体类)、Controller层(控制层,返回数据给前台页面)。

      简单原理图:  

      工作原理:

      

      SpringMVC流程

        1、  用户发送请求至前端控制器DispatcherServlet。

        2、  DispatcherServlet收到请求调用HandlerMapping处理器映射器。

        3、  处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

        4、  DispatcherServlet调用HandlerAdapter处理器适配器。

        5、  HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

        6、  Controller执行完成返回ModelAndView。

        7、  HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

        8、  DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

        9、  ViewReslover解析后返回具体View。

        10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

        11、 DispatcherServlet响应用户。

      组件说明:

        以下组件通常使用框架提供实现:

          DispatcherServlet:作为前端控制器,整个流程控制的中心,控制其它组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性。

          HandlerMapping:通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。 

          HandlAdapter:通过扩展处理器适配器,支持更多类型的处理器。

          ViewResolver:通过扩展视图解析器,支持更多类型的视图解析,例如:jsp、freemarker、pdf、excel等。

        下边两个组件通常情况下需要开发:

          Handler:处理器,即后端控制器用controller表示。

          View:视图,即展示给用户的界面,视图中通常需要标签语言展示模型数据。

    6 spring、spring mvc、springboot

      Spring是使用基本的JavaBean代替EJB,通过容器管理JavaBean的配置和声明周期,在此基础上实现了AOP、IOC的Spring核心功能,其他web框架组件在AOP、IOC的基础上工作,将JavaBean交给Spring来管理。简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

      Spring MVC是基于spring的一个web应用的MVC框架,其实都是属于Spring,Spring MVC需要有Spring的架包作为支撑才能跑起来。

      spring boot只是一个配置工具,整合工具,辅助工具。Spring Boot实现了自动配置,降低了项目搭建的复杂度。它主要是为了解决使用Spring框架需要进行大量的配置太麻烦的问题,所以它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box)。Spring Boot只是承载者,辅助你简化项目搭建过程的。如果承载的是WEB项目,使用Spring MVC作为MVC框架,那么工作流程和你上面描述的是完全一样的,因为这部分工作是Spring MVC做的而不是Spring Boot。

      总结:

      Spring 最初利用“工厂模式”(DI)和“代理模式”(AOP)解耦应用组件。

      大家觉得挺好用,于是按照这种模式搞了一个 MVC框架(一些用Spring 解耦的组件),用开发 web 应用( SpringMVC )。

      然后发现每次开发都写很多样板代码,为了简化工作流程,于是开发出了一些“懒人整合包”(starter),这套就是 Spring Boot。

      所以,用最简练的语言概括就是:

        Spring 是一个“引擎”;

        Spring MVC 是基于Spring的一个 MVC 框架;

        Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。

  • 相关阅读:
    通过5G网络释放触觉互联网的力量
    架构师的主要职责和一些误区
    Codeforces 305E Playing with String
    hdu3949:XOR
    bzoj1923: [Sdoi2010]外星千足虫
    bzoj1013: [JSOI2008]球形空间产生器sphere
    bzoj1770: [Usaco2009 Nov]lights 灯
    一些还没有写的AC自动机题
    bzoj2553: [BeiJing2011]禁忌
    bzoj1030: [JSOI2007]文本生成器
  • 原文地址:https://www.cnblogs.com/Z-D-/p/12443302.html
Copyright © 2020-2023  润新知