Spring两大核心技术AOP和IOC,AOP的原理,什么是DI,AOP应用场景

什么是spring?

  • spring是一个开源轻量级的框架,提供了IOC和AOP这两个核心功能。

IOC(控制反转)

IOC是Spring最核心的点,并且贯穿始终,但IOC更多的是控制反转的一种编程思想。

在传统的开发中,只能通过User u = new User()来创建对象,这样导致依赖关系比较复杂,耦合度高。

控制反转就是从自己创建管理bean 到 把创建和管理 bean 的过程转移给了第三方。

在Spring框架中实现控制反转的是Spring IoC容器(BeanFactory),其具体实现就是由容器来控制对象的生命周期和业务对象之间的依赖关系,而不是像传统方式(new对象)中由代码来直接控制

IOC将传统自己新建的对象的这个过程进行了一个反转,也就是说,我们只需要把设计好的对象(Component)交给 IOC 容器控制,然后在需要用到目标对象的时候,直接从容器中去获取(Autowried)。

带来的优势

  • IOC提供的对象默认为单列,当想要维持单列的时候我没不再需要手动编写单列代码。

  • 不必关系对象创建的细节,可以将目光聚焦于业务。

  • 降低了使用资源双方的依赖程度,也就是我们说的耦合度

  • 缺点:如果使用JDK动态代理来创建,那么是使用反射来创建对象,所以在效率上会有些损耗。初学者适应了new ,创建变得复杂,可能难以理解。

使用JDK代理在运行效率上有损耗,使用CGLib代理在创建上的性能有损耗

控制正转和反转

  • 正转:如传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象

  • 反转:反转则是由容器来帮忙创建及注入依赖对象,对象只是被动的接受依赖对象

  • 哪些方面反转了?依赖对象的获取被反转了。

SpringIOC

对于IOC最重要的就是容器,在Spring中实现控制反转的是IoC容器

  • 实现BeanFactory接口的简单容器

  • 实现ApplicationContext接口的高级容器

DI(依赖注入)

上面说了IOC更多的是一种思想,而具体的落地实现则是DI依赖注入

依赖注入DI,将一个程序依赖的资源注入到合适的地方,也就是将BeanFactory容器的对象通过DI注入到合适的位置。

IOC和DI其实是同一个概念,只是从不同的角度描述罢了(IoC是一种思想,而DI则是一种具体的技术实现手段)。简单的说:IoC是目的(创建对象),DI是手段(怎么获取外部对象)

注入方式

实现具体的依赖注入方式有三种

  • 构造器注入:

  • Set注入:

  • 接口注入:已被淘汰

  • 自动注入:不过在使用上更加倾向于使用@Autowird来进行实例变量的自动注入

AOP(面向切面)

AOP(Aspect Orient Programming)面向切面编程,是对OOP面向对象的一种补充,AOP不同于OOP面向对象的关注点是对象,而AOP关注的是切面。

AOP可以在不惊动方法原有的基础上对其进行一个增强,且这个增强,不会影响到原本的方法。

AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离。

AOP并不是spirng独创的技术,不过在spring中使用非常便捷,它的亮点在于AOP和SpringIOC之间的紧密结合。

Aop的应用场景?

Aop的应用场景可以有 日志,安全,检查

个人的应用不是特别常用,而在一些框架中,不少都会使用AOP来进行一个增强。

  • SpringSecuirty 权限检查

  • SpringValidation 参数检查

  • Spring 事务

Spring 对 AOP的实现?

在spring中使用AOP非常简单,通过注解定义即可

  • @Before(execution) 在方法执行前拦

  • @AfterReturning(execution) 在方法正常return结束后拦截

  • @AfterThrowing(execution) 在方法抛出异常时拦截

  • @After(execution) 在方法结束后拦截,无论正常结束还是异常结束

  • @Around(execution)唯一可以使ProceedingJoinPoint参数来控制流程的advice,在 方法执行前拦截,可以在切面逻辑中手动释放拦截,且可以在其后加入逻辑代码,该代 码段会在方法执行后执行,

Aop是如何实现的?

Spring 的 AOP 实现原理其实很简单,就是通过动态代理实现的。

Spring AOP 采用了两种混合的实现方式:JDK 动态代理和 CGLib 动态代理。

  • JDK动态代理:Spring AOP的首选方法。 每当目标对象实现一个接口时,就会使用JDK动态代理。目标对象必须实现接口

  • CGLIB代理:如果目标对象没有实现接口,则可以使用CGLIB代理。

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IOC(Inversion of Control)和AOP(Aspect-Oriented Programming)是目前流行的两种编程思想。它们的原理也基本是相通的。 IOC指的是控制反转,它是一种对象的管理方式。在传统的程序设计中,控制权都是由程序员固化在代码中的。而在IOC中,控制权交由容器来管理,对象的创建、销毁以及对象之间的依赖关系都由容器管理。实现IOC的方式有很多,最为流行的是使用依赖注入(DI)或者依赖查找(DL)。在DI中,对象不再通过代码创建,而是由容器通过反射机制自动创建。在DL中,对象的查找也不再由代码完成,而是由容器完成。这样的好处是提高了代码的可维护性和可扩展性。 AOP指的是面向切面编程,它与IOC的关系是,IOC是基础,AOP是进阶。它是一种可以对现有代码进行描述性编程的思想。常常在面对横切领域的问题时,比如权限控制、日志管理、事务处理等,AOP可以比较好地解决这类问题。AOP的实现方式就是使用代理机制,将一个程序代码的执行过程拆分成一个个切面(aspect),创造代理对象,包装目标对象,达到对目标对象的增强的目的。 综上所述,IOCAOP都是一种编程思想,它们的本质是通过容器管理对象并进行AOP描述性编程。IOC处理对象之间的关系,提高代码可维护性和可扩展性,AOP则让编程实现更加优雅,更加面向对象。在实际开发中,IOCAOP常常是同时运用的,并且是不可或缺的重要组成部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值