zoukankan      html  css  js  c++  java
  • Spring 知识点整理

    IOC 原理

    所谓 IoC(控制反转),对于 Spring 框架来说,就是由 Spring 来负责控制对象的生命周期和对象间的关系。

    DI(依赖注入)是 IOC 的实现方式,Spring 是通过 Java 反射来实现 DI 的。

    以前是由 Java 程序员负责对象的生命周期和对象关系,现在这些都由 Spring 控制,控制权被反转了,故而称控制反转(IOC)。

    衍生一下,Java 虚拟机搞定了内存的分配与回收问题;Spring 框架搞定了对象的管理问题。现在 Java 程序员只用关注业务逻辑了。

    AOP 原理

    AOP(面向切面编程),是 OOP(面向对象编程)的补充和完善。

    什么是面向切面编程?这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。

    实现 AOP 的技术,主要分为两大类:

    • 一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;

    • 二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。

    Spring 采用动态代理织入,而 AspectJ 采用编译器织入和类装载期织入。

    Spring AOP 使用了两种动态代理机制:

    • 一种是基于 JDK 的动态代理

    • 一种是基于 CGLib 的动态代理。

    JDK1.3 以后,java 提供了动态代理技术,允许开发者在运行期间动态的创建接口的代理实例,JDK 的动态代理主要涉及到 java.lang.reflect 包中的两个类:Proxy 和 InvocationHandler。

    简单的说,Spring Aop 是基于 JDK 动态代理实现的。

    BeanFactory 与 ApplicationContext 的区别

    BeanFactory 和 ApplicationContext 是 Spring 的两大核心接口,都可以当做 Spring 的容器。其中 ApplicationContext 是 BeanFactory 的子接口, 包含 BeanFactory 的所有特性,它的主要功能是支持大型的业务应用的创建。

    BeanFactory

    是 Spring 里面最底层的接口,包含了各种 Bean 的定义,读取 bean 配置文档,管理 bean 的加载、实例化,控制 bean 的生命周期,维护 bean 之间的依赖关系。

    ApplicationContext

    是 BeanFactory 的派生,除了提供 BeanFactory 所具有的功能外,还提供了更完整的框架功能:

    • 继承 MessageSource,因此支持国际化。

    • 统一的资源文件访问方式。

    • 提供在监听器中注册 bean 的事件。

    • 同时加载多个配置文件。

    • 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的 web 层。

    区别一:bean 的加载方式

    BeanFactroy 采用的是延迟加载形式来注入 Bean 的,即只有在使用到某个 Bean 时(调用getBean()),才对该 Bean 进行加载实例化。

    ApplicationContext,它是在容器启动时,一次性创建了所有的 Bean。这样,在容器启动时,我们就可以发现 Spring 中存在的配置错误,这样有利于检查所依赖属性是否注入。

    相对于基本的 BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置 Bean 较多时,程序启动较慢。

    区别二:创建方式

    BeanFactory 通常以编程的方式被创建,ApplicationContext 还能以声明的方式创建,如使用 ContextLoader。

    区别三:注册方式

    BeanFactory 和 ApplicationContext 都支持 BeanPostProcessor、BeanFactoryPostProcessor 的使用,但两者之间的区别是:BeanFactory 需要手动注册,而 ApplicationContext 则是自动注册。

    简言之,当我们说 Spring 容器,指的就是 ApplicationContext 容器。

    FactoryBean 和 BeanFactory 区别

    BeanFactory 是一个 Factory,也就是 IOC 容器或对象工厂,FactoryBean 是个 Bean。

    在 Spring 中,所有的 Bean 都是由 BeanFactory(也就是IOC容器)来进行管理的。但对 FactoryBean 而言,这个 Bean 不是简单的 Bean,而是一个能生产或者修饰对象生成的工厂 Bean, 它的实现与设计模式中的工厂模式和修饰器模式类似。

    Spring 提供了一个 org.springframework.bean.factory.FactoryBean 的工厂类接口,用户可以通过实现该接口定制实例化Bean的逻辑。FactoryBean 接口对于 Spring 框架来说占用重要的地位,Spring 自身就提供了 70 多个 FactoryBean 的实现。它们隐藏了实例化一些复杂 Bean 的细节,给上层应用带来了便利。从 Spring3.0 开始,FactoryBean 开始支持泛型,即接口声明改为 FactoryBean 的形式。

    Spring Aop 代理选择

    Spring 会自动在 JDK 动态代理和 cglib 之间转换。具体选择方式如下:

    • 如果目标对象实现了接口 默认用 JDK 动态代理。

    • 如果目标对象实现了接口,可以强制使用 cglib。

    • 如果目标对象没有实现接口,必须采用 cglib 库。

    Spring Aop 配置方式

    可以通过在 Spring 的 XML 配置文件 applicationContext.xml 或者基于注解方式来配置 AOP。

    XML 配置方式

    在 applicationContext.xml 配置文件中配置 AOP,所有配置都在 <aop:config > 命名空间内,其中可以通过 aspect 或者 advisor 两种方式来配置,二者是等价的。

    基于注解的配置方式

    注解配置 AOP(使用 AspectJ 类库实现的),大致分为三步:

      1. 使用注解 @Aspect 来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before, @AfterReturning,@After,@AfterThrowing,@Around).
      1. 开发需要被拦截的类。
      1. 将切面配置到 xml 中,当然,我们也可以使用自动扫描 Bean 的方式。这样的话,那就交由 Spring AoP 容器管理。

    另外需要引用 aspectJ 的 jar 包: aspectjweaver.jar aspectjrt.jar 。

    Spring Aop 实现模式

    Spring Aop 采用动态代理的方式实现,即 JDK 动态代理和 CgLib 动态代理。

    JDK 动态代理和 CgLib 动态代理的主要区别

    JDK 动态代理只能针对实现了接口的类的接口方法进行代理

    CgLib 动态代理基于继承来实现代理,所以无法对 final 类、private 方法和 static 方法实现代理。

    Spring 声明式事务

    Spring 的事务机制包括声明式事务和编程式事务。

    • 编程式事务管理:Spring 推荐使用 TransactionTemplate,实际开发中使用声明式事务较多。

    • 声明式事务管理:将我们从复杂的事务处理中解脱出来,获取连接,关闭连接、事务提交、回滚、异常处理等这些操作都不用我们处理了,Spring都会帮我们处理。

    声明式事务管理使用了 AOP 实现的,本质就是在目标方法执行前后进行拦截。在目标方法执行前加入或创建一个事务,在执行方法执行后,根据实际情况选择提交或是回滚事务。

    声明式事务优点:不需要在业务逻辑代码中编写事务相关代码,只需要在配置文件配置或使用注解(@Transaction),这种方式没有侵入性。

    声明式事务缺点:声明式事务的最细粒度作用于方法上,如果像代码块也有事务需求,只能变通下,将代码块变为方法。

    事务属性包含五个方面:隔离级别、传播行为、回滚规则、事务超时、只读。

    使用方式:在需要实现事务的方法上添加 @Transactional 注解。通过调用 transactionManager 的 commit() 和 rollback() 实现事务提交和回滚。

    参考文章:https://blog.csdn.net/yuanlaijike/article/details/91909069

    Spring 设计模式

    Spring 中经典的 9 种设计模式:

    1.简单工厂(非23种设计模式中的一种)
    2.工厂方法
    3.单例模式
    4.适配器模式
    5.装饰器模式
    6.代理模式
    7.观察者模式
    8.策略模式
    9.模版方法模式

    具体参考文章:https://zhuanlan.zhihu.com/p/114244039

    每天学习一点点,每天进步一点点。

  • 相关阅读:
    [程序员代码面试指南]栈和队列-单调栈结构(单调栈)
    快学Scala第一部分
    Add Digits
    Nim Game
    将分布式中多台节点的日志信息集中到一个节点上
    Eclipse调试的一些小技巧
    Maven的常用命令
    Eclipse插件本地扩展安装
    Spark应用程序的运行框架
    Spark运行各个时间段的解释
  • 原文地址:https://www.cnblogs.com/youcoding/p/15183749.html
Copyright © 2011-2022 走看看