spring知识点总结

spring5

1. 什么是spring

spring是一个轻量级的非入侵式java框架,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。

spring可以做很多事情,它为企业级开发提供了丰富的功能,但是这些功能的底层都依赖于它的俩个特性,也就是依赖注入(DI),和面向切面编程(AOP)

为了降低Java开发的复杂性,spring采取了以下四种策略

  • 基于pojo的轻量级和最小侵入性编程
  • 通过依赖注入和面向接口实现耦合
  • 基于切面和惯例进行声明式编程
  • 通过切面和模板减少板式代码

2. spring的优缺点

1.优点

  • 方便解耦,简化开发
  • AOP编程的支持
  • 声明式事务的支持
  • 方便程序的测试
  • 方便集成各种优秀的框架
  • 降低javaEE API的使用难度

2.缺点

  • spring依赖反射,反射影响性能
  • 使用门槛高,入门spring需要较长时间

3. spring由哪些模块组成

Spring 总共大约有 20 个模块。 而这些组件被分别整合在核心容器(Core Container)AOP(Aspect Oriented Programming)设备支持(Instrmentation)数据访问集成(Data Access/Integeration) 、 Web、 消息(Messaging) 、 Test等 6 个模块中。

架构图:
在这里插入图片描述

4. 什么是spring的控制反转IOC

控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法 描述的是:Java 开发领域对象的创建以及管理的问题。

spring IOC负责创建对象,管理对象(通过依赖注入DI),装配对象,配置对象,并且管理这些对象的整个生命周期。

例如:现有类 A 依赖于类 B

传统的开发方式 :往往是在类 A 中手动通过 new 关键字来 new 一个 B 的对象出来
使用 IoC 思想的开发方式 :不通过 new 关键字来创建对象,而是通过 IoC 容器(Spring 框架) 来帮助我们实例化对象。我们需要哪个对象,直接从 IoC 容器里面过去即可。
从以上两种开发方式的对比来看:我们 “丧失了一个权力” (创建、管理对象的权力),从而也得到了一个好处(不用再考虑对象的创建、管理等一系列的事情

为什么叫控制反转
控制 :指的是对象创建(实例化、管理)的权力
反转 :控制权交给外部环境(Spring 框架、IoC 容器)

1.控制反转有什么作用(ioc)

  • 管理对象的创建和依赖关系的维护.
  • 解耦,由容器去维护具体的对象
  • 托管了类的产生过程。

2.控制反转的优点

  • IOC 或 依赖注入把应用的代码量降到最低。
  • 它使应用容易测试,单元测试不再需要单例和JNDI查找机制。
  • 最小的代价和最小的侵入性使松散耦合得以实现。
  • IOC容器支持加载服务时的饿汉式初始化和懒加载。

3. spring的ioc实现机制

Spring 中的 IoC 的实现原理就是工厂模式加反射机制。

IOC思想基于IOC容器完成,IOC容器底层就是对象工程

spring提供IOC容器实现俩种方式:

  • BeanFactory:IOC容器基本实现,是spring内部的使用接口,不提供开发人员进行使用

    加载配置文件的时候不会创建对象的,在获取对象才去创建对象。

  • ApplicationContext:BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用学

​ 加载配置文件的时候就会把在配置文件对象进行创建

5.什么是依赖注入

控制反转IoC是一个很大的概念,可以用不同的方式来实现。其主要实现方式有两种:依赖注入和依赖查找.

依赖注入:即组件之间的依赖关系由容器在应用系统运行期来决定,也就是容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联组件之中。

1.有哪些不同类型的依赖注入实现方式?

依赖注入是时下最流行的IOC实现方式,依赖注入分为:setter注入,构造器注入主要流行的俩种方式

  • 构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
  • Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。

6. spring的Beans

Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中 的形式定义。

1. spring有几种配置元数据方式

  • XML配置文件
  • 基于注解的配置
  • 基于java的配置

2. spring基于xml注入bean的几种方式

  • set方法注入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YDSpJCXI-1626420408740)(C:\Users\lihuan\AppData\Roaming\Typora\typora-user-images\image-20210713104156925.png)]

  • 构造器注入

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gLM6ndRP-1626420408741)(C:\Users\lihuan\AppData\Roaming\Typora\typora-user-images\image-20210713104334875.png)]

3. spring的bean有俩种

  • 一种普通的bean:在配置文件中定义bean类型就是返回类型
  • 另一种是工厂bean(FactoryBean):在配置文件定义bean类型可以和返回类型不一样

4. springBean的作用域

spring的作用域有五种情况:

  • singleton:bean在每个Spring ioc容器中只有一个实例 加载配置文件的时候就会创建
  • prototype:一个bean的定义可以有多个实例 在调用getBean方法时候创建多实例对象
  • request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
  • session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。

注意: 缺省的Spring bean 的作用域是Singleton。使用 prototype 作用域需要慎重的思考,因为频繁创建和销毁 bean 会带来很大的性能开销

5. spring框架中的单例bean是线程安全的吗?

不是,Spring框架中的单例bean不是线程安全的。

spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。

6. spring Bean的生命周期

深究Spring中Bean的生命周期

7.什么是spring的自动装配

在spring中,在配置文件中设定bean的依赖关系是一个很好的机制,spring容器能够自动装配相互合作的bean,这意味着容器不需要配置,能通过bean工厂自动处理bean之间的协作。spring可以通过bean factory中注入的方式自动搞定bean之间的依赖关系。自动装配可以设置在每个bean上,也可以设定在特定的bean上。

8.基于注解管理Bean

基于Java的配置,允许你在少量的Java注解的帮助下,进行你的大部分Spring配置而非通过XML文件。

1.什么是注解:
  • 注解是代码特殊标记,格式:@注解名称(属性名称=属性值)
  • 使用注解,注解作用在类上面,方法上面,属性上面
  • 使用注解的目的:解化xml配置
2.开启注解装配

注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在Spring配置文件中配置 **<context:annotation-config/>**元素。

<context:component-scan base-package="com.bmkj.controller"/> -- 开启包扫描
3.@Component, @Controller, @Repository, @Service 有何区别?注入对象
  • @Component:这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。
  • @Controller:这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IoC 容器中。
  • @Service:此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图。
  • @Repository:这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。
4. 基于注解方式实现属性注入
  • @AutoWired:根据属性类型自动注入,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)
  • @Qualifier:当从在多个bean时,可以根据@Qualifier和@AutiWired通过制定应该装配哪个确切的bean
  • @Resource:默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。
  • @Value: 注入普通属性

7.什么是spring的AOP

AOP:Aspect oriented programming 面向切面编程,AOP 是 OOP(面向对象编程)的一种延续。
AOP 提出横向抽取机制,将横切逻辑代码和业务逻辑代码分离

在这里插入图片描述

1. AOP 用来解决什么:

在不改变原有业务逻辑的情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑l代码重复。

2.为什么叫面向切面编程

  • 切 :指的是横切逻辑,原有业务逻辑代码不动,只能操作横切逻辑代码,所以面向横切逻辑

  • 面 :横切逻辑代码往往要影响的是很多个方法,每个方法如同一个点,多个点构成一个面。这里有一个面的概念

3. aop如何实现的

AOP的实现关键在于代理模式,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ,动态代理则以Spring AOP为代表

  • AspectJ是静态代理的增强,所谓静态代理,就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强,他会在编译阶段将AspectJ(切面)织入到Java字节码中,运行的时候就是增强之后的AOP对象。
  • Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法
1. Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:
  • JDK动态代理只提供接口的代理,不支持类的代理。核心InvocationHandler接口和Proxy类,InvocationHandler 通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy利用 InvocationHandler动态创建一个符合某一接口的的实例, 生成目标类的代理对象。

  • 如果代理类没有实现 InvocationHandler 接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

4. Spring AOP里面的几个名词

  • 切面(aspect):切面是通知和切点的结合。通知和切点定义了切面的内容,可以普通类中以@Aspectj注解来实现
  • **连接点(Join point)😗*指方法,一个连接点代表一个方法的执行
  • **通知(Advice)😗*在AOP术语中,切面的工作被称为通知。
  • **切入点(Pointcut)😗*实际被增强的方法
  • 引入(introduction):引入允许我们向现有类添加新方法或属性
  • **目标对象:**被一个或者多个切面所通知的对象,它通常是一个代理对象。也称为被代理对象
  • **织入:**织入是把切面应用到目标对象并创建新的代理对象的过程。

5. Spring切面的通知有几种?

  • 前置通知(Before):在目标方法被调用之前调用通知功能;

  • 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;

  • 返回通知(After-returning ):在目标方法成功执行之后调用通知;

  • 异常通知(After-throwing):在目标方法抛出异常后调用通知;

  • 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。

8. spring事务

1.什么是事务

事务逻辑上就是一组操作,数据要么都成功,如果有一个失败所有操作都失败。

2.支持几种事务的方式

Spring支持编程式事务管理以及声明式事务管理两种方式。

  • **编程式事务管理:**编程式事务是侵入性事务管理。使用TransactionTemplate或者直接使用PlatformTransactionManager,对于编程式事务管理,Spring推荐使用TransactionTemplate。
  • **声明式事务管理:**声明式事务管理建立在AOP之上,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,执行完目标方法之后根据执行的情况提交或者回滚。

3. 声明式事务管理参数配置 @Transactional

1. 事务传播行为: propagation
  • PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务
  • PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
  • PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  • PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  • PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常
  • .PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  • PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价PROPAGATION_REQUIRED
2. 事务的隔离级别
  • Isolation.DEFAULT: 为数据源的默认隔离级别
  • **isolation=Isolation.READ_UNCOMMITTED:**读未提交
  • **isolation=Isolation.READ_COMMITTED:**读已提交
  • **isolation=Isolation.REPEATABLE_READ:**不可重复度
  • **isolation=Isolation.SERIALIZABLE:**串行化
3. timeout 超时时间

一定时间如果不提交,则进行事务的回滚

4. readOnly 是否只读

代表如果设置读,则只能做查询的操作。默认为false

5. rollbackFor

设置哪些异常进行事务回滚

6. noRollbackFor

设置出现哪些异常不进行事务回滚

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值