Spring IOC 和 AOP

10 篇文章 0 订阅
订阅专栏

Spring IOC

什么是 IoC ?

IoC (Inversion of Control 控制反转)是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由给 Spring 框架来管理

为什么叫控制反转?

  • 控制:指的是对象的创建(实例化,管理)的权利
  • 反转:控制权交给外部环境(Spring 框架、Ioc 容器)

        将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器来完成对象的注入。这样可以很大程度上简化应用的开发,并做到解耦合,把应用从复杂的依赖关系中抽取出来,开发人员只需要关注对象的使用,而不需要关心对象是如何创建的。

        在实际项目中,一个 Service 类可能依赖很多其他的类。假如我们需要实例化这个 Service ,每次都需要搞清楚这个 Service 所有底层类的构造函数。如果使用 IoC的话,只需要配置好Bean ,在需要的地方注入就行了,大大降低了项目的可维护性和开发难度。

什么是 Spring Bean?

可以简单地理解为 Bean 指代的就是那些 被 IoC 容器所管理的对象。一般在 Spring Boot 中使用以下几种注解声明:

  • Component : 通用注解,可以标注任意类为 Spring 组件。如果一个类不清楚分在那一层,可使用 @Component 注解标注
  • @Repository:对应持久层 即 Dao 层,主要用于数据库相关操作
  • @Service:对应服务层,主要设计一些复杂的逻辑处理
  • @Controller:对应 控制层 , 主要用于接收用户的请求并调用 Service。


IoC 和 DI 有什么区别?

IoC 可以理解为以中国控制反转的设计思想,而 DI 可以理解为这种设计思想的具体实现方式

IoC 解决了什么问题?

  1. 对象之间的耦合度降低
  2. 资源管理变得容易

例如,一个针对 User 的操作,利用 Service 和 Dao 层进行开发

在没有使用 IoC 思想的情况下,Service 层想要使用 Dao 层的话,需要通过 new 关键字在 UserServiceImpl 中手动 new 一个 UserDao 的具体实现类 UserDaoImpl

但是,如果开发过程中出现新的需求,针对 UserDao 接口 开发出另一个 具体的实现类。由于 Service 层依赖了 UserDao 的具体实现,所以我们需要修改 UserServiceImpl 中 new 的对象。这就导致,如果我们的项目中很多地方都依赖于 UserDao 的实现类的话,就需要修改每一处,这就导致维护起来非常麻烦。

使用 IoC 的思想,我们将对象的控制权交给 Spring 容器管理后,我们在使用的时候直接向 IoC 容器 “要” 就行了。


Spring AOP

什么是 AOP?

AOP(Aspect Oriented Programming)即面向切面编程。

AOP 的目的是将横切关注点(例如日志管理、事务管理、权限控制、接口控制)从核心业务逻辑中分离出来,通过动态代理,字节码操作等技术,实现代码的复用和解耦,提高代码的可维护性和可扩展性。

OOP(面向对象编程)

AOP 和 OOP 其实并不冲突,两者互补

OOP的目的是将业务逻辑按照对象的属性和行为进行封装,通过类、对象、继承、多态等概念,实现代码的模块化和层次化,提高代码的可读性和可维护性

AOP 为什么叫面向切面编程?

因为 AOP 的核心思想是将横切关注点从核心业务逻辑中分离出来,形成一个一个的切面。

  • 横切关注点:多个类或对象中的公共行为(如日志记录、事务管理、权限控制、接口限流等)
  • 切面(Aspect):对横切关注点进行封装的类,一个切面是一个类。切面可以定义多个通知,用来实现具体的功能
  • 连接点(JoinPoint):连接点是方法调用或方法执行时的某个特定时刻(如方法调用、抛出异常等)
  • 通知(Advice):通知就是切面在某个连接点要执行的操作。通知有五种类型分别是:前置通知(Before)、后置通知(After)、返回通知(AfterReturning)、异常通知(AfterThrowing)和 环绕通知(Around)。
  • 切点(Pointcut):一个切点是一个表达式,它用来匹配哪些连接点需要被切面所增强。切点可以通过注解、正则表达式、逻辑运算等方式来定义。比如 execution(* com.xyz.service..*(..))匹配 com.xyz.service 包及其子包下的类或接口。
  • 织入(Weaving):织入是将切面和目标对象连接起来的过程,也就是将通知应用到切点匹配的连接点上。常见的织入时机有两种,分别是编译期织入(AspectJ)和运行期织入(AspectJ)

使用示例

AOP解决了什么问题?

OOP不能很好的处理一些分散在多个类或对象中的公共行为,这些行为通常被称为 横切关注点 。如果我们在每个类或者对象中都重复实现这些行为就会导致代码的冗余、复杂和难以维护。

AOP 可以将横切关注点 从 核心业务逻辑 中分离出来,实现关注点的分离。

比如说日志记录,记录每次访问请求的参数和信息:


@Aspect
@Slf4j
@Component
@Order(0)
public class AopLog {

    private static final String START_TIME = "request-start";
    /**
    *切入点
    * */
    @Pointcut("execution( * com.whgcdx.demo1.controller..*Controller.*(..))")
    public void log(){}

    /**
     * 环绕操作
     */
    @Around("log()")
    public Object aroundLog(ProceedingJoinPoint point) throws Throwable {
        Object result = point.proceed();
        log.info("【返回值】:{}", JSON.toJSONString(result));
        return result;
    }

    /***
     * 前置操作
     */
    @Before("log()")
    public void beforeLog(JoinPoint point){
        //利用 RequestContextHolder 获取 HttpServletRequest 对象
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest httpServletRequest = servletRequestAttributes.getRequest();
        UserAgent userAgent = UserAgentUtil.parse(httpServletRequest.getHeader(Header.USER_AGENT.toString()));

        //重组请求信息
        StringBuffer sb = new StringBuffer();
        sb.append("---------------------------------收到请求-------------------------------------------");
        sb.append("\r\n【浏览器类型】: " + userAgent.getBrowser() + " 【版本号】: " + userAgent.getVersion());
        sb.append("\r\n【user-agent】: " + httpServletRequest.getHeader(Header.USER_AGENT.toString()));
        sb.append("\r\n【访问URL】: " + httpServletRequest.getRequestURI());
        sb.append("\r\n【访问Method】: " + httpServletRequest.getMethod());
        sb.append("\r\n【访问IP】: " + httpServletRequest.getRemoteAddr());
        sb.append("\r\n【访问类名】:"+ point.getSignature().getDeclaringTypeName() + ", 【访问方法名】:" + point.getSignature().getName());
        Map<String ,String[]> paramerMap = httpServletRequest.getParameterMap();
        sb.append("\r\n【请求参数】: " + paramerMap);

        log.info(sb.toString());

        httpServletRequest.setAttribute(START_TIME,System.currentTimeMillis());
    }



    /***
     *
     */
    @After("log()")
    public void afterLog(){
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
        Long start= (Long) request.getAttribute(START_TIME);
        Long end=System.currentTimeMillis();
        log.info("【请求耗时】:{}ms",end-start);

        String header=request.getHeader(Header.USER_AGENT.toString());
        UserAgent userAgent=UserAgentUtil.parse(header);
        log.info("【操作系统】:{},【原始User-Agent】:{}",
                userAgent.getOs().toString(),
                header);
    }


}

Spring IOCAOP原理 快速了解
ccccchoker的博客
09-25 676
Spring IOC 1、什么是ioc (1)控制反转,将对象的创建和对象之间的调用交个spring容器进行管理。 (2)目的:降低耦合度 (3)依赖注入是实现的方式 传统模式//耦合度高 Class userservice{ excute(){ Userdao dao=new Userdao(); Dao.add(); } } Class userdao{ add(){ … } } 工厂模式 //一定程度上解耦但不是最低耦合 (PS:不可能完全解耦) Class userservice{ excute()
学习spring iocaop
05-14
spring 核心功能演示项目 1. applicationContext xml方式和注解方式配置 2. pring bean循环依赖。 3. spring bean 启动顺序。 4. BeanDefinition编程式注入到容器。...5. spring aop 打印 6. spring 事务
SpringIOCAOP
林在闪闪发光的博客
10-24 833
2.Spring可以解决企业应用开发的复杂性3.Spring有两个核心部分:IOCAOP​ (1)IOC:控制反转,把创建好的对象给Spring进行管理​ (2)AOP:面向切面编程,不修改源代码的情况下进行功能增加。
SpringIOCAOP介绍
weixin_50748675的博客
04-26 1万+
Spring介绍 1.spring是轻量级的开源的JavaEE框架 2.Spring可以解决企业应用开发的复杂性 3.Spring有两个核心部分:IOCAOP ​ (1)IOC:控制反转,把创建好的对象给Spring进行管理 ​ (2)AOP:面向切面编程,不修改源代码的情况下进行功能增加。 Spring特点 1.方便解耦,简化开发。 2.AOP支持 3.方便程序测试 4.方便和其他框架整合 ​ 6.降低了API开发难度 IOC IOC底层原理和基本概念 inversion f
Spring IOCAOP原理
傍晚的猫和鱼的博客
10-21 1024
Spring IOCAOP原理
Spring IoCAOP的通俗理解
qq_39144436的博客
03-10 2522
这篇文章会从下面从以下几个问题展开对IoC& AOP 的解释 什么是 IoCIoC 解决了什么问题? IoC 和 DI 的区别? 什么是 AOPAOP 解决了什么问题? AOP 为什么叫做切面编程? 首先声明:IoC & AOP 不是 Spring 提出来的,它们在 Spring 之前其实已经存在了,只不过当时更加偏向于理论。Spring 在技术层次将这两个思想进行了很好的实现。 什么是 IoC IoC (Inversion of control )控制反转/反转..
Spring IoCAOP
海棠花未开
06-19 687
Spring IoCAop
浅谈 Spring IOCAOP
eugene03的博客
10-19 549
浅谈 Spring IOCAOP
简述Spring IOCAOP
正在探索 Java 海
12-26 1366
大家好,我是Morning,在CSDN写文,分享一些Java基础知识,一些自己认为在学习过程中比较重要的东西,致力于帮助初学者入门,希望可以帮助你进步。感兴趣的欢迎关注博主,和博主一起学习Java知识。大家还可以去专栏查看之前的文章,希望未来能和大家共同探讨技术。 文章目录Spring是什么?Spring的优点IOC概述基于 xml 配置方式注解方式AOP概述包含的基本概念Spring AOP实现 Spring是什么? Spring是一个轻量级的,开源的,非侵入式的,IOCAOPJava 开发框架.
Spring IOCAOP通俗理解
weixin_39662562的博客
03-26 211
Spring IOC和DI IOCspring的两大核心概念之一,IOC是一种控制反转的思想,他给我们提供了一个bean容器,这个容器会帮我们自动去创建对象,不需要我们手动创建,IOC的具体实现是通过DI(依赖注入),我们可以通过写Java注解代码或者是XML配置方式,把我们想要注入对象所依赖的一些其他的bean,自动的注入进去,他是通过byName或byType类型的方式来帮助我们注入。正是因为有了依赖注入,使得IOC有这非常强大的好处:解耦。 Spring AOP 在日常工作中,我们可能会遇到.
深入理解Spring两大特性:IoCAOP
热门推荐
null
02-14 9万+
众所周知,Spring拥有两大特性:IoCAOP。。Spring核心容器的主要组件是Bean工厂(BeanFactory),Bean工厂使用控制反转(IoC)模式来降低程序代码之间的耦合度,并提供了面向切面编程(AOP)的实现。简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面编程(AOP)的容器框架。下面,我们简要说明下这两大特性。
Spring IOCaop的原理及实例详解
08-25
Spring IOCAOP的原理及实例详解 在软件开发中,控制反转(IOC)和面向切面编程(AOP)是两种非常重要的设计模式。Spring框架正是基于这两种模式的思想设计的。下面我们将详细介绍Spring IOCAOP的原理及实例详解...
SpringIOCAOP原理设计模式
01-27
在接触Spring的过程中,听到最多的无非两个名词,一个是控制反转一个是依赖注入。实际这是一个意思,控制反转代表原来由程序本身去控制对象之间的依赖关系的这种格局被反转了,通过第三方容器(IOC)去完成控制这些...
spring iocaop原理流程图(详细)
08-27
spring ioc容器初始化流程图 spring ioc容器依赖注入流程图 spring aop实现原理流程图
Spring IOCAOP代码与笔记整理
12-07
彻底学会SpringIOCAOP——理论+实操,参考:https://blog.csdn.net/qq_39735940/article/details/121754987
Spring Security实现用户认证四:使用JWT与Redis实现无状态认证
不做菜虚困的博客
06-12 819
在基本的通信流程中,我们一般采用Session去存储用户的认证状态。在Spring Security实现用户认证三中讲过,在拿到前端传输过来的用户名和密码之后,会有专门的过滤器处理这部分的需求,并且对认证成功的用户生成Token且存储在Session中。在下次发起请求时,直接从Session中取出同用户名的token进行密码哈希的比较要认证用户。对于无状态认证,则我们的认证不依赖与服务器端存储的Session的状态。所以无状态认证需要我们每次从前端传输一个包含完整认证信息的Token到服务器端进行自定义的认
graalvm编译springboot3 native应用
fengchengwu2012的博客
06-12 701
云原生时代容器先行,为了更好的拥抱云原生,spring boot3之后,推出了graalvm编译boot项目,利用jvm的AOT( Ahead Of Time )运行前编译技术,可以将javay源码直接构建成机器码二进制的文件,无需jdk静态编译为class字节码,运行时jre解释执行,这样就无需依赖java环境运行,部署到容器中可以直接启动运行。
SpringBoot3 整合 Mybatis 完整版
northcastle的博客
06-14 457
SpringBoot3 整合 MyBatis 的步骤详细记录
Spring IOC 控制反转(注解版)
最新发布
Dreadnaught的博客
06-17 588
Spring 框架中的核心概念之一就是控制反转(Inversion of Control,IoC)。IOC就是一种思想,而依赖注入(Dependency Injection, DI)是控制反转的一种实现方式。Spring本身是一个容器,存的是对象。对象这个词,在 Spring的范围内,称之为 Bean。控制反转(Inversion of Control,IoC)是一种设计原则,它将对象的创建和依赖关系的管理从程序代码中解耦出来,交由框架或容器进行处理。
spring iocaop
03-29
Spring IOC(Inversion of Control)和AOP(Aspect-Oriented Programming)是Spring框架的核心特性。 1. Spring IOC(控制反转)是一种设计模式,它将对象的创建和依赖关系的管理从代码中剥离出来,交给容器来管理。这种模式的好处是,降低了代码的耦合性,使得代码更加灵活、可重用、可维护。Spring框架通过IOC容器来实现控制反转,容器负责对象的创建、初始化、销毁和依赖注入。开发人员只需要在配置文件中声明需要的组件,容器会自动将组件注入到需要的地方。 2. AOP(面向切面编程)是一种编程思想,它通过将横切关注点(如日志、事务管理、安全性等)从业务逻辑中分离出来,使得程序的结构更加清晰、易于理解和维护。Spring框架通过AOP来实现切面功能,它提供了一种声明式的方式来定义切面,开发人员只需要在配置文件中声明切面和切点,容器会自动将切面织入到需要的组件中。 总之,Spring IOCAOPSpring框架的两大核心特性,它们共同协作,使得Spring框架具有了优秀的可扩展性、灵活性和可维护性,成为了Java企业级应用开发的首选框架之一。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 自注意力(Self-Attention) 12526
  • BRDF详解(包括:irradiance,radiance,intensity,立体角) 7554
  • Blinn-Phong光照模型详解 5350
  • Linux 复制文件夹或文件到另一台电脑上 4892
  • go语言获取当前时间、时间类型转换 3994

分类专栏

  • Java 10篇
  • Redis 5篇
  • 数据库 10篇
  • go语言 38篇
  • 操作系统 16篇
  • 计算机网络 16篇
  • 随记 1篇
  • 深度学习 2篇
  • 计算机图形学 21篇
  • GAMES101 11篇
  • mongodb 7篇
  • python 2篇
  • linux 4篇
  • C++
  • hadoop 4篇
  • 地图服务器 1篇

最新评论

  • (学习笔记-TCP连接断开)建立了连接,但是客户端或服务端出现问题,会怎么样?

    Robin Chaser: 这不是小林coding里面的内容吗,谁抄谁

  • (学习笔记-硬件结构)CPU如何执行程序?

    大瑞飞呀飞: 感谢博主,我get了

  • 反射方程的分解、预计算BRDF

    程序鸡: 原文:https://learnopengl-cn.github.io/07%20PBR/03%20IBL/01%20Diffuse%20irradiance/

  • 实时全局光照Screen Space Reflection (SSR)

    哲学家♂: 只是抄课件,实现一点都没讲嘛表情包

  • Redis 数据结构

    简单简单小白: 感谢博主的优质好文,文章细节很到位,兼顾实用性和可操作性,感谢博主的分享,期待博主持续带来更多好文!

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 【面试题】介绍一下类加载过程,什么是双亲委派模型
  • String 、StringBuffer 和 StringBuilder 的区别?
  • 什么是缓存雪崩、击穿、穿透?
2023年87篇
2022年53篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司同乐网站优化荷坳网站优化按天计费平湖品牌网站设计坂田网站改版永湖网站优化推广西乡网站推广方案盐田模板制作盐田网站建设设计布吉百度竞价布吉标王横岗百度竞价包年推广广州网页设计塘坑外贸网站制作盐田百度seo福永seo优化坪山推广网站松岗网站开发爱联SEO按天计费双龙SEO按效果付费深圳网站建设设计龙华百度竞价包年推广福田网络广告推广深圳网站改版坑梓seo优化深圳网站优化按天收费石岩品牌网站设计惠州网站优化按天收费南山网站建设设计丹竹头网站seo优化盐田网站优化按天扣费歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化