深入理解spring的两大特性 ioc 和aop

简介: 深入理解spring的两大特性 ioc 和aop

一、ioc(Inversion of Control)


1.是什么 (什么是IOC?)

IoC(Inversion of Control)控制反转,包含了两个⽅⾯:⼀、控制。⼆、反转

我们可以简单认为:

控制指的是:当前对象对内部成员的控制权。

反转指的是:这种控制权不由当前对象管理了,由其他(类,第三⽅容器)来管理。

IOC不够开⻔⻅⼭,于是Martin Fowler提出了DI(dependency injection)来替代IoC,即让调⽤类对某⼀接⼝实现类的依赖关系由第三⽅(容器或协作类)注⼊,以移除调⽤类对某⼀接⼝实现类的依赖。


IOC和DI的区别

  • IoC(思想,设计模式)主要的实现⽅式有两种:依赖查找,依赖注⼊。
  • 依赖注⼊(DI)是⼀种更可取的⽅式(实现的⽅式)。
    总结一句话:IOC 是一种思想,DI是一种实现IOC的方法


2. 为什么要使用IOC( IOC的好处)

  1. 不⽤⾃⼰组装,拿来就⽤。
  2. 享受单例的好处,效率⾼,不浪费空间。
  3. 便于单元测试,⽅便切换mock组件。
  4. 便于进⾏AOP操作,对于使⽤者是透明的。
  5. 统⼀配置,便于修改。


3. 怎么用(依赖注入的方式)

  1. 构造方法注入
  2. setter注入
  3. 基于注解的注入(@Autowired ,利用反射机制实现,最常用)
    Spring常用的三种注入方式


二、aop

1. 什么是aop

aspect object programming ⾯向切⾯编程 (一种编程思想)

⾯向切⾯编程就是指: 对很多功能都有的重复的代码抽取,再在运⾏的时候往业务⽅法上动态植⼊“切⾯类代码”。

功能: 让关注点代码与业务代码分离!


关注点:重复代码就叫做关注点

切⾯:关注点形成的类,就叫切⾯(类)!

切⼊点


  • 执⾏⽬标对象⽅法,动态植⼊切⾯代码。
  • 可以通过切⼊点表达式,指定拦截哪些类的哪些⽅法; 给指定的类在运⾏的时候植⼊切⾯类代码。


切⼊点表达式:指定哪些类的哪些⽅法被拦截


2. 为什么用aop(aop的好处)

  1. 降低模块之间的耦合度。
  2. 使系统容易扩展。
  3. 更好的代码复用。


3. aop的使用

  1. 统一的事务管理
  2. 统一日志处理


4. 具体的aop实现

首先我们要知道,代理模式 分为静态代理动态代理两种不同模式

静态代理:静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类.class文件就已经被创建了

动态代理:是在程序运行时通过反射机制动态创建的。


  • 由于静态代理需要实现⽬标对象的相同接⼝,那么可能会导致代理类会⾮常⾮常多…不好维护---->因此出现了动态代理,
  • 动态代理也有个约束:⽬标对象⼀定是要有接⼝的,没有接⼝就不能实现动态代理…----->因此出现了cglib代理,
  • cglib代理也叫⼦类代理,从内存中构建出⼀个⼦类来扩展⽬标对象的功能!CGLIB是⼀个强⼤的⾼性能的代码⽣成包,它可以在运⾏期扩展Java类与实现Java接⼝。它⼴泛的被许多AOP的框架使⽤,例如Spring AOP和dynaop,为他们提供⽅法的interception(拦截)。
    Java中有两种动态代理的实现方式


  1. JDK动态代理
  2. CGLib动态代理


JDK动态代理是需要实现某个接⼝了,⽽我们类未必全部会有接⼝,于是CGLib代理就有了~~


  • CGLib代理其⽣成的动态代理对象是⽬标类的⼦类
  • Spring AOP默认是使⽤JDK动态代理,如果代理的类没有接⼝则会使⽤CGLib代理
  • 那么JDK代理和CGLib代理我们该⽤哪个呢??在《精通Spring4.x 企业应⽤开发实战》给出了建议:
  • 如果是单例的我们最好使⽤CGLib代理,如果是多例的我们最好使⽤JDK代理原因:
  • JDK在创建代理对象时的性能要⾼于CGLib代理,⽽⽣成代理对象的运⾏性能却⽐CGLib的低。
  • 如果是单例的代理,推荐使⽤CGLib


看到这⾥我们就应该知道什么是Spring AOP(⾯向切⾯编程)了:将相同逻辑的重复代码横向抽取出来,


使⽤动态代理技术将这些重复代码织⼊到⽬标对象⽅法中,实现和原来⼀样的功能
, 这样⼀来,我们就在写业务时只关⼼业务代码,⽽不⽤关⼼与业务⽆关的代码


三、参考链接

  1. 谈谈对Spring IOC的理解
  2. 聊Spring 原理


目录
相关文章
|
21天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
36 4
|
18天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
29 0
|
18天前
|
存储 缓存 Java
Spring高手之路23——AOP触发机制与代理逻辑的执行
本篇文章深入解析了Spring AOP代理的触发机制和执行流程,从源码角度详细讲解了Bean如何被AOP代理,包括代理对象的创建、配置与执行逻辑,帮助读者全面掌握Spring AOP的核心技术。
27 3
Spring高手之路23——AOP触发机制与代理逻辑的执行
|
3天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
10 1
|
7天前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
28天前
|
Java 编译器 Spring
Spring AOP 和 AspectJ 的区别
Spring AOP和AspectJ AOP都是面向切面编程(AOP)的实现,但它们在实现方式、灵活性、依赖性、性能和使用场景等方面存在显著区别。‌
44 2
|
19天前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
46 0
|
27天前
|
XML Java 数据格式
Spring的IOC和AOP
Spring的IOC和AOP
42 0
|
2月前
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
AOP(面向切面编程)能够帮助我们在不修改现有代码的前提下,为应用程序添加新的功能或行为。Micronaut框架中的AOP模块通过动态代理机制实现了这一目标。AOP将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高模块化程度。在Micronaut中,带有特定注解的类会在启动时生成代理对象,在运行时拦截方法调用并执行额外逻辑。例如,可以通过创建切面类并在目标类上添加注解来记录方法调用信息,从而在不侵入原有代码的情况下增强应用功能,提高代码的可维护性和可扩展性。
60 1
|
4天前
|
安全 Java 编译器
什么是AOP面向切面编程?怎么简单理解?
本文介绍了面向切面编程(AOP)的基本概念和原理,解释了如何通过分离横切关注点(如日志、事务管理等)来增强代码的模块化和可维护性。AOP的核心概念包括切面、连接点、切入点、通知和织入。文章还提供了一个使用Spring AOP的简单示例,展示了如何定义和应用切面。
31 1
什么是AOP面向切面编程?怎么简单理解?