Spring

本文详细介绍了Spring框架的核心概念,包括其设计目标、优缺点、依赖注入(IOC)的实现机制和优势。讨论了Spring的Bean工厂和ApplicationContext的区别,以及不同类型的事件。此外,还涵盖了Spring的AOP、Bean的生命周期、注解使用和数据访问管理。最后,文章探讨了Spring中涉及的设计模式,如简单工厂、单例、代理、模板方法等。
摘要由CSDN通过智能技术生成

写在开始:
Spring : 春天 —>给软件行业带来了春天
2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架。
本篇笔记主要从Spring, IoC, AOP, Bean, 和Spring数据访问几个方面回顾Spring的部分知识点,篇幅比较长,内容比较细,可用于平时面试题复习等!

一. Spring概述

Spring是什么?

Spring是一个轻量级Java开发框架,最早有Rod Johnson创建;目的解决企业级应用开发的业务逻辑层和其他层耦合问题.
依赖注入(dependency injection,DI)面向切面编程(aspect-oriented programming,AOP)
为了降低Java开发的复杂性,Spring采取了以下4种关键策略

  • 基于POJO的轻量级和最小侵入性编程;
  • 通过依赖注入和面向接口实现松耦合;
  • 基于切面和惯例进行声明式编程;
  • 通过切面和模板减少样板式代码。
Spring框架设计目标,理念,核心

Spring设计目标: 一站式(full-stack)轻量级应用开发平台
设计理念: 支持POJO和JavaBean开发方式,使应用面向接口开发,充分支持OO(面向对象)设计方法;
通过IoC容器实现对象耦合关系的管理,并实现依赖反转,将对象之间的依赖关系交给IoC容器,实现解耦;
核心: 通过IoC容器管理POJO对象以及他们之间的耦合关系;通过AOP以动态非侵入的方式增强服务。

Spring优缺点:
  • 方便解耦,简化开发 (Spring大工厂,将所有对象的创建和依赖关系的维护交给Spring管理)
  • AOP编程的支持 (面向切面编程,方便的实现对程序进行权限拦截、运行监控等)
  • 声明式事务的支持 (通过配置就可以完成对事务的管理)
  • 方便程序的测试 (对Junit4支持,可以通过注解方便的测试)
  • 方便集成各种优秀框架 (如:Struts、Hibernate、MyBatis等)
  • 降低JavaEE API的使用难度 (一些API [JDBC、JavaMail、远程调用等],都提供了封装,应用难度降低)

缺点: 感觉大而全,依赖反射,反射影响性能; 门槛升高
Spring价值:
Spring是非侵入式的框架,目标是使应用程序代码对框架依赖最小化;
Spring提供一个一致的编程模型,使应用直接使用POJO开发,与运行环境隔离开来;
Spring推动应用设计风格向面向对象和面向接口开发转变,提高了代码的重用性和可测试性;
Spring模块:
image.png
Spring 5 的模块结构图:

  • spring core:核心类库. 提供了框架的基本组成部分,包括控制反转(Inversion ofControl,IOC)和依赖注入(Dependency Injection,DI)功能。
  • spring beans:提供了BeanFactory,是工厂模式的一个经典实现,Spring将管理对象称为Bean。
  • spring context:构建于 core 封装包基础上的 context 封装包,提供了一种框架式的bean对象访问方法。
  • spring jdbc:提供了一个JDBC的抽象层,消除了烦琐的JDBC编码和数据库厂商特有的错误代码解析, 用于简化JDBC。
  • spring aop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等。
  • spring Web:提供了针对 Web 开发的集成特性,例如文件上传,利用 servlet listeners 进行 ioc 容器初始化和针对 Web 的 ApplicationContext。
  • spring test:主要为测试提供支持的,支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试。

核心容器(Core Container) 、
AOP(Aspect Oriented Programming)和设备支持(Instrmentation) 、
数据访问与集成(Data Access/Integeration) 、
Web 、
消息(Messaging) 、
Test 等 6个 模块中

Spring 框架中都用到了哪些设计模式
  1. 简单工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;根据传入唯一的标识获得bean对象.
  2. 单例模式:Bean默认为单例模式。‘scope=singleton’ 注册式单例模式,单例存放在Map中,k=bean name v=bean
  3. 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
  4. 模板方法:用来解决代码重复的问题。比如. RestTemplate,JmsTemplate, JpaTemplate。jdbcTemplate里的execute方法把整个算法步骤都定义好了;
  5. 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现–事件监听器:ApplicationListener,该接口继承了 EventListener 接口,JDK 建议所有的事件监听器都应该继承EventListener。spring 事件:ApplicationEvent,该抽象类继承了EventObject 类,JDK 建议所有的事件都应该继承自 EventObject。
    6.工厂模式: Spring 中的 FactoryBean 就是典型的工厂方法模式,实现了 FactoryBean 接口的 bean是一类叫做 factory 的 bean。其特点是,spring 在使用 getBean() 调用获得该 bean 时,会自动调用该 bean 的 getObject() 方法,所以返回的不是 factory 这个 bean,而是这个 bean.getOjbect()方法的返回值。
    7.原型模式: scope = prototype ,每次都是通过克隆生成新实例,修改时对原有实例对象无影响;
    8.迭代器模式: 在 Spring 中有个 CompositeIterator 实现了 Iterator,Iterable 接口和 Iterator 接口,这两个都是迭代相关的接口。可以这么认为,实现了 Iterable 接口,则表示某个对象是可被迭代的。Iterator 接口相当于是一个迭代器,实现了 Iterator 接口,等于具体定义了这个可被迭代的对象时如何进行迭代的。
    9.适配器模式:Spring 中的 AOP 中 AdvisorAdapter 类,它有三个实现:MethodBeforAdviceAdapter、AfterReturnningAdviceAdapter、ThrowsAdviceAdapter。Spring会根据不同的 AOP 配置来使用对应的 Advice,与策略模式不同的是,一个方法可以同时拥有多个Advice。Spring 存在很多以 Adapter 结尾的,大多数都是适配器模式。
    10.责任链模式: DispatcherServlet 中的 doDispatch() 方法中获取与请求匹配的处理HandlerExecutionChain,this.getHandler() 方法的处理使用到了责任链模式。
    其他: 还有享元模式,建造者模式等
核心容器(spring context应用上下文) 模块

Bean 工厂(BeanFactory)是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从真正的应用代码中分离。最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory ,它根据XML文件中的定义加载beans。该容器从XML 文件读取配置元数据并用它去创建一个完全配置的系统或应用。

Spring框架中有哪些不同类型的事件
  1. 上下文更新事件(ContextRefreshedEvent):在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。
  2. 上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。
  3. 上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。
  4. 上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
  5. 请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件。如果一个bean实现了ApplicationListener接口,当一个ApplicationEvent 被发布以后,bean会自动被通知。
Spring 应用程序有哪些不同组件?
  • 接口 - 定义功能。
  • Bean 类 - 它包含属性,setter 和 getter 方法,函数等。
  • Bean 配置文件 - 包含类的信息以及如何配置它们。
  • Spring 面向切面编程(AOP) - 提供面向切面编程的功能。
  • 用户程序 - 它使用接口。

二. Spring控制反转(IOC)

Spring IOC容器

控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。
Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。
:::info

控制反转是一种思想, 依赖注入是实现方式

:::

IOC的优点
  • IOC 或 依赖注入把应用的代码量降到最低。
  • 它使应用容易测试,单元测试不再需要单例和JNDI查找机制。
  • 最小的代价和最小的侵入性使松散耦合得以实现。
  • IOC容器支持加载服务时的饿汉式初始化和懒加载
Spring IoC 的实现机制

实现原理就是工厂模式加反射机制

Spring 的 IoC支持哪些功能
  • ⭐依赖注入
  • 依赖检查
  • 自动装配
  • 支持集合
  • 指定初始化方法和销毁方法
  • 支持回调某些方法(但是需要实现 Spring 接口,略有侵入)
    :::info

依赖注入: xml配置上即ref标签,对应SpringRuntimeBeanReference对象; 对于 IoC 来说,最重要的就是容器。容器管理着 Bean 的生命周期,控制着Bean 的依赖注入。

:::

BeanFactory 和 ApplicationContext有什么区别?

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值