*简介

目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用

简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架

*注解

注解,可以看作是对一个 类或方法 的一个扩展的模版,每个 类或方法 按照注解类中的规则,来为其注解不同的参数,在用到的地方可以得到不同的 类或方法 中注解的各种参数与值。
从JDK5开始,java增加了对元数据(描述数据属性的信息)的支持。其实说白就是代码里的特殊标志,这些标志可以在编译,类加载,运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进行部署。

*解释AOP

面向切面的编程, 是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。

*Aspect 切面

AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能。比如,一个日志模块可以被称作日志的AOP切面。根据需求的不同,一个应用程序可以有若干切面。在Spring AOP中,切面通过带有@Aspect注解的类实现。

在Spring AOP 中,关注点和横切关注的区别是什么?

关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。
横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。

连接点

连接点代表一个应用程序的某个位置,在这个位置我们可以插入一个AOP切面,它实际上是个应用程序执行Spring AOP的位置。

通知

通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。
Spring切面可以应用五种类型的通知:

  • before:前置通知,在一个方法执行前被调用。
  • after: 在方法执行之后调用的通知,无论方法执行是否成功。
  • after-returning: 仅当方法成功完成后执行的通知。
  • after-throwing: 在方法抛出异常退出时执行的通知。
  • around: 在方法执行之前和之后调用的通知。

    切点

    切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。

    什么是引入?

    引入允许我们在已存在的类中增加新的方法和属性。

    什么是目标对象?

    被一个或者多个切面所通知的对象。它通常是一个代理对象。也指被通知(advised)对象。

    AOP

    所谓“切面”,简单地说,就是将那些与业务无关, 却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码, 降低模块间的耦合度,并有利于未来的可操作性和可维护性。
    使用“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点,业务处理的主要流程是核心关注点与之关系不大的部分是横切关注点。 横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。

    *控制反转

    Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一 个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。

    什么是Spring的依赖注入?

    依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。

    spring 常用的注入方式有哪些

    Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三 种:
  1. 构造方法注入

    1. <!--有构造方法注入-->
    2. <bean id="orders" class="com.xiaoihu.pojo.Orders">
    3. <!--使用constructor-arg完成属性注入-->
    4. <constructor-arg name="id" value="1000"/>
    5. <constructor-arg name="address" value="北京"/>
    6. <!-- index是指参数位置 0代表第一个参数-->
    7. <!-- <constructor-arg index="0" value="1000"/> -->
    8. </bean>
  2. setter注入

    1. <!--set方法注入-->
    2. <!-- 创建Bean对象-->
    3. <bean id="book" class="com.xiaoihu.pojo.Book">
    4. <!--使用property完成属性注入-->
    5. <property name="bname" value="Spring5"></property>
    6. <property name="bauthor" value="xiaoihu"></property>
    7. </bean>
  1. 基于注解的注入

    作用域

    singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例
    prototype:原型模式,每次通过容器的getBean方法获取 prototype定义的Bean时,都将产生一个新的Bean实例

    什么是bean的自动装配?

    Spring 容器能够自动装配相互合作的bean,这意味着容器不需要配置,能通过Bean工厂自动处理bean之间的协作。

    spring 自动装配 bean 有哪些方式?

    Spring容器负责创建应用程序中的bean同时通过ID来协调这些对象之间的关 系。作为开发人员,我们需要告诉Spring要创建哪些bean并且如何将其装配到一起。

    spring中bean装配有两种方式:

  • 隐式的bean发现机制和自动装配
  • 在java代码或者XML中进行显式配置

当然这些方式也可以配合使用。

可分为四种:

  • byName:按照bean的属性名称来匹配要装配的bean
  • byType:按照bean的类型来匹配要装配的bean
  • constructor:按照bean的构造器入参的类型来进行匹配
  • autodetect(自动检测):先使用constructor进行装配,如果不成功就使用byType来装配

说一下 spring 的事务隔离?

事务隔离级别指的是一个事务对数据的修改与另一个并行的事务的隔离程度, spring 有五大隔离级别,默认值为 ISOLATION_DEFAULT(使用数据库的设 置),其他四个隔离级别和数据库的隔离级别一致:
ISOLATION_DEFAULT:用底层数据库的设置隔离级别,数据库设置 的是什么我就用什么;
ISOLATION_READ_UNCOMMITTED未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读);
ISOLATION_READ_COMMITTED:提交读,一个事务提交后才能被其 他事务读取到(会造成幻读、不可重复读),SQL server 的默认级别;
ISOLATION_REPEATABLE_READ:可重复读,保证多次读取同一个数 据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交 的数据(会造成幻读),MySQL 的默认级别;
ISOLATION_SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。
当多个事务同时访问相同数据时,如果没有采取必要的隔离机制,就可能发生以下问题:
脏读 :表示一个事务能够读取另一个事务中还未提交的数据。比如, 某个事务尝试插入记录 A,此时该事务还未提交,然后另一个事务尝试读 取到了记录 A。
不可重复读 :~~是指在一个事务内,多次读同一数据。 ~~
幻读 :指同一个事务内多次查询返回的结果集不一样。比如同一个事 务 A 第一次查询时候有 n 条记录,但是第二次同等条件下查询却有 n+1 条记录,这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增或 者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容 被修改了,所有数据行的记录就变多或者变少了

spring事务什么时候会失效?

1、bean对象没有被spring容器管理
2、方法的访问修饰符不是public
3、自身调用问题
4、数据源没有配置事务管理器
5、数据库不支持事务
6、异常被捕获
7、异常类型错误或者配置错误

什么的是bean的自动装配,它有哪些方式?

  1. bean的自动装配指的是**bean的属性值在进行注入的时候通过某种特定的规则和方式去容器中查找**,**并设置到具体的对象属性中**,主要有五种方式:<br /> no 缺省情况下,自动配置是通过“ref”属性手动设定,在项目中最常用<br /> byName 根据属性名称自动装配。如果一个bean的名称和其他bean属性的名称是一样的,将会自装配它。<br /> byType 按数据类型自动装配,如果bean的数据类型是用其它bean属性的数据类型,兼容并自动装配它。<br /> constructor 在构造函数参数的byType方式。<br /> autodetect 如果找到默认的构造函数,使用“自动装配用构造”; 否则,使用“按类型自动装配”。

spring、springmvc、springboot的区别是什么?

  1. springspringMvc
  1. spring是一个一站式的轻量级的java开发框架,核心是控制反转(IOC)和面向切面(AOP),针对于开发的WEB层(springMvc)、业务层(Ioc)、持久层(jdbcTemplate)等都提供了多种配置解决方案;
  2. springMvc是spring基础之上的一个MVC框架,主要处理web开发的路径映射和视图渲染,属于spring框架中WEB层开发的一部分;

springMvc和springBoot:
1、springMvc属于一个企业WEB开发的MVC框架,涵盖面包括前端视图开发、文件配置、后台接口逻辑开发等,XML、config等配置相对比较繁琐复杂;
2、springBoot框架相对于springMvc框架来说,更专注于开发微服务后台接口,不开发前端视图,同时遵循默认优于配置,简化了插件配置流程,不需要配置xml,相对springmvc,大大简化了配置流程;
总结:
1、Spring 框架就像一个家族,有众多衍生产品例如 boot、security、jpa等等。但他们的基础都是Spring的ioc、aop等. ioc 提供了依赖注入的容器, aop解决了面向横切面编程,然后在此两者的基础上实现了其他延伸产品的高级功能;
2、springMvc主要解决WEB开发的问题,是基于Servlet 的一个MVC框架,通过XML配置,统一开发前端视图和后端逻辑;
3、由于Spring的配置非常复杂,各种XML、JavaConfig、servlet处理起来比较繁琐,为了简化开发者的使用,从而创造性地推出了springBoot框架,默认优于配置,简化了springMvc的配置流程;但区别于springMvc的是,springBoot专注于单体微服务接口开发,和前端解耦,虽然springBoot也可以做成springMvc前后台一起开发,但是这就有点不符合springBoot框架的初衷了;

反射机制

a) 在Java运行时环境中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法的功能称为反射。
b) Spring框架底层就是通过反射实现的。

Java反射机制主要提供了以下功能:

  • 在运行时判断任意一个对象所属的类。
  • 在运行时调用任意一个对象的方法。
  • 在运行时构造任意一个类的对象。
  • 在运行时判断任意一个类所具有的成员变量和方法。