当前位置: 首页 > 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的整体架构和工作原理…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...