浅浅浅学 Spring 基基基础

Spring

学习链接:https://www.w3cschool.cn/wkspring/pesy1icl.html

1、Spring是什么,为什么要使用Spring?

Spring 是一个轻量级的 IoCAOP 容器框架。是提供基础性服务的一套框架,目的是简化企业应用程序的开发,使开发者只需要关心业务需求。

  • IoC 容器会管理依赖的对象,不需要自己创建和管理依赖对象了,让相互协作的组件保持松散的耦合

  • AOP 编程允许把遍布于应用各层的功能分离出来形成可重用的功能组件,更方便处理某一类问题

  • spring 提供了事务支持,使得事务操作变的更加方便。

  • 方便框架集成,spring 可以很方便的集成第三方框架,比如 MyBatishibernate 等。

1.常见的配置方式有三种:

  • 基于**XML**的配置:Bean 所需的依赖项和服务在 XML 格式的配置文件中指定。这些配置文件通常包含许多 <bean/>节点的定义和特定于应用程序的配置选项

  • 基于**Java 注解**的配置:

    • 使用组件扫描可以不必在 Spring 的配置文件中配置各个<bean/>节点。
    • 通过在相关的类、方法或字段声明上使用注解,将 Bean 配置为组件类本身,而不是使用 XML 来描述 Bean 装配。
    • 注意:默认情况下,Spring 容器中未打开注解装配,使用它之前在Spring 配置文件中启用它。
  • 基于类的 Java Config

    • 通过类定义 Spring 配置元数据,直接消除 XML 配置文件
    • 通过使用 @Bean@Configuration 来实现。
    • @Bean 注解扮演与 <bean /> 元素相同的角色。用到方法上,表示当前方法的返回值是一个bean
    • @Configuration 类允许通过简单地调用同一个类中的其他 @Bean 方法来定义 Bean 间依赖关系。相当于 spring 的配置文件 XML

这几种方式没有什么所谓的优劣之分,主要看使用情况,一般来说是这样:

  • 涉及到全局配置的,例如数据库相关配置、MVC 相关配置等,就用 Java Config 配置的方式
  • 涉及到业务配置的,就使用注解方式

2.Spring 框架七大核心模块

  • spring core 容器模块:框架最基础部分,提供 IoCDI依赖注入特性。

    • 依赖注入实现容器对Bean的管理,核心容器的主要组件是 BeanFactoryBeanFactory工厂模式的一个实现,是任何Spring 应用的核心。
    • IoC 将应用配置和依赖从实际的应用代码中分离出来
  • spring context 应用上下文模块:扩展了 BeanFactory 的概念

    • 核心模块的 BeanFactory 使 Spring 成为一个容器,而上下文模块使它成为一个框架。
    • 提供了许多企业服务
  • spring aop AOP模块:提供面向切面的编程实现,可自定义拦截器、切点、日志等。

    • Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务
    • 通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中
  • spring dao JDBC抽象和DAO模块:提供了JDBC 的抽象层和异常层次结构。消除了冗长的 JDBC 编码和对数据库供应商特定错误代码的解析。

  • spring orm 对象/关系映射集成模块:

  • spring web Web模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文,提供了Spring和其它 Web 框架的集成

  • spring mvc MVC模块:Spring 为构建 Web 应用提供了一个功能全面的 MVC 框架,SpringMVC 框架使用 IoC 对控制逻辑和业务对象提供了完全的分离

3.Spring 的优点?

(1)Spring属于低侵入设计,代码污染极低;

(2)控制反转:IOC——Inversion of Control,指的是将对象的创建权交给 Spring 去创建。使用 Spring 之前,对象的创建都是由我们自己在代码中new创建。而使用Spring 之后。对象的创建都是给了 Spring 框架。

(3)SpringDI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;

(4)面向切面编程:Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用;

(5)容器:Spring 是一个容器,因为它包含并且管理应用对象的生命周期

(6)组件化:Spring 实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用 XMLJava 注解组合这些对象。

(7)一站式:在 IOCAOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库(实际上 Spring 自身也提供了表现层的 SpringMVC 和持久层的 Spring JDBC

**Spring的特点:**轻量级、控制反转、面向切面、容器化、框架集合

2、Spring IoC 容器的理解

IoC 就是为了解决程序中耦合度太高的问题

1.Ioc 是什么?

Ioc (Inversion of Controll 控制反转),它不是一种技术,而是一种设计思想

  • 控制,谁控制谁,控制什么?

    • IoC 容器控制对象
    • 主要是控制外部资源获取(不只是对象,比如文件)
  • 反转,哪些方面反转了?

    • 由容器查找及注入依赖对象,对象只是被动的接受依赖对象,依赖对象的获取被反转了
  • 传统应用程序示意图

在这里插入图片描述

  • IoC/DI 容器后程序结构示意图

在这里插入图片描述

IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。

2.IoC 和 DI

DI—Dependency Injection,即“依赖注入”由容器动态的将某个依赖关系注入到组件之中依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。

  • 谁依赖谁:应用程序依赖于IoC容器
  • 为什么需要依赖:应用程序需要Ioc容器来提供对象需要的外部资源
  • 谁注入谁:IoC容器注入应用程序某个对象(应用程序所依赖的对象)
  • 注入了什么:注入某个对象所需要的外部资源(包括对象、资源、常量数据)

二者关系:

  • 控制反转(IoC)是一个通用的概念,它可以用许多不同的方式去表达,依赖注入仅仅是控制反转的一个具体的例子。
  • 它们是同一个概念的不同角度描述
  • IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的

Spring 提供了以下两种不同类型的容器:

  • Spring BeanFactory 容器
    • 一个最简单的容器,它主要的功能是为依赖注入提供支持,这个容器接口在 org.springframework.beans.factory.BeanFactory 中被定义。在资源宝贵的移动设备或者基于 applet 的应用当中, BeanFactory 会被优先选择。
    • 最常被使用的是 XmlBeanFactory 类。
  • Spring ApplicationContext 容器
    • BeanFactory 的子接口包含 BeanFactory 所有的功能,也被称为 Spring 上下文,是 spring 中较高级的容器。
    • 最常被使用的 ApplicationContext 接口实现:
      • FileSystemXmlApplicationContext:该容器从 XML文件中加载已被定义的 bean。在这里,你需要提供给构造器 XML 文件的完整路径。
      • ClassPathXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可,因为,容器会从 CLASSPATH 中搜索 bean 配置文件。
      • XmlWebApplicationContext:该容器会在一个 web 应用程序的范围内加载在 XML 文件中已被定义的 bean

3.SpringBean

称作 bean 的对象是构成应用程序的支柱也是一个被实例化、组装、并通过 Spring IoC 容器所管理的对象。这些 bean 是由用容器提供的配置元数据创建的。

BeanSpring 容器的关系

在这里插入图片描述

4.SpringBean 作用域

Spring 框架支持以下五个作用域,分别为 singleton、prototype、request、session 和 global session

5.SpringBean 生命周期

当一个 bean 被实例化时,它可能需要执行一些初始化使它转换成可用状态。同样,当 bean 不再需要,并且从容器中移除时,可能需要做一些清除工作。

  • Bean的生命周期可以表达为:Bean的定义——Bean的初始化——Bean的使用——Bean的销毁
  • 详细介绍待后续…

3、Spring AOP 的理解

  • AOP (面向切面编程),是一种编程思想,是面向对象编程的一种补充,面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术

  • OOP 面向对象编程,允许开发者定义纵向的关系,但并不适用于定义横向的关系,导致了大量代码的重复,而不利于各个模块的重用。

  • AOP 用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。

  • OOP 中模块化的关键单元是类,而在 AOP 中模块化的关键单元是方面。AOP 帮助你将横切关注点从它们所影响的对象中分离出来,然而依赖注入帮助你将你的应用程序对象从彼此中分离出来。

  • 利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP 能够让我们在不影响原有功能的前提下,为软件横向扩展功能

  • 主要功能:可用于权限控制、日志管理、事务、日志处理。

1.Spring AOP三种使用方式

  • AOP 编程三步:
    • 定义普通话业务组建
    • 定义切入点,一个切入点可能横切多个业务组建
    • 定义增强处理,增强处理就是在AOP 框架为普通业务组件织入的处理动作
    • 进行AOP编程的关键就是定义切入点和定义增强处理,一旦定义了合适的切入点和增强处理,AOP框架将自动生成AOP代理,即:代理对象的方法=增强处理+被代理对象的方法。
  • 方式一:使用Spring自带的AOP
  • 方式2:使用Aspectj实现切面(普通POJO的实现方式)
  • 方式3:使用Aspectj实现切面(基于注解的实现方式)

2.Apring AOP的实现原理

AOP 的实现是基于代理模式来实现的,AOP 代理主要分为静态代理和动态代理。一般采用动态代理两种混合的实现方式:JDK 动态代理和 `CGLIB 动态代理。实际上

  • JDK 动态代理:Spring AOP的首选方法。 每当目标对象实现一个接口时,就会使用 JDK 动态代理。目标对象必须实现接口
  • CGLIB 代理:如果目标对象没有实现接口,则可以使用 CGLIB 代理。
2.1 使用 JDK 动态代理
  • 组件一:InvocationHandler 接口
    • 首先编写一个类,去实现该接口,重写invoke()(提供的代理方法)
  • 组件二:Proxy
    • 通过使用该类的newProxyIntance()方法,返回一个代理对象
  • 然后通过代理对象调用方法时,底层将通过反射,调用我们实现的InvocationHandler 接口中的invoke()
2.2 CGLIB 代理

Cglib 是一个强大的、高性能的代码生成库,它广泛被许多AOP框架使用,提供方法的拦截,如下图所示CglibSpring等应用的关系:

在这里插入图片描述

Cglib 的实现是在字节码的基础上的,并且使用了开源的 ASM 读取字节码,对类实现增强功能的。

2.3 二者优缺点
  • JDK 动态代理
    • 优点
      • JDK 动态代理是 JDK 原生的,不需要任何依赖即可使用;
      • 通过反射机制生成代理类的速度要比 CGLib 操作字节码生成代理类的速度更快;
    • 缺点
      • 要使用 JDK 动态代理,被代理的类必须实现了接口,否则无法代理;
      • JDK 动态代理执行代理方法时需要通过反射机制进行回调,此时方法执行的效率比较低
      • JDK 动态代理无法为没有在接口中定义的方法实现代理。假设我们有一个实现了接口的类,我们为它的一个不属于接口中的方法配置了切面,Spring 仍然会使用默认JDK动态代理,但是由于配置了切面的方法不属于接口,为这个方法配置的切面将不会被织入。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值