Spring常见问题汇总

文章目录

  • Spring中的AOP
    • AOP的概念
    • 为什么需要AOP
    • AOP的分类
  • Spring中的IOC和DI
    • IOC的概念
    • IOC的优点
    • DI的概念
    • IOC与DI的关系
  • Spring是否支持配置多例对象
    • 单例、多例的使用场景
    • 单例、多例的配置方式
    • Spring中都用到了哪些设计模式

Spring中的AOP

AOP的概念

AOP (Aspect Orient Programming),直译过来就是 面向切面编程。AOP 是一种编程思想,是面向对象编程的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。

为什么需要AOP

AOP采用的是横向切面的方式,注入与主业务流程无关的功能,例如事务管理和日志管理。

Spring常见问题汇总_第1张图片

AOP的分类

AOP 要达到的效果是,保证开发者不修改源代码的前提下,去为系统中的业务组件添加某种通用功能。

按照 AOP 框架修改源代码的时机,可以将其分为两类:

  1. AspectJ 静态 AOP 实现, AOP 框架在编译阶段对程序源代码进行修改,生成了静态的 AOP代理类(生成的 *.class 文件已经被改掉了,需要使用特定的编译器)。

Spring常见问题汇总_第2张图片

  1. 动态 AOP 实现, AOP 框架在运行阶段对动态生成代理对象(在内存中以 JDK 动态代理,或 CGlib 动态地生成 AOP 代理类),如 SpringAOP。

Spring常见问题汇总_第3张图片

  • JDK动态代理:使用JDK动态代理,目标类必须实现的某个接口,如果某个类没有实现接口则不能生成代理对象。
  • CGLIB代理:Cglib原理是针对目标类生成一个子类,覆盖其中的所有方法,所以目标类和方法不能声明为final类型。

Spring中的IOC和DI

IOC的概念

IoC——Inversion of Control,即“控制反转”,不是技术,是一种设计思想。在Java开发中,IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

IOC的优点

使用IOC后,我们不需要自己去创建某个类的实例,而是交由IOC容器去创建;当我们需要使用某个对象时,直接到容器中去获取就可以了。

Spring常见问题汇总_第4张图片

DI的概念

DI——Dependency Injection(依赖注入)。创建被调用对象由Spring来完成,在容器实例化对象的时候主动的将被调用者注入给调用者,这样就产生为了“依赖注入”的概念,也就是"DI"。

IOC与DI的关系

其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物 Martin Fowler 又给出了一个新的名字:“依赖注入”,相对 IoC 而言,“依赖注入”明确描述了 “被注入对象依赖IoC容器配置依赖对象” 。

Spring是否支持配置多例对象

在Spring中,bean可以被定义为两种模式:prototype(多例)和singleton(单例)。所谓单例,就是所有的请求都由一个对象来进行处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理。

  • singleton:只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实例。不管new多少次,只生成一个对象。
  • prototype:对这个bean的每次请求都会创建一个新的bean实例,类似于new。

单例、多例的使用场景

当对象含有可改变的状态时(更精确的说就是在实际应用中该状态会改变),就使用多例,否则使用单例。例如dao和service这两层的数据一般不会有相应的属性修改,所以可以考虑用单例,而Controller层会存储很多需要操作的vo类(value object值对象),此时这个对象的状态就会被改变,就要使用多例。

单例、多例的配置方式



<bean id="user" class="..." scope="singleton"/>


<bean id="user" class="..." scope="prototype"/>

Spring中都用到了哪些设计模式

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

你可能感兴趣的:(Spring,spring,java)