Java复习--Spring

Posted 赵jc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java复习--Spring相关的知识,希望对你有一定的参考价值。

Spring复习

使用Spring框架的好处是什么?

  • 控制反转:Spring通过控制反转实现了一定的解耦,通过依赖注入,而不是传统的创建对象
  • 面向切面编程(AOP):Spring支持面向切面编程,并把应用业务逻辑和系统服务分开
  • 容器技术:Spring包含并管理应用中对象的生命周期和配置
  • MVC框架:使用SpringMVC框架代传统的Web框架
  • 事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务
  • 异常处理:Spring提供方便的API把具体技术相关异常转换为一致的unchecked异常

什么是Spring IOC容器?

Spring框架的核心是Spring容器。容器创建对象,并将他们装备在一起,配置他们并管理他们的完整生命周期。Spring容器使用依赖注入来管理组成应用程序的组件。

IoC(IOC思想)

IoC (Inversion of Control,控制反转) ,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。只是因为该理论时间成熟相对较晚,并没有包含在GoF中。
系统中通过引入实现了IoC模式的IoC容器,即可由IoC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分离。
从使用上看,以前手动new对象,并设置对象中属性的方式,控制权是掌握在应用程序自身。现在则全部转移到了容器,由容器来统一进行管理对象。因为控制权发生了扭转,所以叫控制反转。
实现了IoC思想的容器就是IoC容器,比如:SpringFremework.

DI(依赖注入)

DI (Dependency Injection,依赖注入) 是实现IoC的方法之一。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
所以,依赖注入(DI)和控制反转(IoC)是从不同的角度的描述的同一件事情,就是指通过引入 IoC 容器,利用依赖关系注入的方式,实现对象之间的解耦。

初始化/注册Bean

方式一:类注解

在类上使用注解 @Controller (前端业务交互层), @Service(业务处理层) , @Repository(数据交互层DB) , @Component(注解) 。

方式二:@Bean

当前类被 Spring 扫描到时,可以在方法上使用@Bean注解,通过方法返回类型,也可以定义、注册Bean对象,默认使用方法名作为Bean的名称。

注入指定的Bean:@Qualifier

方式三:@Configuration

在类被Spring扫描到时,使用@configuration 注解,可以注册一个配置类到容器中。配置类一般用来自定义配置某些资源。之后会在SpringMVC中用到。

方式四:FactoryBean接口

什么是依赖注入?依赖注入的方式有哪几种?

在依赖注入时,不必创建对象,但必须描述如何创建他们。使用的时候有IOC容器将他们组装在一起
通常,依赖注入可以通过以下几种方式去完成

属性注入(@Autowrid)

当前类被 Spring 扫描到时,可以在属性上使用**@Autowrid**注解,会将容器中的Bean对象装配进来。

setter注入

也可以在setter方法上使用@Autowrid注解:说明:其实只要写在方法上的 @Autowrid注解,都会将容器中的Bean对象注入方法参数,setter注入本质也是这样,只是setter方法一般都是设置属性用的,所以也归到属性注入。

构造方法注入

当前类被 Spring 扫描到时,可以在构造方法上使用@Autowrid注解(也可以不加@Autowrid注解),作用和setter类似,会将容器中的Bean对象注入方法参数。

setter注入和构造方法注入的区别

Bean的作用域

Spring 容器在初始化一个 Bean 的实例时,同时会指定该实例的作用域。Spring有6个作用域,最后四种是基于Spring WebMVC生效,可用scope()指定使用某个作用域。

  • singleton(单例模式,只创建一个对象)

描述:该作用域下的Bean在IoC容器中只存在一个实例:获取Bean(即通过applicationContext.getBean等方法获取)及装配Bean(即通过@Autowired注入)都是同一个对象。
场景:通常无状态的Bean使用该作用域。无状态表示Bean对象的属性状态不需要更新
备注Spring默认选择该作用域

  • prototype(每一个对象创建一个Bean)

描述:每次对该作用域下的Bean的请求都会创建新的实例:获取Bean(即通过applicationContext.getBean等方法获取)及装配Bean(即通过@Autowired注入)都是新的对象实例。
场景:通常有状态的Bean使用该作用域

  • request

描述:每次http请求会创建新的Bean实例,类似于prototype
场景:一次http的请求和响应的共享Bean
备注:限定SpringMVC中使用

  • session

描述:在一个http session中,定义一个Bean实例
场景:用户回话的共享Bean, 比如:记录一个用户的登陆信息
备注:限定SpringMVC中使用

  • application(了解)

描述:在一个http servlet Context中,定义一个Bean实例
场景:Web应用的上下文信息,比如:记录一个应用的共享信息
备注:限定SpringMVC中使用

  • websocket(了解)

描述:在一个HTTP WebSocket的生命周期中,定义一个Bean实例
场景:WebSocket的每次会话中,保存了一个Map结构的头信息,将用来包裹客户端消息头。第一
次初始化后,直到WebSocket结束都是同一个Bean。
备注:限定Spring WebSocket中使用

Bean的生命周期

生命周期概览

Spring容器中Bean的生命周期,类似于流水线上制造一辆汽车,一台电脑,将繁多的工序流水线化、流程化以后,才可以方便的管理,如生产电脑经历了组装CPU,主板,显卡等等工序,需要在安装CPU以前检查是否有美国的监听器,就可以方便的到具体的流水线上某个点执行。Bean对象生命周期也是如此。

总结
对于Bean的生命周期,主要步骤为:

  1. 实例化Bean:通过反射调用构造方法实例化对象(字节流转换为内存对象)。
  2. 依赖注入:装配Bean的属性
  3. 实现了Aware接口的Bean,执行接口方法:如顺序执行BeanNameAware、BeanFactoryAware、
    ApplicationContextAware的接口方法。
  4. Bean对象初始化前,循环调用实现了BeanPostProcessor接口的预初始化方法
    (postProcessBeforeInitialization)
  5. Bean对象初始化:顺序执行@PostConstruct注解方法、InitializingBean接口方法、init-method
    方法
  6. Bean对象初始化后,循环调用实现了BeanPostProcessor接口的后初始化方法
    (postProcessAfterInitialization)
  7. 容器关闭时,执行Bean对象的销毁方法,顺序是:@PreDestroy注解方法、DisposableBean接口
    方法、destroy-method

补充说明:第一步的实例化是指new对象,Spring的语义中说初始化Bean包含Bean生命周期中的初始
化步骤。

什么是AOP?

AOP面向切面编程。

  • 要理解切面编程,就需要先理解什么是切面。用刀把一个西瓜分成两瓣,切开的切口就是切面;编程中,对象与对象之间,方法与方法之间,模块与模块之间都是一个个切面。
  • AOP(Aspect Oriented
    Programming)称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等。
  • AOP利用一种称为"横切"的技术,将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。
  • 使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。
  • 横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

AOP的使用场景

对以上统一业务来说,常见的切面业务如:

  • 响应统一的数据格式
  • 统一异常处理
  • 统一日志记录,如跟踪用户访问信息
  • 用户统一会话管理、权限管理
  • 方法执行时间计算
  • 事务管理
  • 其他

对于使用AOP技术来说,解决的最大问题就是对横切业务的统一管理:

  • 横切代码的高度复用,和业务代码互相独立,满足代码设计上的高内聚低耦合
  • 系统更好的扩展性,可维护性

AOP有哪些实现方式?

实现AOP的技术,主要分为两大类:
静态代理-指使用AOP框架提供的命令进行编译,从而在编译阶段就可生成AOP代理类,因此也称为编译时增强;

  • 编译时编织(特殊编译器实现)
  • 类加载时编织(特殊的类加载器实现)

动态代理-在运行时在内存中“临时"生成AOP动态代理类,因此也被称为运行时增强。

  • JDK动态代理:通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。
  • CGLIB动态代理:如果目标类没有实现接口,那么spring AOP会选择使用CGLIB来动态代理目标类。

Spring怎么解决循环依赖

spring对循环依赖的处理有三种情况:

  • ①构造器的循环依赖:这种依赖spring是处理不了的,直接抛出BeanCurrentlylnCreationException异常。
  • ②单例模式下的setter循环依赖:通过“三级缓存”处理循环依赖。
  • ③非单例循环依赖:无法处理。

为什么要使用Spring Boot

SpringBoot对上述Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。

在使用Spring框架进行开发的过程中,需要配置很多Spring框架包的依赖,如spring-core、spring-bean、spring-context等,而这些配置通常都是重复添加的,而且需要做很多框架使用及环境参数的重复配置,如开启注解、配置日志等。Spring Boot致力于弱化这些不必要的操作,提供默认配置,当然这些默认配置是可以按需修改的,快速搭建、开发和运行Spring应用。

以下是使用SpringBoot的一些好处:

  • 自动配置,使用基于类路径和应用程序上下文的智能默认值,当然也可以根据需要重写它们以满足开发人员的需求。
  • 创建Spring Boot Starter项目时,可以选择选择需要的功能,Spring Boot将为你管理依赖关系
  • SpringBoot项目可以打包成jar文件。可以使用Java-jar命令从命令行将应用程序作为独立的Java应用程序运行。
  • 在开发web应用程序时,springboot会配置一个嵌入式Tomcat服务器,以便它可以作为独立的应用程序运行。(Tomcat是默认的,当然你也可以配置Jetty或Undertow)
  • SpringBoot包括许多有用的非功能特性(例如安全和健康检查)。

以上是关于Java复习--Spring的主要内容,如果未能解决你的问题,请参考以下文章

java之Spring实现控制反转

Spring框架知识复习之一

Java复习总结思维导图

Java复习总结思维导图

Java复习--Spring

Java复习--Spring