Spring中IOC和AOP的深入讲解

前言

Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

这篇文章主要讲 Spring 中的几个点,Spring 中的 IOC,AOP,下一篇说说 Spring 中的事务操作,注解和 XML 配置。

Spring 简介

Spring 是一个开源的轻量级的企业级框架,其核心是反转控制 (IoC) 和面向切面 (AOP) 的容器框架。我们可以把 Spring 看成是对象的容器,容器中可以包含很多对象,所以 Spring 有很多强大的功能。

一句话,Spring 是项目中对象的管家,负责管理项目中用到的所有对象。所以在项目三层架构中,Spring 不属于某一特定层。

Spring 的 Hello World

想要构建一个 Spring 的入门程序,我们需要导入 4 个核心包和 2 个辅助包,创建一个实体类,最主要的是编写核心配置文件,applicationContext.xml 放在 src 下。最后写一个测试类即可。此时在测试类中我们不需要在使用 new 关键字去创建对象了。这也正是 Spring 的作用所在,会自动给我创建对象。

上图展示的就是最基本的演示,也是很容易就理解了,配置文件中配置了 user 对象,我们通过加载配置文件来获取对象从而避免了使用 new 来创建。

什么是 IOC

到这里我们就可以解释一下 Spring 中的核心概念之一的 IOC,即 inverse of control ,翻译过来就是反转控制。想想我们以前想要一个对象就会主动的 new 。现在 Spring 会帮我们创建对象,不需要手工 new(但是要记得配置呀)反转说的就是创建对象的方式反转了,以前是我们自己创建对象,现在由 Spring 为我们创建。

控制又是指什么呢?一个对象要有属性值吧,还有可能存在其它的对象,控制说的就是这些属性和引用不需要自己写了,由 Spring 来为我们自动创建(其实还是我们自己配置的~)。

总结下来就是 Spring 可以自动的为我们创建对象,并注入依赖。而反转控制说的就是以前我们自己创建对象和依赖,现在由程序为我们创建。

Spring 创建对象的方式

那 Spring 又是如何为我们创建的呢?我们知道对象的创建必须要经过构造器,从上面的例子中看到,我们只配置了一个<bean>标签,其实这就是将空参构造器使用配置文件给表示出来罢了。Spring 中创建对象也就是这么简单,当然配置可以更复杂些,后面再说,但目前我们可以知道,Spring 创建对象的就是通过配置 bean 标签,调用构造器来实现的。如何调用构造器的,那肯定是反射搞的鬼。

藏在 IOC 背后的 DI

DI,Dependency Injection,即依赖注入。IOC 还体现在自动注入依赖,依赖注入这词听起来不太明白,简单的理解为绑定数据,这是一种具体的技术,IOC 是思想,DI 是技术实现。对象之中需要其它的对象,类如 Service 层中需要 DAO 层对象,我们不需要在 Service 中手动 new 了,只需要配置一下即可。

常用的注入方式有两种,set 方法注入和构造方法注入。而每一种注入方式中又有注入基本数据类型和引用数据类型之分。下面就看看如何配置。

set 方法注入

通过 property 标签来配置属性,基本数据类型使用 value 属性即可,若是引用类型则使用 ref 。注意,User 对象中要有 Car 引用并且提供其 set 方法。

构造方法注入

这个配置看一眼就基本理解了,非常简单,说个小细节,对象的创建需要执行构造器,我们在初始化对象的时候会使用反射通过全类名得到对象,而这时就需要一个空参的构造器,我们不提供构造器的情况下,程序会自动为我们提供一个空参构造器,但是一旦重写构造器,我们就需要提供空参构造器,不然就报错。

虽然还有其它属性注入的方式,比方说 p 名称空间注入,spel 注入,但是这些都不重要!最常用的就一个那就是 set 方法注入。抓住重点,简单省时。

总结一下,以上主要说了什么是 Spring,如何搭建入门项目,解释了 IOC 思想,以及站在 IOC 背后的技术 DI,我们使用 set 方式注入基本数据类型和引用数据类型,当然,这些东西都构建在反射之上。

AOP 介绍

AOP 是我们经常听到的概念,然而听的太多我们却忘记了最初的定义,全称 Aspect Oriented Programming 翻译过来就是面向切面编程。首先,要搞清楚这是一种思想,Spring 的核心思想就有 AOP 。

尝试理解一下 AOP 的思想,简单来说就是“纵向重复,横向抽取”这很抽象,举几个例子,Filter 的思想,过滤器在解决乱码的时候不需要我们在每一个类中都写处理乱码的代码。而是直接由 Fliter 来统一处理。还有拦截器的思想,我们在 Action 中需要对参数进行校验、封装,而拦截器又是统一对参数进行校验、封装。

不管是 Fliter 还是拦截器,都是面向切面编程思想的具体应用。而我们今天说的 Spring 中的 AOP 又是如何体现呢?

动态代理和 cglib 代理

那就是通过代理,Spring 中通过代理达到统一增强代理对象的目的,而不需要对类中的方法一个一个增强。我们以前接触过动态代理,知道在动态代理中我们的代理对象和被代理对象需要实现同一个接口,在 Spring 中无法保证每个需要增强的类都实现接口,所以就需要引用另外一种代理技术 cglib 代理。

总结一下就是 Spring 中通过代理来体现 AOP 的思想,而代理的实现又分为动态代理和 cglib 代理。动态代理要求代理类和被代理类实现同一个接口。而 cglib 是继承代理,代理对象只需继承被代理对象即可实现。在 Spring 中优先使用动态代理。

两种代理方式有不同的测试代码,这里我不再展示,当我敲代码的时候我突然想到来上海第一次面试的时候,面试官就让我实现一下 Spring 中的 AOP,现在终于想通了,就是让我写一下两种代理方法的实现呀。可惜,当时一脸懵逼……

Spring 中与 AOP 相关名词

连接点(joinPoint): 在目标对象中,所有可以增强的方法。

切入点(pointCut): 在目标对象中,已经增强的方法。

增强/通知(advice): 增强的代码。

目标对象(target): 被代理对象。

织入(weaving): 将通知应用到到连接点。

代理(Proxy): 将通知织入到目标对象形成代理对象。

切面(aspect): 切入点+通知。

下面通过代码展示一下 Spring 中 AOP 的展示,顺带看看与这几个名词的对象关系。

上面的整个过程就是 Spring 中 AOP 的体现,将通知织入到目标对象中形成代理的这么一个过程。我们为了这个需要准备目标对象,通知对象,还要学会如何配置切点和切面。

上面只是为了测试一下能否正确的生成代理对象,而在 Spring 中真正应用 AOP 的是对事务的处理。Spring AOP 实质就是帮我们生成代理对象,而这个代理对象包含了对事务的处理。我们通过配置即可生成代理对象,而不需要我们再手敲代码处理事务。

在 Spring 中还提供了使用注解来配置,注释的出现就是为了替换配置文件,然而注释使用的不多。

总结一下,IoC 和 AOP 都是 Spring 中的核心概念,IoC 体现在 Spring 会为我们自动创建对象,由以前的手动 new 对象,到现在 Spring 统一管理。

我想到一个例子来说明一下 AOP,高速路上的收费站就是一个切面,Spring 的 IoC 就是一个发车站,负责维护汽车对象和依赖对象汽车上的人,车就是目标对象,而我们要生成的代理对象就是通过收费站的汽车。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • 关于SpringBoot获取IOC容器中注入的Bean(推荐)

    一: 注入一个TestUtils类 package com.shop.sell.Utils; import com.shop.sell.dto.CartDTO; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TestUtils { @Bean(name="test

  • 简单理解Spring之IOC和AOP及代码示例

    Spring是一个开源框架,主要实现两件事,IOC(控制反转)和AOP(面向切面编程). IOC 控制反转,也可以称为依赖倒置. 所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B.所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如果不倒置,意思就是A主动获取B的实例:Bb=newB(),这就是最简单的获取B实例的方法(当然还有各种设计模式可以帮助你去获得B的实例,比如工厂.Locator等等),然后你就可以调用b对象了.

  • 浅谈spring ioc的注入方式及注入不同的数据类型

    关于Spring-IoC的简单使用参考: spring ioc的简单实例及bean的作用域属性解析 1.通过set方法注入不同数据类型 测试类代码(set方式注入的属性一定要加set方法) /**通过set方法注入示例*/ public class IoC_By_Set { /**注入Integer类型参数*/ private Integer id; /**注入String类型参数*/ private String name; /**注入实体Bean*/ private User user; /

  • Spring Boot之AOP配自定义注解的最佳实践过程

    前言 AOP(Aspect Oriented Programming),即面向切面编程,是Spring框架的大杀器之一. 首先,我声明下,我不是来系统介绍什么是AOP,更不是照本宣科讲解什么是连接点.切面.通知和切入点这些让人头皮发麻的概念. 今天就来说说AOP的一些应用场景以及如何通过和其他特性的结合提升自己的灵活性.下面话不多说了,来一起看看详细的介绍吧 AOP应用举例 AOP的一大好处就是解耦.通过切面,我们可以将那些反复出现的代码抽取出来,放在一个地方统一处理. 同时,抽出来的代码很多是

  • Spring AOP的使用详解

    什么是AOP AOP(Aspect Oriented Programming 面向切面编程),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 常用于日志记录,性能统计,安全控制,事务处理,异常处理等等. 定义AOP术语 切面(Aspect):切

  • 浅谈Spring IoC容器的依赖注入原理

    本文介绍了浅谈Spring IoC容器的依赖注入原理,分享给大家,具体如下: IoC容器初始化的过程,主要完成的工作是在IoC容器中建立 BeanDefinition 数据映射,并没有看到IoC容器对Bean依赖关系进行注入, 假设当前IoC容器已经载入用户定义的Bean信息,依赖注入主要发生在两个阶段 正常情况下,由用户第一次向IoC容器索要Bean时触发 但我们可以在 BeanDefinition 信息中通过控制 lazy-init 属性来让容器完成对Bean的预实例化,即在初始化的过程中就

  • Spring核心IoC和AOP的理解

    spring 框架的优点是一个轻量级笔记简单易学的框架,实际使用中的有点优点有哪些呢! 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 7.spring属于低侵入式设计,代码的污染极低 8.独立于

  • Spring IOC和aop的原理及实例详解

    这篇文章主要介绍了Spring IOC和aop的原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架.特点是面向接口编程,松耦合. 1:IOC(控制反转) 别名(DI:依赖注入) 首先来一段ioc的实现原来代码: public class ClassPathXmlApplicationContext implements BeanFactory { privat

  • Spring中IOC和AOP的深入讲解

    前言 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅限于服务器端的开发.从简单性.可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益

  • Spring中IoC优点与缺点解析

    本文为大家分享了Spring中IoC优点与缺点,供大家参考,具体内容如下 1. 优点 我们知道,在Java基本教程中有一个定律告诉我们:所有的对象都必须创建:或者说:使用对象之前必须创建,但是现在我们可以不必一定遵循这个定律了,我们可以从Ioc容器中直接获得一个对象然后直接使用,无需事先创建它们. 这种变革,就如同我们无需考虑对象销毁一样:因为Java的垃圾回收机制帮助我们实现了对象销毁:现在又无需考虑对象创建,对象的创建和销毁都无需考虑了,这给编程带来的影响是巨大的. 我们从一个简单例子开始,

  • spring中ioc是什么

    IoC--Inversion of Control,控制反转 在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制.IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则. DI--Dependency Injection(依赖注入) 即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中. 依赖注入的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,并为系统搭建一个灵活.

  • spring中IOC控制反转依赖注入和new对象的区别说明

    目录 IOC控制反转依赖注入和new对象的区别 new对象 依赖注入 spring的IOC容器比New对象究竟好在哪 IOC控制反转依赖注入和new对象的区别 spring默认是单例模式的,依赖注入其中操作的都是一个对象 new对象 单例中如果要做到注入的效果就是在类的头部进行实例化对象,这个时候该对象不管使用与否都贯穿该类的始终.该类对象不被回收,这个实例化对象也不会被回收,因为存在引用状态.如果要使用多例对象则最好使用new创建对象而不是依赖注入,即使依赖注入有多例模式也不推荐. 依赖注入:

  • 浅谈Spring中IOC的理解和认知

    IOC的推导 1.1.模拟一个正常查询信息的业务流程: ①mapper层:因为没有连接数据库,这里我们写一个mapper的实现类来模拟数据的查询 public interface PerMapper { void getPerInfo(); } public class StudentMapperImpl implements PerMapper { @Override public void getPerInfo() { System.out.println("我是一个学生"); }

  • spring源码阅读--aop实现原理讲解

    目录 aop实现原理简介 代理实现的处理器(BeanPostProcessor) 代理实现的源头–AnnotationAwareAspectJAutoProxyCreator AnnotationAwareAspectJAutoProxyCreator的继承结构 代理对象(Proxy)的创建 解析并缓存切面 适配切面 aop实现原理简介 首先我们都知道aop的基本原理就是动态代理思想,在设计模式之代理模式中有介绍过这两种动态代理的使用与基本原理,再次不再叙述. 这里分析的是,在spring中是如

  • spring中的BeanFactory与FactoryBean的讲解

    1.BeanFactory 1.1Spring提供了IOC容器的两种实现方式 ① BeanFactory:IOC容器的基本实现,是Spring内部的基础设施,是面向Spring本身的,不是提供给开发人员使用的. ② ApplicationContext:BeanFactory的子接口,提供了更多高级特性.面向Spring的使用者,几乎所有场合都使用ApplicationContext而不是底层的BeanFactory. 1.2 ApplicationContext的主要实现类 ClassPath

  • Spring中校验器(Validator)的深入讲解

    前言 Spring框架的 validator 组件,是个辅助组件,在进行数据的完整性和有效性非常有用,通过定义一个某个验证器,即可在其它需要的地方,使用即可,非常通用. 应用在执行业务逻辑之前,必须通过校验保证接受到的输入数据是合法正确的,但很多时候同样的校验出现了多次,在不同的层,不同的方法上,导致代码冗余,浪费时间,违反DRY原则. 每一个控制器都要校验 过多的校验参数会导致代码太长 代码的复用率太差,同样的代码如果出现多次,在业务越来越复杂的情况下,维护成本呈指数上升. 可以考虑把校验的代

随机推荐