Spring使用总结

news2024/11/25 16:28:40

Spring框架使用

  • 前言
  • 处理事务管理
    • 声明式事务:
    • 编程式事务:
  • 框架核心
    • 常见注解
  • AOP( 面向切面编程)
    • 切面和通知有哪些类型?
    • 切面的类型
    • 通知类型
    • AOP实现
    • 使用场景
  • IOC(管理所有的JavaBean)
    • 依赖注入(DI)
    • 优势
    • 如何实现:主要是两种实现方式
      • 公共代码
      • xml
      • 注解
  • 总结


前言

spring是一个轻量的、开源的企业级程序开发框架,通过提供基础设施支持,提供内置的设计模式,简化了复杂的企业开发过程。

总之它可以高效完成各种任务,提高开发效率和代码质量。

处理事务管理

事务管理的两种事务:声明式事务与编程式事务

声明式事务:

通过配置去实现,我们只需要使用切面注解来实现事务管理功能@Transactional

  • 引入依赖
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-tx</artifactId>
	    <version>{版本号}</version>
	</dependency>
	
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-jdbc</artifactId>
	    <version>{版本号}</version>
	</dependency>
  • 代码示例
@Service
@Transactional
public class ExampleServiceImpl implements ExampleService {
  @Override
  public void doSomething() {
      // 业务逻辑处理
      ...
  }
}

编程式事务:

使用spring提供的事务管理器接口PlatformTransactionManager去实现提供了事务的提交,回滚。

	/**
		这块就是注入PlatformTransactionManager的内容
	 //引入事务管理器
	   @Autowired
	   private ApplicationContext applicationContext;
	 //创建事务定义
	   PlatformTransactionManager transactionManager = applicationContext.getBean(PlatformTransactionManager.class);
	**/
	
//在这里就直接引入了事务定义了
@Autowired
private PlatformTransactionManager transactionManager;

public void doSomething() {
    //开启事务
    TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
    try {
        // 业务逻辑处理
        ...
        transactionManager.commit(status);
    } catch (Exception ex) {
        transactionManager.rollback(status);
        throw ex;
    }
}

框架核心

框架的核心是IOC(控制反转)与AOP(面向切面的编程),下面我先介绍里面常用的注解然后再去了解

常见注解

  • @Controller、@Service、@Mapper、@Repository、@Component、@Bean、@Configuration:标记在SpringMVC中的各个控制器,都被注解为Spring Bean组件,可以通过@Autowired去自动装配这些组件
  • @Autowired:这些注解主要是用于去指定bean的注入与使用
  • AOP相关注解
  • 事务相关注解
  • @RequestMapping、@ResponsBody(web相关注解):数据的请求与接收

AOP( 面向切面编程)

首先它最重要的一种思想就是代理模式,它与 OOP( 面向对象编程) 相辅相成,它们的单位不同

  • OOP 中, 我们以类(class)作为我们的基本单元,
  • AOP 中的基本单元是 Aspect(切面)

切面和通知有哪些类型?

切面可以理解为是切点(那个类与方法需要被拦截)与通知(具体的逻辑实现)的合集

简单理解来说就是切面就是这个地方需要什么横切逻辑,而通知就是这个地方需要用什么具体的逻辑。

放个图了解一下啊
切面思想

下面是常见的切面类型

切面的类型

  • 前置通知(@Before):目标方法前执行
  • 后置通知(@After):(后执行)
  • 返回通知(@AfterReturning):返回结果后执行
  • 异常通知(@AfterThrowing):抛出异常后执行
  • 环绕通知(@Around):目标方法执行前后都执行(可以控制目标方法的执行过程)

通知类型

  • 前置通知
  • 后置通知
  • 异常抛出通知
  • 方法环绕通知

AOP实现

  • 定义切点(在spring中一般使用注解的方式去定义切点,并且去注释那些需要去实现)
    execution([访问修饰符] [返回类型] [包名].[类名].[方法名](..)

  • 实现通知:这里写具体的实现逻辑,通俗点讲这就是要写插入的代码
    下面我举一个环绕通知(代码执行前后都要去执行)的栗子:

      // 这里需要将切点给导入
      @Around("servicePointcut()")
      public void beforeAdvice(JoinPoint joinPoint) {
          String methodName = joinPoint.getSignature().getName();
          System.out.println("Around calling method: " + methodName);
      }
    

JoinPoint 利用反射与动态代理来获取各种信息

  1. 获取被拦截方法的名称、类型、参数名数组
    String methodName = joinPoint.getSignature().getName();
    signature.getReturnType().toString(); // 返回类型
    signature.getParameterNames(); // 参数名数组
  2. 获取被拦截方法的参数列表
    Object[] args = joinPoint.getArgs();
  3. 获取被拦截方法所在的类
    Class<?> targetClass = joinPoint.getTarget().getClass();
  • 声明切面:从上面的概念我们知道切面其实就是切点与通知的组合,那么我们这里要做的就是将这两个进行组合。下面是代码示例(@Aspect):这里的代码就直接使用component进行添加到bean容器中,不需要再去配置。
    @Aspect
    @Component
    public class ExampleAspect {
        @Around("servicePointcut()")
        public void beforeAdvice(JoinPoint joinPoint) {
            String methodName = joinPoint.getSignature().getName();
            System.out.println("Around calling method: " + methodName);
        }
    }
    
  • 目标实现:这里就是将具体的目标进行实现具体的业务逻辑。
    @Service
    public class ExampleServiceImpl implements ExampleService {
        public void doSomething() {
            System.out.println("doing something...");
        }
    }
    
  • 启动类添加相关注解
    @EnableAspectJAutoProxy

使用场景

使用AOP主要是为了将业务功能与通用功能给抽取出来,从而提高代码的可读性与可复用性。

  • 权限控制
  • 日志管理
  • 缓存控制
  • 异常控制

IOC(管理所有的JavaBean)

IOC是一种设计模式的思想,它的核心就是将两个类之间的依赖关系从编码时确定变为运行时动态确定工厂类,实例化对象,管理对象之间的依赖关系。

依赖注入(DI)

DI实际上是ioc的一种实现方式。

通过容器自动将一个对象依赖的其他对象注入到这个对象中,实现松耦合。

优势

要了解这个的优势,就需要知道在之前遇到这些问题时候如何去处理:

在之前程序员通常需要通过手动的方式去管理对象之间的依赖关系的。
当一个对象需要另一个对象时,程序员会手动创建该对象并将其传递给需要它的对象。

如何实现:主要是两种实现方式

下面演示在一个MVC中的使用案例

公共代码

  • 定义Service接口规范

    public interface UserService {
    	 String getInfo();
    }
    
  • 接口实现类

    public class UserServiceImpl implements UserService {
     public String getInfo() {
         return "User information";
     }
    }
    
  • controller实现类

    public class UserController {
        private final UserService service;
    
        // 使用构造器注入
        public UserController(UserService service) {
            this.service = service;
        }
    
        public void showInfo() {
            System.out.println(service.getInfo());
        }
    }
    

xml

通过定义bean的标签来管理容器及其属性,并使用依赖注入的方式来装配这些类和属性。

示例:先使用xml将上面的实现注入

<bean id="userService" class="com.example.UserServiceImpl"/>
<bean id="userController" class="com.example.UserController">
  <constructor-arg ref="userService"/>
</bean>

下面我们在使用java实现类

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserController controller = (UserController) context.getBean("userController");
controller.showInfo(); // 输出 "User information"

注解

注解相比于xml的最大优势就是可以简化开发、更加直观灵活

示例:还是将上述代码注入并实现

  • 直接在实现类上面添加@Component注解,这个注解就会被扫描到
    @Component
    public class UserServiceImpl implements UserService {
        public String getInfo() {
            return "User information";
        }
    }
    
  • 然后我们在实现类中在使用@Autowired注入到实现代码中,在直接调用里面的方法
    @Component
    public class UserController {
        @Autowired
        private UserService service;
    
        // ...
    }
    

总结

学会这些思想和技术的应用可以帮助开发者提高代码的质量和执行效率,更好地完成各种任务。


最后希望能帮到大家,你们的点赞是我写优质博客的最大动力~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/459290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

道氏转02,水羊转债,超达转债,晓鸣转债,中旗转债上市价格预测

道氏转02 基本信息 转债名称&#xff1a;道氏转02&#xff0c;评级&#xff1a;AA-&#xff0c;发行规模&#xff1a;26.0亿元。 正股名称&#xff1a;道氏技术&#xff0c;今日收盘价&#xff1a;13.41元&#xff0c;转股价格&#xff1a;15.46元。 当前转股价值 转债面值 / …

大数据三驾马车与hadoop起源

背景介绍 Google成立于1998年是全球最大的搜索引擎公司&#xff0c;主要业务为搜索、云计算、广告技术等&#xff0c;主要利润来自于广告等服务。在21世纪初互联网刚刚兴起&#xff0c;每个企业保存和生产的数据量并不大&#xff0c;已有的技术对数据的保存和处理完全满足业务…

RabbitMQ支持消息的模式

一、简单模式 Simple 二、工作模式 Work 类型&#xff1a;无特点&#xff1a;分发机制 解释&#xff1a;当有多个消费者时&#xff0c;我们的消息会被哪个消费者消费呢&#xff0c;我们又该如何均衡消费者消费信息的多少呢? 主要有两种模式&#xff1a; 2.1 轮询分发&#xf…

2023年江苏专转本成绩查询步骤

2023年江苏专转本成绩查询时间 2023年江苏专转本成绩查询时间预计在5月初&#xff0c;参加考试的考生&#xff0c;可以关注考试院发布的消息。江苏专转本考生可在规定时间内在省教育考试院网&#xff0c;在查询中心页面中输入准考证号和身份证号进行查询&#xff0c;或者拨…

IDEA的BitoAI插件的简单使用指南(包括安装和注册)

注&#xff1a;插件声称使用的是GPT-4模型算法&#xff0c;并且多平台支持&#xff0c;包括vscode、pycharm等&#xff0c;这里只演示idea的安装和使用 1.安装 直接在idea的插件商城中搜索即可 2.注册 使用bito插件需要使用邮箱注册&#xff0c;注册非常简单&#xff0c;只需要…

【一起撸个DL框架】2 节点与计算图的搭建

CSDN个人主页&#xff1a;清风莫追 欢迎关注本专栏&#xff1a;《一起撸个DL框架》 文章目录 2 节点与计算图的搭建 &#x1f352;2.1 简介2.2 设计节点类2.3 节点类的具体实现2.4 搭建计算图进行计算2.5 小结2.6 题外话——节点存储的值 2 节点与计算图的搭建 &#x1f352; …

数据湖Iceberg-存储结构(2)

文章目录 存储结构数据文件 data files表快照 Snapshot清单列表 Manifest list清单文件 Manifest file 数据湖Iceberg-简介(1) 数据湖Iceberg-存储结构(2) 数据湖Iceberg-Hive集成Iceberg(3) 数据湖Iceberg-SparkSQL集成(4) 数据湖Iceberg-FlinkSQL集成(5) 数据湖Iceberg-Flink…

Redis入门到入土(day01)

NoSQL概述 为什么用NoSQL 1、单机MySQL的美好年代 在90年代&#xff0c;一个网站的访问量一般不大&#xff0c;用单个数据库完全可以轻松应付&#xff01; 在那个时候&#xff0c;更多的都是静态网页&#xff0c;动态交互类型的网站不多。 上述架构下&#xff0c;我们来看看…

一文详细介绍查看和启用nginx日志(access.log和error.log),nginx错误日志的安全级别,自定义访问日志中的格式

文章目录 1. 文章引言2. Nginx访问日志(access.log)2.1 简述访问日志2.2 启用Nginx访问日志2.3 自定义访问日志中的格式 3. Nginx错误日志(error.log)3.1 简述错误日志3.2 启用错误日志3.3 Nginx错误日志的安全级别 4. 文末总结 1. 文章引言 我们在实际工作中&#xff0c;经常使…

vue3中如何引入element-icon并使用

简单来说&#xff0c;步骤就是&#xff1a; 安装——注册——按需引入——使用 安装 # NPM $ npm install element-plus/icons-vue # Yarn $ yarn add element-plus/icons-vue # pnpm $ pnpm install element-plus/icons-vue注册 您需要从 element-plus/icons-vue 中导入所有…

【BI软件】零编程构建财务分析模型(行计算模型)

上一讲和大家讲到&#xff0c;自定义SQL是用个性化的开发去满足个性化的需求&#xff0c;而分析模型则是用共性的开发去满足个性化的需求。而分析模型的好处显而易见&#xff0c;通过分析模型来开发报表&#xff0c;更灵活、更高效&#xff0c;而且开发及运维的成本非常低。同时…

C++中引用的基本内容

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】 引用&#xff0c;其实没啥特别的&#xff0c;就是起外号&#xff0c;或者说起小名。就比如说孙悟空就有很多外号&#xff0c;如…

基于Python实现个人手机定位分析

TransBigData是一个为交通时空大数据处理、分析和可视化而开发的Python包。本文就来用它实现个人手机定位分析&#xff0c;感兴趣的小伙伴可以了解一下 但其实交通时空大数据并不仅仅局限于交通工具产生的数据&#xff0c;我们的日常生活中也会产生大量的数据。比如我们的手机…

前端 百度地图绘制路线加上图片

使用百度官方示例的方法根据起终点经纬度查询驾车路线但是只是一个线路 <template><div class"transportInfo"><div id"mapcontainer" class"map">11</div><div class"collapse"><el-collapse v-mo…

CA(证书颁发机构)

CA 根证书路径/csk-rootca/csk-ca.pem&#xff1b; ~ 签发数字证书&#xff0c;颁发者信息&#xff1a;(仅包含如下信息) C CN ST China L BeiJing O skills OU Operations Departments CN CSK Global Root CA 1.修改证书的路径以及相关配置 vi /etc/pki/tls/op…

el-upload文件上传组件的封装

样式1 样式2 上传的格式 // annexUrl 数据格式如下[{"uid": 1682329534561,"name": "2023/04/24/273f36b860a74e79be3faed3ce20236f.pdf","suffix": ".pdf","url": "http://192.168.0.254:19000/annex/2023/…

JVM系列(十) 垃圾收集器之 Parallel Scavenge/Old

上篇文章我们讲解了单线程垃圾收集器 Serial/SerialOld &#xff0c;与之相对应的多线程垃圾收集器就是 Parallel Scavenge/Old&#xff0c; 本文我们讲解下多线程垃圾收集器 Parallel Scavenge/Old 垃圾收集器 新生代收集器&#xff1a; Serial、ParNew、Parallel Scavenge&…

数据库 | 什么是视图?怎么使用?什么是索引?

目录 一、视图 1 、视图概念 2、为什么要使用视图 3 、性能问题 4 、定义视图 5、查看视图 6、删除视图 二、索引 1、引入索引的问题 2、索引是什么 3、索引为什么选择b树 一、视图 1 、视图概念 视图&#xff08;View&#xff09;是一种虚拟存在的表&#xff0c;对…

【DRF配置管理】如何建立完善的DRF自带接口docs文档

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 DRF应用和管理 【DRF配置管理】Django使用DRF框架 【DRF配置管理】如何实现JWT认证 【DRF配置管理】如何在视图函数配置参数(一) 【DRF配置管理】如何…

okcc呼叫问题的解决方法(建议收藏)

很多客户开始使用OKCC呼叫中心系统&#xff0c;运营经常遇到的问题是呼叫打不通&#xff0c;无话单&#xff0c;呼叫秒挂&#xff0c;语音提示"您没有使用业务的权限"等等异常情况&#xff0c;而且反馈线路正常&#xff0c;使用呼叫系统拨打就是呼不通。 OKCC系统…