Spring框架使用总结

news2024/11/25 12:49:09

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/447850.html

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

相关文章

像素比特行列置乱加密算法安全性分析

比特行列置乱加密 将MN大小的灰度图像每个像素值转换为8bit二进制&#xff0c;得到M8N大小的二值图像。 基于加密秘钥&#xff0c;生成随机序列TM和TN分别对二进制图像的行列进行置乱&#xff0c;生成置乱加密后的图像。 Logistic混沌序列加密&#xff1a; 选择明文攻击过程 …

Node内置模块 【path模块】

文章目录 &#x1f31f;前言&#x1f31f;path模块&#x1f31f;引用模块&#x1f31f;常用属性&#x1f31f;path.sep&#x1f31f;在MacOSX、 Unix、Linux操作系统上&#xff1a;&#x1f31f;在 Windows 上&#xff1a; &#x1f31f;常用方法&#x1f31f;将路径转换为对象…

【python视图1】networkx操作Graph图

一、说明 数据可视化需要显示种种数据&#xff0c;matplotlib负责曲线类画图&#xff0c;然而类似于图论的操作用什么方法。这里用networkx程序包完成。本文专门介绍这种程序包的用法。 二、生成图&#xff08;Creating a graph&#xff09; 2.1 创建一个没有节点和边的空图。…

Linux:centos 7:查看运行级别 控制init运行级别 已安装图形化以后设置开机进入图形化或命令行

0 target 关机状态&#xff0c;使用该级别时将关闭主机 1 rescue.target 单用户模式&#xff0c;不需要密码验证即可登录系统&#xff0c;多用于系统维护 …

HTTP 的工作原理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、简单 HTTP二、HTTP 连接请求 I请求Ⅱ 持久 HTTP并执行 HTTP默认浏览器连接设置总结 前言 在处理 Web 性能监控或优化时&#xff0c;了解 HTTP 协议的基础知…

leetcode每日一题——美团笔试题【3】

第一题&#xff1a; 股票的最大利润 假设把某股票的价格按照时间先后顺序存储在数组中&#xff0c;请问买卖该股票一次可能获得的最大利润是多少&#xff1f;示例 1:输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天&#xff08;股票价格 1&#xff09;的时候买入&#xff0c;在…

UWB隧道人员定位技术应用,施工作业安全精准保障

隧道施工的安全不仅关系到工程项目的质量和施工效率&#xff0c;也关系到我国的资金安全、施工人员和人民的生命财产安全。如何有效加强隧道施工的安全管理能力&#xff0c;成为隧道施工企业管理者最关心的问题。国家铁道局在《关于加强铁路隧道工程安全工作的若干意见》中指出…

人力资源软件的六个功能,你知道吗?

企业组织越来越多地转向通过人力资源软件来简化他们的人力资源运作。在疫情开始后&#xff0c;人力资源软件的采用尤其迅猛&#xff0c;因为组织希望无缝地管理他们的远程和混合员工。根据SkyQuest的调查人力资源技术市场预计到2028年将达到356.8亿美元。 如果您正在考虑采用人…

面试题思路分享以及延伸问题探讨三

面试题思路分享以及延伸问题探讨 1.前言2. 环形链表初阶2.1 审题2.2 代码实现以及紧急情况的处理方法2.3 延伸问题2.3.1 为什么slow和fast一定会遇上?2.3.2 走n步会是什么样的情况? 3. 环形链表进阶3.1 审题3.2 代码实现3.3 方法二:相交链表法 4. 复制带随机指针的链表4.1审题…

vue3组件二次封装Ui处理

vue 组件二次封装Ui处理 vue 组件二次封装Ui处理 在Vue开发中&#xff0c;我们常常需要使用UI框架提供的组件。但是UI框架的组件可能并不符合我们的需求&#xff0c;这时候就需要进行二次封装。下面是一些关于Vue组件二次封装Ui处理的技巧&#xff1a; 常规时候咱们使用组件…

深元AI盒子在矿山安全生产中实现皮带跑偏、异物、煤流量、大块煤等识别

摘要&#xff1a;随着技术的发展&#xff0c;矿山安全生产已经从传统的人工监测逐步转向现代化智能化。本文旨在探讨矿山安全生产AI盒子在皮带跑偏、异物、煤流量和大块煤之外的功能&#xff0c;以期进一步提高矿山生产的安全性和效率。 正文&#xff1a; 一、引言 矿山安全生…

【获奖案例巡展】信创先锋之星——中信证券基于国产图数据库构建企业图谱的应用实践

为表彰使用大数据、人工智能等基础软件为企业、行业或世界做出杰出贡献和巨大创新的标杆项目&#xff0c;星环科技自2021年推出了“新科技 星力量” 星环科技科技实践案例评选活动&#xff0c;旨在为各行业提供更多的优秀产品案例&#xff0c;彰显技术改变世界的力量&#xff0…

vue2、vue3实现暗黑模式

1、序言 elementPlus、naive UI这些UI组件里面封装好了暗黑模式&#xff0c;直接使用相关api即可实现暗黑模式切换功能&#xff0c;而elementUI没有封装好&#xff0c;我们可以看看elementPlus、naive UI如何实现暗黑模式&#xff0c;然后在elementUI中模仿&#xff0c;从而实现…

【C++】模板初识

C模板初识 1.泛型编程2.函数模板2.1.函数模板概念2.2.函数模板格式2.3.函数模板使用的原理2.4.函数模板的实例化2.5.模板参数的匹配原则 3.类模板3.1.类模板格式3.2.类模板的实例化 1.泛型编程 在实际编程中&#xff0c;经常会用到交换函数。比如有整型值的交换&#xff0c;浮…

Nacos 鉴权系统源码讲解

目录 1. 介绍 2. Nacos SPI 鉴权机制 3. 后台管理 / HTTP 接口鉴权 4. 客户端 / GRPC 接口鉴权 1. 介绍 鉴权功能默认没有开启&#xff0c;开启后的效果就是 Nacos 的接口需要用户登录并且具有权限才能调用该接口。例如注册实例、发布配置等。 鉴权也就是 我是谁、我能干…

探讨接口测试颗粒度

偶然间在论坛上看到一个帖子&#xff0c;帖子内容如下&#xff1a; 假设现在有一个新增商品的接口&#xff0c;返回的参数中有新增商品的 id&#xff08;每次返回的 id 都不一样&#xff09;、success&#xff08;判断是否成功&#xff0c;0 失败 1 成功&#xff09; 1. 接口…

代码随想录之对称二叉树

本内容来自代码随想录 使用后序遍历。 class Solution { public:bool traversal(TreeNode* left,TreeNode* right){//处理空节点情况if (left nullptr && right ! nullptr) return false;else if (left ! nullptr && right nullptr) return false;else if …

Python人工智能之混合高斯模型运动目标检测详解分析

搬运工项目&#xff0c;换个平台纪录&#xff0c;之前的广告太多 运动目标检测是计算机视觉领域中的一个重要内容&#xff0c;其检测效果将会对目标跟踪与识别造成一定的影响&#xff0c;本文将介绍用Python来进行混合高斯模型运动目标检测&#xff0c;感兴趣的朋友快来看看吧 …

4.2寸黑白红TFT电子标签【基站版】

ESL_TFT_4.2_V4 产品参数 产品型号 ESL_TFT_4.2_V4 尺寸(mm) 101.7*84.4*6.5mm 显示技术 TFT反射式 显示区域(mm) 84.8(H) * 63.6(V) 分辨率(像素) 400*300 像素尺寸(mm) 0.212x0.212 显示颜色 黑/白/红 视觉角度 45/45/60/60 工作温度 -20-70℃ 产品重量…

Spring6从入门到精通 第一章 带你玩转Spring

这里写目录标题 一 Spring框架产生的原因二 Spring6配置的关键环节 一 Spring框架产生的原因 传统的JavaWeb存在着耦合度较高的问题&#xff0c;而且实现完整的的MVC三层架构&#xff0c;开发成本过大&#xff0c;因此出现了Spring这个轻量级的开发框架&#xff0c;相当于建筑里…