当前位置: 首页 > news >正文

【创作赢红包】

1、IoC\nIoC(Inversion of Control,控制反转)是一种软件设计思想,它的核心思想是将对象之间的依赖关系交给容器来管理,从而降低对象之间的耦合度,提高代码的灵活性和可维护性。\n\n在传统的编程模式中,一个对象需要依赖另一个对象时,通常是通过直接创建和管理这个对象来实现的。但是,随着软件系统的不断变化和扩展,这种硬编码方式会使得系统变得难以维护和扩展,因为对象之间的耦合度太高了。而 IoC 的思想则是将这种对象之间的依赖关系反转过来,由容器来管理和注入依赖关系,从而实现对象之间的解耦。\n\n在实现 IoC 的过程中,通常使用依赖注入(Dependency Injection,DI)的方式来管理对象之间的依赖关系。依赖注入有三种实现方式:\n\n构造函数注入:通过构造函数传递依赖对象的实例;\nSetter 方法注入:通过 Setter 方法传递依赖对象的实例;\n接口注入:通过接口实现注入依赖对象的实例。\n\n1\n2\n3\n在 Spring 框架中,依赖注入是通过配置 Bean 的定义和属性来实现的。Spring 容器会自动读取配置文件,将 Bean 定义和属性信息装载到容器中,并根据依赖关系自动注入依赖对象的实例。这样就可以实现对象之间的松耦合,从而提高代码的灵活性和可维护性。\n\n以下是一个简单的代码示例:\n首先,在 src/main/java 目录下创建一个名为 com.example.demo 的包。在该包下创建一个名为 MyApplication 的主应用程序类:\n\npackage com.example.demo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.ApplicationContext;\n\n@SpringBootApplication\npublic class MyApplication {\n\n public static void main(String[] args) {\n ApplicationContext context = SpringApplication.run(MyApplication.class, args);\n\n // 从 Spring 容器中获取名为 “myBean” 的 bean\n MyBean myBean = (MyBean) context.getBean(“myBean”);\n myBean.sayHello();\n }\n}\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n在该类中,使用了 @SpringBootApplication 注解,它组合了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 注解,用于开启 Spring Boot 应用程序的自动配置和组件扫描功能。\n\n接下来,在同一包下创建一个名为 MyBean 的类:\n\npackage com.example.demo;\n\nimport org.springframework.stereotype.Component;\n\n@Component(“myBean”)\npublic class MyBean {\n\n public void sayHello() {\n System.out.println(“Hello, World!”);\n }\n}\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n在该类中,我们使用了 @Component 注解,将该类声明为一个组件,并使用 “myBean” 作为该组件在 Spring 容器中的名称。\n\n现在,我们可以运行 MyApplication 类,并从 Spring 容器中获取 MyBean 实例,并调用其 sayHello() 方法输出 “Hello, World!”。\n\n2、DI\n依赖注入(Dependency Injection)是一种设计模式,它用于解决对象之间的依赖关系,特别是在面向对象编程中。该模式通过将依赖关系的创建和管理从客户端代码中解耦出来,从而使代码更加灵活、可维护和可测试。\n\n在依赖注入模式中,对象不是直接创建或获取它们所依赖的对象,而是将它们的依赖关系交给外部的系统或组件来处理。这些依赖关系通常通过构造函数参数、属性或方法参数来传递,或者通过专门的容器来管理。\n\n依赖注入可以有三种方式实现:\n\n构造函数注入(Constructor Injection):在对象创建时,通过构造函数参数将依赖关系传递给对象。\n\n属性注入(Property Injection):通过公开的属性或方法,将依赖关系注入到对象中。\n\n接口注入(Interface Injection):定义一个接口,通过实现这个接口,来将依赖关系注入到对象中。\n1\n2\n3\n4\n5\n依赖注入的好处在于,它可以帮助我们实现代码的解耦和可测试性。通过将对象之间的依赖关系交给外部来管理,我们可以更轻松地对代码进行单元测试,并且在未来对代码进行重构时,也可以更轻松地修改依赖关系。\n\n以下是一个简单的示例代码:\n假设我们有一个简单的服务类,名为MyService,其中有一个名为doSomething()的方法:\n\npublic class MyService {\n \n public void doSomething() {\n System.out.println(“Doing something…”);\n }\n}\n1\n2\n3\n4\n5\n6\n现在我们想在另一个类中使用MyService类,我们可以使用Spring Boot的依赖注入功能将其注入到另一个类中。\n\n首先,我们需要在MyService类上添加@Component注解,以将其标记为一个组件,以便Spring Boot可以自动扫描并创建该类的实例:\n\n@Component\npublic class MyService {\n \n public void doSomething() {\n System.out.println(“Doing something…”);\n }\n \n}\n1\n2\n3\n4\n5\n6\n7\n8\n接下来,在我们要使用MyService类的类中,我们可以使用@Autowired注解来注入MyService类的实例:\n\n@Service\npublic class MyOtherService {\n \n @Autowired\n private MyService myService;\n \n public void doSomethingElse() {\n \t// do A\n myService.doSomething();\n // do B\n }\n \n}\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n在上面的示例中,我们在MyOtherService类中使用了@Autowired注解来注入MyService类的实例。然后,在doSomethingElse()方法中,我们使用myService实例调用了MyService类中的doSomething()方法。\n\n这样,我们就可以使用Spring Boot的依赖注入功能轻松地管理我们的类之间的依赖关系。\n\n3、AOP\nAOP(面向切面编程)是一种面向对象编程的技术,它允许在程序运行时动态地添加横向关注点到应用程序中。如安全性、日志记录和事务处理等,从应用程序的核心业务逻辑中抽象出来,以便在多个应用程序组件中共享和重用。\n\nAOP的核心是切面(Aspect),切面定义了一系列与横向关注点相关的通知(Advice),通知则是要在横向关注点发生的特定点执行的代码。在Spring Boot中,您可以使用注释或XML配置来定义切面和通知,并通过Spring AOP来织入切面和通知。\n\n有五种类型的通知:\n前置通知(Before advice):在目标方法执行之前执行通知代码。\n后置通知(After advice):在目标方法执行之后(无论方法是否发生异常)执行通知代码。\n返回通知(After returning advice):在目标方法执行之后(方法正常返回时)执行通知代码。\n异常通知(After throwing advice):在目标方法抛出异常时执行通知代码。\n环绕通知(Around advice):在目标方法执行前后都可以执行通知代码。\n1\n2\n3\n4\n5\n以下是使用Spring Boot AOP的基本步骤:\n定义切面类,可以使用@Aspect注释。\n在切面类中定义通知方法,可以使用@Before、@After或@Around等注释。\n在通知方法中执行所需的操作,例如记录日志或验证用户。\n在需要应用切面的类中注入切面,可以使用@Autowired注释。\n下面是一个简单的示例,展示如何使用Spring Boot AOP记录方法调用时间:\n\n定义一个切面类,可以使用@Aspect注释。\n\n\nimport org.apache.commons.lang3.time.StopWatch;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.;\nimport org.springframework.stereotype.Component;\n\n/**\n * 0、务必在 Spring Boot 启动类上面 包扫描此切面\n * 1、放具体的接口或者具体的接口实现类都是可以的,效果一样\n * execution( com.lfsun.api.service.hello.HelloService.(…))\n * execution( com.lfsun.service.main.HelloServiceImpl.(…))\n \n \n * 2、针对某一包下所有类\n * 可以 execution( com.lfsun.service.main…(…))\n * 我这里以具体的实现类为例,达到的效果都是一样的\n \n * 3、结果\n * 执行 MyAspect 切面的环绕通知(前).\n * 执行 MyAspect 切面的前置通知 .\n * 执行 MyAspect 切面的返回通知. 结果是: hello world 666!\n * 执行 MyAspect 切面的后置通知.\n * 执行 MyAspect 切面的环绕通知(后). 结果是: hello world 666!\n * @author Administrator\n /\n@Aspect\n@Component\npublic class MyAspect {\n\n // 前置通知\n //@Before("execution( com.lfsun.service.main.HelloServiceImpl.(…))")\n //@Before("execution( com.lfsun.api.service.hello.HelloService.(…))")\n @Before("execution( com.lfsun.service.main…(…))")\n public void beforeAdvice() {\n System.out.println(“执行 MyAspect 切面的前置通知 .”);\n }\n\n // 后置通知\n //@After("execution( com.lfsun.service.main.HelloServiceImpl.(…))")\n //@After("execution( com.lfsun.api.service.hello.HelloService.(…))")\n @After("execution( com.lfsun.service.main…(…))")\n public void afterAdvice() {\n System.out.println(“执行 MyAspect 切面的后置通知.”);\n }\n\n // 返回通知\n //@AfterReturning(pointcut = "execution( com.lfsun.service.main.HelloServiceImpl.(…))", returning = “result”)\n //@AfterReturning(pointcut = "execution( com.lfsun.api.service.hello.HelloService.(…))", returning = “result”)\n @AfterReturning(pointcut = "execution( com.lfsun.service.main…(…))", returning = “result”)\n public void afterReturningAdvice(Object result) {\n System.out.println("执行 MyAspect 切面的返回通知. 结果是: " + result);\n }\n\n // 异常通知\n //@AfterThrowing(pointcut = "execution( com.lfsun.service.main.HelloServiceImpl.(…))", throwing = “exception”)\n //@AfterThrowing(pointcut = "execution( com.lfsun.api.service.hello.HelloService.(…))", throwing = “exception”)\n @AfterThrowing(pointcut = "execution( com.lfsun.service.main…(…))", throwing = “exception”)\n public void afterThrowingAdvice(Exception exception) {\n System.out.println("执行 MyAspect 切面的抛出异常通知. 异常是: " + exception);\n }\n\n // 环绕通知\n //@Around("execution( com.lfsun.service.main.HelloServiceImpl.(…))")\n //@Around("execution( com.lfsun.api.service.hello.HelloService.(…))")\n @Around("execution( com.lfsun.service.main…*(…))")\n public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {\n System.out.println(“执行 MyAspect 切面的环绕通知(前).”);\n StopWatch stopWatch = new StopWatch();\n stopWatch.start();\n\n Object result = joinPoint.proceed();\n System.out.println(String.format(“执行 MyAspect 切面的环绕通知(后). 结果是: {%s},执行时间:{%d} ms”, result, stopWatch.getTime()));\n return result;\n }\n}\n

相关文章:

【创作赢红包】

1、IoC\nIoC(Inversion of Control,控制反转)是一种软件设计思想,它的核心思想是将对象之间的依赖关系交给容器来管理,从而降低对象之间的耦合度,提高代码的灵活性和可维护性。\n\n在传统的编程模式中&…...

Mybatis入门

1. 框架 框架相当于是一个脚手架,内部已经写好了很多代码,我们只要其基础上进行开发就可以提高我们的开发效率 框架阶段学习: ①先去学习如何使用框架 ②然后再使用熟练的情况下去猜测内部的原理 ③通过源码去验证自己的猜测。 2.Mybat…...

金色传说:SAP-PP-CO01/CO02 生产订单下达保存时报错:用户状态 新建 是活动的 (ORD %00000000001) 消息号BS014

文章目录问题描述一、原因分析:二、解决方案:总结问题描述 某一特殊订单类型的生产订单下达保存时,出现报错提示:用户状态 新建 是活动的 (ORD %00000000001) 报错的消息号为BS014 一、原因分析: 既然是某一特殊订单类型才出现报错,那么问…...

@Transactional和synchronized同时使用时的一些问题以及解决

Transactional和synchronized同时使用并不能保证事务一致性背景任何事情都有一个发生背景有个需求【一个业务里面包含多个事务,而且还需要避免其他线程的影响,所幸的是该服务只需要启动单实例,不然还要考虑分布式的影响】我的思路就是用Transactional 和 synchronized来保证事务…...

贪心-根据身高重建队列

假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返回输入数组 peopl…...

「解析」牛客网-华为机考企业真题 21-40

又是一年春招时,有幸收到华为自动驾驶算法岗,之前刷题不多,在此汇总下牛客网的真题,主要采用Python编写,个人觉得语言只是实现工具而已,并不是很关键,Python简洁易懂,更加适合算法工…...

JAVA练习92-快乐数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 提示:这里可以添加本文要记录的大概内容: 3月28日练习内容 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目-…...

BPF 之路:技术背景

目录 引言 什么是BPF 历史 组成 执行机制 BPF 和ebpf 的关系 BCC、bpftrace、IO Visor BCC 项目的quick start execsnoop biolatency 动态插桩:kprobes和uprobes 概念 缺点 静态插桩:tracepoint 和USDT 概念 缺点 推荐的方案 初识bpft…...

C++—— set、map、multiset、multimap

目录 关联式容器 概念 键值对 树形关联式容器 set 介绍 定义方式 使用 map 介绍 使用 multiset 介绍 使用 multimap 介绍 使用 相关的OJ题 前K个高频单词 关联式容器 概念 我们之前接触过的一些容器,比如:vector、list、deque、forwa…...

Qlib使用

Qlib https://github.com/microsoft/qlib 将csv文件转化为Qlib的数据格式:https://qlib.readthedocs.io/en/latest/component/data.html#converting-csv-format-into-qlib-format 注意每支股票都要保存成单独一个文档,且文档名字与股票代号一致。 其中f…...

TL-WDR7660 httpProcDataSrv任意代码执行漏洞复现分析

01 漏洞简述 2023年1月31日,CNVD公开了一个由国内安全研究员提交的TL-WDR7660 httpProcDataSrv任意代码执行漏洞,编号为CNVD-2023-05404,同时公开了漏洞利用详情,poc代码链接为https://github.com/fishykz/TP-POC。从poc代码详情…...

基于DDS的SOA测试方案实现

随着以太网技术在车载网络中的应用,各种基于以太网的中间件也相继被应用在车内,如果对车载网络有过相关了解的小伙伴,对于作为中间件之一的DDS(数据分发服务Data Distribution Service)可能并不陌生;若没有…...

LibTorch中Windows系统环境配置及CUDA不可用问题解决

前言:本文对在Windows系统上进行LibTorch开发环境配置及相关问题解决做一个较为详细的记录,以便后续查询使用。 使用环境版本: Windows 11 Visual Studio 2022 CUDA 12.0 LibTorch 1.13.1_cu11.7 目录一、LibTorch简介二、LibTorch下载安装三…...

Java并发编程实战二

线程间的通讯方式 1.volitate(缓存一致性协议),synchronize,lock(都保证可见性) 2.wait.notify,await(),signal(前两个是Object,后两个属于lock) 3.管道输入、输出流 (示例代码:PipeInOut.java)(目前几乎没人使用) 管道输入/输…...

Linux中最基本的命令ls的用法有哪些?

Linux是一种流行的操作系统,被广泛应用于服务器和个人电脑。Linux命令行界面是使用Linux操作系统的关键。其中一个最基本的命令是"ls"命令,该命令用于列出指定目录中的所有文件和子目录。在这篇文章中,我们将探讨ls命令及其各种用途…...

第 100002(十万零二)个素数是多少?

题目描述 素数就是不能再进行等分的整数。比如7,11。而 9 不是素数,因为它可以平分为 3 等份。一般认为最小的素数是2,接着是 3,5,... 请问,第 100002(十万零二)个素数是多少? 请注意&#xff1…...

Lua迭代器

Lua迭代器 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。 在 Lua 中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。 泛型 f…...

同步与互斥之信号量

目录 1、信号量用于线程的互斥 验证 2、信号量用于线程的同步 验证 3、无名信号量用于进程间互斥 代码一 代码二 验证 4、有名信号量 用于进程间同步和互斥 验证 信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它…...

如何当个优秀的文档工程师?从 TC China 看技术文档工程师的自我修养

本文系 NebulaGraph Community Academic 技术文档工程师 Abby 的参会观感,讲述了她在中国技术传播大会分享的收获以及感悟。 据说,技术内容领域、传播领域的专家和决策者们会在中国技术传播大会「tcworld China 2022」大会上分享心得。作为一名技术文档工…...

如何学习k8s

学习Kubernetes可以遵循以下步骤: 了解Kubernetes的基本概念和架构。学习Kubernetes前,需要了解它的基本概念和组成部分,包括Pod、Service、ReplicaSet、Deployment、Namespace等等,同时也需要了解Kubernetes的整体架构和工作原理…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

云原生时代的系统设计:架构转型的战略支点

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、云原生的崛起&#xff1a;技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深&#xff0c;传统的 I…...

Android Framework预装traceroute执行文件到system/bin下

文章目录 Android SDK中寻找traceroute代码内置traceroute到SDK中traceroute参数说明-I 参数&#xff08;使用 ICMP Echo 请求&#xff09;-T 参数&#xff08;使用 TCP SYN 包&#xff09; 相关文章 Android SDK中寻找traceroute代码 设备使用的是Android 11&#xff0c;在/s…...

【系统架构设计师-2025上半年真题】综合知识-参考答案及部分详解(回忆版)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20~21题】【第…...

盲盒一番赏小程序:引领盲盒新潮流

在盲盒市场日益火爆的今天&#xff0c;如何才能在众多盲盒产品中脱颖而出&#xff1f;盲盒一番赏小程序给出了答案&#xff0c;它以创新的玩法和优质的服务&#xff0c;引领着盲盒新潮流。 一番赏小程序的最大特色在于其独特的赏品分级制度。赏品分为多个等级&#xff0c;从普…...