深入理解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 原理


目录
相关文章
|
7月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
702 0
|
6月前
|
XML Java 数据格式
《深入理解Spring》:AOP面向切面编程深度解析
Spring AOP通过代理模式实现面向切面编程,将日志、事务等横切关注点与业务逻辑分离。支持注解、XML和编程式配置,提供五种通知类型及丰富切点表达式,助力构建高内聚、低耦合的可维护系统。
|
6月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
8月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
8月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
|
9月前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
261 2
|
10月前
|
XML 人工智能 Java
Spring IOC 到底是什么?
IOC(控制反转)是一种设计思想,主要用于解耦代码,简化依赖管理。其核心是将对象的创建和管理交给容器处理,而非由程序直接硬编码实现。通过IOC,开发者无需手动new对象,而是由框架负责实例化、装配和管理依赖对象。常见应用如Spring框架中的BeanFactory和ApplicationContext,它们实现了依赖注入和动态管理功能,提升了代码的灵活性与可维护性。
246 1
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
938 26
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)

热门文章

最新文章