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方法。
Bean的管理方式
什么是Bean管理,就是Spring可以帮我们去创建对象(反射的技术), 那么管理的方式有哪些呢?
- 基于XML方式去管理对象(默认情况反射初始话对象的时候是执行的无参构造函数)
- 基于DI(依赖)的方式管理对象 2.1 基于对象属性的set方法实现 2.2 基于有参构造函数实现
- Set注入来管理对象
SpringBean 的作用域
-
什么是作用域呢?
就是设定Bean作用域是为单例还是多例。
-
在Bean作用域中单例和多例有什么区别呢?单例多例有什么区别呢?
作用域的区别:单例的作用域,就是每次在调用getBean获取对象都是同一个对象。 多例的作用域,每次在调用getBean方法获取对象都是新得对象。单例多例区别:单例:在同一个JVM中,该Bean对象只会创建一次。 多例:在同一个JVM中,该Bean对象可以被创建多次。(这里就可以说到一个缺点,比较占用内存) -
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的包装。