谈一下Spring 5(上)

347 阅读4分钟

Tips

我会围绕着Spring中的大核心的IOC、AOP去展开话题。后续会说到声明式事务、注解的方式启动和Spring5新特性。

Spring 的一个基本概念

它是一个JavaEE开源的轻量级的框架。 何为轻量级,我们在开发的过程中,不需要去依赖一些比较复杂的jar包,只需要引入Spring 核心jar包,就能够实现我们Spring 的功能,底层是把一些复杂的业务逻辑封装好,提供API接口,只需要我们去使用,达到方便我们快速上手。它可以解决我们企业开发中遇到的难题,能够让编码更加简单以及减少代码的冗余性等。

核心组件

IOC:控制反转 核心接口:BeanFactory。

它是面向对象编程中的一种设计原则。把整个对象创建的过程与使用统一交给Spring去管理,底层使用到了反射、工厂模式、解析XML(这里的话可以去了解一下Dom4j)技术的实现。最常见的方式就是DI注入,也叫依赖注入。它的作用为了降低我们程序的耦合性

AOP:面向切面

可以理解为对我们的代码(功能)前后实现加强,常用到打印日志、拦截等。

谈一下BeanFactory(B)与Aplication(A)的区别

我们可以在IDEA选中(我这里随便选择的是B接口下面ClassPathXmlApplicationContext这个实现类)中通过crtl + alt + u查看类图。

B他是一个顶级的接口,并不是直接提供给我们开发人员去使用的,主要是提供给spring内部自己使用。

A是主要提供给我们开发者使用,A也是属于B下面的一个子接口,在B的基础上实现非常多的扩展功能

区别

通过B去加载配置文件的时候,不会根据配置文件内容去创建对象,当我们真正需要使用该对象的时候,才回去创建对象

通过A去加载配置文件的时候,会直接根据配置文件去创建对象,并且缓存起来。

用我自己的话来说,就是一个(A)立加载,与(B)延迟加载。

谈谈SpringBean

Spring中的Bean的类型有两种,第一种就是普通Bean,第二种就是工厂Bean(Factory Bean。)

普通Bean 与 工厂Bean 有哪些区别呢?

普通Bean:在配置文件中定义什么类型,就必须与返回类型保持一致。

工厂Bean:在配置文件中定义什么类型,可以与返回类型不一致。这里需要去实现FactoryBean,重写getObject方法。

image.png

Bean的管理方式

什么是Bean管理,就是Spring可以帮我们去创建对象(反射的技术), 那么管理的方式有哪些呢?

  1. 基于XML方式去管理对象(默认情况反射初始话对象的时候是执行的无参构造函数)
  2. 基于DI(依赖)的方式管理对象 2.1 基于对象属性的set方法实现 2.2 基于有参构造函数实现
  3. Set注入来管理对象

SpringBean 的作用域

  1. 什么是作用域呢?

    就是设定Bean作用域是为单例还是多例。

  2. 在Bean作用域中单例和多例有什么区别呢?单例多例有什么区别呢?

    作用域的区别: 单例的作用域,就是每次在调用getBean获取对象都是同一个对象。 多例的作用域,每次在调用getBean方法获取对象都是新得对象。

    单例多例区别: 单例:在同一个JVM中,该Bean对象只会创建一次。 多例:在同一个JVM中,该Bean对象可以被创建多次。(这里就可以说到一个缺点,比较占用内存)

  3. Spring默认是单例还是多例?为什么?

    Bean默认的情况下是单例的。单例它可以节约我们服务器的内存

SpringBean 的生命周期

说到Bean的生命周期,我们这里可以围绕着核心去讲解,就是Bean 的后置处理器,需要去实现BeanPostProcessor这个接口,可以在Init方法前后进行操作。小小扩展一下说一下Servlet 的生命周期。

Servlet的生命周期: 初始化后调用 init () 方法----------->调用 service() 方法来处理客户端的请求----------->销毁前调用 destroy() 方法-----------> 最后是由 JVM 的垃圾回收器进行垃圾回收的。

SpringBean的生命周期: 简单的可以分为:实例化----->属性去赋值----->Bean类中的init方法----->使用该对象----->容器关闭 详细一点:初始化对象(默认执行无参构造函数)----->对象属性赋值----->调用init方法----->使用Bean----->容器关闭(该对象会被销毁) 这里的话,我们可以在初始化前后进行代码增强操作,可以自定义后置处理器

说说Spring 与 SpringBoot 关系

我这里暂时就简单的说一下,SpringBoot他是直接采用注解化的方式启动的,底层也是依赖到了Spring/SpringMVC注解方式启动。可以说是做了一个针对Spring/SpringMVC的包装。