Spring AOP和Spring事务管理

前言:

在现代软件开发中,处理横切关注点(cross-cutting concerns)和管理事务是非常重要的技术。Spring框架提供了两个核心特性来处理这些问题:Spring AOP和Spring事务管理。本文将详细探讨Spring AOP和Spring事务管理的概念、原理以及如何在实际应用中应用它们。

  • Spring AOP详解

1、Spring AOP简介

Spring AOP(Aspect-Oriented Programming)是一种编程风格,它旨在解决横切关注点的问题。它通过分析程序结构中的关注点,提供了一种补充面向对象编程(OOP)的方法,这就是面向切面编程(Aspect-Oriented Programming)。使用Spring AOP,我们可以将横切逻辑(例如日志记录、事务管理等)与核心业务逻辑分离开来,从而实现更好的模块化和复用性。

2、动态代理技术

(1)JDK代理:一种基于接口的动态代理技术,它通过反射机制动态地生成代理类来在被代理对象和代理对象之间进行通信。

(2)cglib代理:基于父类的动态代理技术。cglib代理不需要接口实现,它是直接对被代理对象进行子类的创建和扩展,从而生成代理类。由于是生成子类,所以被代理对象必须有可继承的父类。

3、AOP术语

(1)切面(Aspect):切面是横切关注点的封装。它是一个包含通知和切点的类。通知定义了在连接点处所要执行的程序代码以及执行时机,切点定义了切面将在哪些方法上插入。

(2)切点(Pointcut):切点是指一个表达式,用于描述横切关注点所应用的方法范围。切点决定了切面在哪些方法上被织入。

(3)通知(Advice):通知是在切点处执行的代码。它定义了在连接点处要执行的程序逻辑和执行时机。通知的类型包括前置通知、后置通知、环绕通知、异常通知和最终通知。

(4)连接点(Join Point):连接点是在应用程序执行过程中满足切点定义的具体位置。它可以是方法调用、方法执行、异常抛出等。切面将在连接点处织入,并在相应的时机执行通知。

(5)织入(Weaving):织入是将切面应用于目标对象的过程。它可以是编译时的静态织入,也可以是运行时的动态织入。编译时织入是在编译期间将切面代码编译到目标对象中。运行时织入是在程序运行期间动态地创建代理对象,将切面逻辑织入到目标对象中。

AOP体系梳理图:

4、通过xml的方式使用AOP

(1)在Spring配置额文件头部相应的地方加入xmlns:aop="http://www.springframework.org/schema/aop",在xsi:schemaLocation中加入http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop.xsd

  1. 在Spring配置文件中加入AOP切面配置
<!-- AOP配置根节点 -->

<aop:config>

<!-- 定义切点 -->

<aop:pointcut expression="execution(* service.*.*(..))"

id="pointcut" />

<!-- 定义切面 -->

<aop:aspect ref="logService">

<!-- 定义前置通知 -->

<aop:before pointcut-ref="pointcut" method="writeLog" />

</aop:aspect>

</aop:config>

说明:

A.定义通知类bean

B.通过aop:config标签配置所有的切面

C.通过aop:pointcut标签配置切点,使用切点表达式来指定范围

  1. 通过aop:aspect定义切面,指定引用的通知以及通知的类型和切点
  2. 通知根据通知的时机区分有五种类型:

前置通知:使用aop:before标签,在方法调用前执行。前置通知可以使用@Before注解实现。

后置通知:使用aop:after标签,在方法调用后执行,无论方法内部是否抛出异常。后置通知可以使用@After注解实现。

后置返回通知:使用aop:after-returning标签,在方法调用后执行,并且方法内部不能抛出异常。后置返回通知可以使用@AfterReturning注解实现。

后置异常通知:使用aop:after-throwing标签,在方法内部抛出异常时执行。后置异常通知可以使用@AfterThrowing注解实现。

环绕通知:使用aop:around标签,在方法调用前后都执行。环绕通知是最为灵活的通知类型,可以完全自定义目标方法的调用、传参、返回值和异常处理。环绕通知可以使用@Around注解实现。

说明:

F.前四种通知的方法里面我们可以通过JoinPoint参数获取连接点信息,比如参数信息等,方便进行处理

G.环绕通知的方法里我们通过ProceedingJoinPoint参数来获取连接点信息

5、注解方式使用AOP

(1)在spring配置文件中开启aop注解方式

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

  1. 使用@Aspect定义切面,使用@Pointcut定义切点,使用@Before、@After、@Around、@AfterReturning、@AfterThrowing定义通知的应用时机。
  1. 在注解方式中,我们可以使用@Aspect注解将一个Java类标记为切面,并使用@Before/@After等注解在适当的位置声明要执行的通知代码。

以下是一个简单的注解示例:

@Component

@Aspect

public class LoggingAspect {

    @Before("execution(* com.example.UserService.addUser(..))")

    public void logBefore(JoinPoint joinPoint) {

        System.out.println("Adding user: " + Arrays.toString(joinPoint.getArgs()));

    }

}

在这个示例中,我们创建了一个LoggingAspect类,并将其标记为@Aspect注解。我们使用@Before注解声明要在UserService类的addUser方法执行之前执行的代码。@Before("execution(* com.example.UserService.addUser(..))")表示切点表达式,说明我们要拦截执行UserService类的addUser方法。在logBefore方法中,我们将会输出添加用户的详细信息。

  • Spring事务管理详解
  1. 事物的特性:
  1. 原子性(Atomicity):事务被视为不可分割的最小操作单元,要么全部操作成功,要么全部失败回滚。

(2)一致性(Consistency):事务前后数据的状态应该是一致的,即满足业务规则的要求。如果一个事务执行失败,则数据回到事务开始前的状态,保持数据的一致性。

(3)隔离性(Isolation):多个事务并发执行时要相互隔离,每个事务之间互不影响。因此,在并发环境下,不同的事务之间应该是互相隔离的,这样才能保证每个事务执行的结果都是正确的,不会相互干扰。

(4)持久性(Durability):事务完成后,对系统的影响是永久的。事务处理完成后,对数据的修改被永久地保存到数据库中,即使系统崩溃也不会受到影响。

2、Spring事务管理概述

Spring事务管理的工作原理是利用了Spring框架中的一些事务相关的组件和注解,可以将代码中需要进行事务处理的代码块声明为一个事务,并使用Spring事务管理器来管理这些事务,这样就可以确保在整个事务过程中,所有的数据库访问操作都能被统一地纳入到事务中进行管理,从而保证整个事务的一致性和可靠性。

3、在 Spring 的事务模块(spring-tx-5.3.9.jar)中包括事务管理的三个核心接口。

(1)PlatformTransactionManager接口是Spring提供的平台事务管理器,主要用于管理事务。以下是此接口中提供的三个事物操作方法:

TransactionStatus getTransaction(TransactionDefinition definition);

用于获取事务以及状态信息

void commit(TransactionStatus status);

用于提交事务

void rollback(TransactionStatus status);

用于回滚事务

(2)PlatformTransactionManager接口只是代表事务管理的接口,并不知道底层是如何管理事务的,具体如何管理事务则由它的实现类来完成。

常用的接口实现类:

org.springframework.jdbc.datasource.DataSourceTransactionManager用于配置JDBC数据源的事务管理器;

org.springframework.orm.hibernate4.HibernateTransactionManager

用于配置Hibernate的事务管理器;

org.springframework.transaction.jta.JtaTransactionManager

用于配置全局事务管理器

(3)TransactionDefinition接口是事务定义(描述)的对象,该对象中定义了事务基本属性,并提供了获取事务基本属性的方法。

String getName( )获取事务对象名称;

int getIsolationLevel( )获取事务的隔离级别;

int getPropagationBehavior( )获取事务的传播行为;

int getTimeout( )获取事务的超时时间;

boolean isReadOnly( )获取事务是否只读;

4、事务的基本事务属性

A.传播行为(propagation behavior):当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。Spring定义了七种传播行为

B.隔离级别(isolation level):定义了一个事务可能受其他并发事务的影响程度。多个事务并发运行,经常会操作相同的数据来完成各自的任务,可能会出现脏读,不可重复读和幻读的问题。隔离级别有四种

C.是否只读(isReadOnly):如果一个方法内都是对数据库的select操作,那么可以设置方法事务为只读,数据库也会对该事务进行特定的优化。只读事务内不能有insert、update、delete的操作

D.事务超时(timeout):事务可能设计对后端数据库的锁定,所以长时间的事务运行会不必要的占用数据库资源,设置事务超时时间可以及时释放资源

5、TransactionDefinition

(1)TransactionDefinition接口是事务定义(描述)的对象,该对象中定义了事务基本属性,并提供了获取事务基本属性的方法,具体如下:

  • String getName( ); (获取事务对象名称)                    
  • int getIsolationLevel( );(获取事务的隔离级别)             
  • int getPropagationBehavior( );(获取事务的传播行为)
  • int getTimeout( );(获取事务的超时时间)                      
  • boolean isReadOnly( );(获取事务是否只读)   

DefaultTransactionDefinition是Spring提供的TransactionDefinition接口的默认实现类,该类定义的事务规则如下:

public class DefaultTransactionDefinition implements TransactionDefinition, Serializable {

private int propagationBehavior = PROPAGATION_REQUIRED;

private int isolationLevel = ISOLATION_DEFAULT;

private int timeout = TIMEOUT_DEFAULT;

private boolean readOnly = false;

//略

}

也可以通过该类对象的set方法为事务设置其他的属性值。

6、TransactionStatus

TransactionStatus接口是事务的状态,它描述了某一时间点上事务的状态信息。该接口中包含6个方法,具体如下:

  • void flush(); (刷新事务)
  • boolean hasSavepoint();(获取是否存在保存点)
  • boolean isCompleted(); (获取事务是否完成)
  • boolean isNewTransaction();(获取是否为新事务)
  • boolean isRollbackOnly(); (获取事务是否回滚)
  • void setRollbackOnly();(设置事务回滚)

7、事物管理方式

  • 添加事务管理器组件

在applicationContext.xml中配置一个事务管理器组件,提供对事务处理的全面支持和统一管理

<!--定义事务管理器 -->

<bean id="txManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource" />

</bean>

  • 在业务逻辑类中使用事务管理器

@Autowired

private PlatformTransactionManager txManager;//通过依赖注入使用事务管理器

  • 在方法中编程实现事务管理

//定义事务规则(隔离级别、传播行为)

DefaultTransactionDefinition definition=new DefaultTransactionDefinition();

//开启事务管理,并返回事务状态

TransactionStatus status = txManager.getTransaction(definition);

try {

//转账业务逻辑(省略)

txManager.commit(status); //提交事务

} catch (Exception e) {

txManager.rollback(status); //如果出现异常回滚事务

}

  • 编程式事务管理缺点

编程式事务管理必须要在业务逻辑中包含额外的事务管理代码。和业务逻辑代码产生了耦合,产生了代码冗余,不方便代码的维护和扩展。

  • 编程式事务管理优点

声明式事务管理最大的优点在于开发者无需通过编程的方式来管理事务,只需在配置文件中进行相关的事务规则声明,就可以将事务应用到业务逻辑中。这使得开发人员可以更加专注于核心业务逻辑代码的编写,在一定程度上减少了工作量,提高了开发效率,所以在实际开发中,通常都推荐使用声明式事务管理。

  1. 声明式事务管理

声明式事务管理的原理

通过AOP技术实现的事务管理,主要思想是将事务作为一个“切面”代码单独编写,然后通过AOP技术将事务管理的“切面”植入到业务目标类中

如何实现Spring的声明式事务管理

     Spring的声明式事务管理可以通过两种方式来实现,一种是基于XML的方式,另一种是基于注解的方式。

  • 基于XML方式的声明式事务

基于XML方式的声明式事务是在配置文件中通过<tx:advice>元素配置事务规则来实现的,然后通过使用<aop:config>编写的AOP配置,让Spring自动对目标生成代理。<tx:advice>元素及其子元素如下图所示:

配置<tx:advice>元素的重点是配置<tx:method>子元素,上图中使用灰色标注的几个属性是<tx:method>元素中的常用属性。其属性描述具体如下:

  1. 添加事务管理器组件:

//在XML配置文件中添加一个事务管理器组件,用于管理事务操作:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="dataSource"/>

</bean>

//这里使用了DataSourceTransactionManager来管理事务,确保根据需要将dataSource设置为适当的数据源。

  1. 使用 <tx:advice> 标签配置事务规则

//因为要用到tx标签配置事务,需要修改applicationContext.xml文件头

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="

       http://www.springframework.org/schema/beans

       http://www.springframework.org/schema/beans/spring-beans.xsd

       http://www.springframework.org/schema/context

       http://www.springframework.org/schema/context/spring-context.xsd

       http://www.springframework.org/schema/aop

       http://www.springframework.org/schema/aop/spring-aop.xsd

       http://www.springframework.org/schema/tx

       https://www.springframework.org/schema/tx/spring-tx.xsd">

//通过 <tx:advice> 标签配置事务规则,定义需要进行事务管理的方法名、事务//传播属性等:

<tx:advice id="txAdvice">

    <tx:attributes>

        <tx:method name="save*" propagation="REQUIRED"/>

        <tx:method name="update*" propagation="REQUIRED"/>

        <tx:method name="delete*" propagation="REQUIRED"/>

        <tx:method name="*" read-only="true"/>

    </tx:attributes>

</tx:advice>

//tx:method 元素定义了一组方法名的模式(例如 name="save*"),以及他们的//事务传播属性(例如 propagation="REQUIRED")。可以根据实际需求进行自定//义配置。

  1. 使用 <aop:config> 配置事务切面:

//使用 <aop:config> 元素配置事务切面,并将事务规则和切入点关联起来:

<aop:config>

    <aop:pointcut id="txPointcut" expression="execution(* com.example.service..*(..))" />

    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />

</aop:config>

//<aop:pointcut> 定义了一个切入点,expression 属性指定了切入的方法表达式。//<aop:advisor> 元素将事务规则 txAdvice 和切入点 txPointcut 关联起来,确保//切入点匹配的方法被应用事务规则。

  • 基于注解方式的声明式事务

1)配置事务管理器

在applicationContext.xml中配置一个事务管理器组件,提供对事务处理的全面支持和统一管理

<!--定义事务管理器 -->

<bean id="txManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource" />

</bean>

2)注册事务注解驱动

在applicationContext.xml中添加对注解配置事务的支持

<tx:annotation-driven transaction-manager=“txManager"/>

3)注册事务注解驱动

在需要事务管理的类或方法上使用@Transactional注解

例如:

@Service

public class MyService {

    @Autowired

    private MyDao myDao;

    @Transactional

    public void saveData(Data data) {

        // 保存数据的逻辑

        myDao.save(data);

    }

    @Transactional(propagation = Propagation.REQUIRED, readOnly = true)

    public Data getDataById(Long id) {

        // 获取数据的逻辑

        return myDao.getById(id);

    }

}

/*@Transactional注解被添加到了saveData()方法和getDataById()方法上。你可以根据实际需求设置propagation(事务传播属性)和readOnly(是否为只读事务)等属性。*/

注意:如果将注解添加在Bean类中的某个方法上,则表示事务的设置只对该方法有效。

使用@Transactional注解时,可以通过参数配置事务详情:

star sky767
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring AOP全面详解(超级详细)
Cr1556648487的博客
09-09 7万+
AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术,如下图所示:AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离,比如Spring的事务,通过事务的注解配置,Spring会自动在业务方法中开启、提交业务,并且在业务处理失败时,执行相应的回滚策略。
Spring aop、jdbc和事务tx练习
11-08
Spring aop、jdbc和事务tx的学习,里面包含了三种的练习,都在不同的包内。
Spring篇】AOP事务管理
Javascript_tsj的博客
05-23 1万+
事务作用:在数据层保障一系列的数据库操作同成功同失败Spring事务作用:在数据层或**业务层**保障一系列的数据库操作同成功同失败数据层有事务我们可以理解,为什么业务层也需要处理事务呢?转账业务会有两次数据层的调用,一次是加钱一次是减钱把事务放在数据层,加钱和减钱就有两个事务没办法保证加钱和减钱同时成功或者同时失败这个时候就需要将事务放在业务层进行处理。Spring为了管理事务,提供了一个平台事务管理器commit是用来提交事务,rollback是用来回滚事务。
Spring AOP实现事务管理
锦鲤(⑉°з°)--♡的博客
07-06 3862
事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。Sping中的事务管理,其实就是对数据库的事务进行管理(提交、回滚)。 在Spring框架中最常用的就是声明式配置事务,而声明式配置可以基于xml进行配置,也可以基于注解进行配置。 一、 基于注解的配置,顾名思义,既然基于注解来配置,就必不可少注解,Spring框架中提供了 @Transactional注解,该注解主...
比较Spring AOP和AspectJ
qq_43842093的博客
12-08 4186
1. 介绍 当前有多个可用的AOP库,这些库必须能够回答许多问题: 它与我现有的或新的应用程序兼容吗? 在哪里可以实施AOP? 它与我的应用程序集成的速度有多快? 性能开销是多少? 在本文中,我们将着眼于回答这些问题,并介绍Spring AOP和AspectJ(这两种最流行的Java AOP框架)。 2. AOP 概念 在开始之前,让我们对术语和核心概念进行快速的高层次审查: 切面–一种标准代码/功能,分散在应用程序的多个位置,通常与实际的业务逻辑(例如,事务管理)不同。每个方面都专注于特定的跨领域功
SpringAOP(图文详解)
lhj520cb的博客
07-16 3万+
Spring实现的AOP是代理模式,给调用者使用的实际是已经过加工的对象,你编程时方法体里只写了A,但调用者拿到的对象的方法体却是xAy。x和y总还是需要你来写的,这就是增强。x和y具体在什么时候被调用总还是需要你来规定的,虽然是基于约定的声明这种简单的规定,这就是切点。
spring AOP实现日志管理
haiboSun的博客
03-16 4855
前言 spring AOP是使用spring提供的切面来横向拓展项目,使得一些和主业务无关的操作尽可能实现解耦,比如说我们经常使用的日志。 注: 需要用到pom文件 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 实操 1、编写一个自
深入理解Spring两大特性:IoC和AOP
热门推荐
null
02-14 9万+
众所周知,Spring拥有两大特性:IoC和AOP。。Spring核心容器的主要组件是Bean工厂(BeanFactory),Bean工厂使用控制反转(IoC)模式来降低程序代码之间的耦合度,并提供了面向切面编程(AOP)的实现。简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面编程(AOP)的容器框架。下面,我们简要说明下这两大特性。
springAOP事务控制源码解析
yejunjian007的专栏
04-30 1138
先总结Spring 事务管理Spring事务管理高层抽象主要包括3个接口:PlatformTransactionManager :事务管理器(用来管理事务,包含事务的提交,回滚) TransactionDefinition :事务定义信息(隔离,传播,超时,只读) TransactionStatus :事务具体运行状态Spring根据事务定义信息(TransactionDefinition)由平...
Spring AOP原理解析——Spring事务
根号三
05-21 1026
Spring申明式事务有两种方式: 基于配置文件 基于注解 一、基于配置文件的事务 &lt;!-- 会重复读,不会脏读事务 --&gt; &lt;tx:advice id="defaultTxAdvice" transaction-manager="transactionManager"&gt; &lt;tx:attributes&gt; &lt;tx:m...
spring注解:spring aop注解详解
weixin_37862824的博客
01-09 1万+
AOP的基本概念、切面、切点、通知、环绕通知
线程池中使用spring aop事务增强
08-25
主要介绍了线程池中使用spring aop事务增强,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Spring框架-AOP和声明式事务
11-13
Spring框架-AOP和声明式事务
spring 整合JDBC和AOP事务的方法
08-27
主要介绍了spring 整合JDBC和AOP事务的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Spring如何基于aop实现事务控制
08-24
主要介绍了Spring如何基于aop实现事务控制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
6、Spring之Bean生命周期~创建Bean(2)
sproutBoy的博客
06-10 693
【代码】6、Spring之Bean生命周期~创建Bean(2)
Spring AI 第三讲Embeddings(嵌入式) Model API 第一讲OpenAI 嵌入
qq_25137131的博客
06-09 912
Spring AI 支持 OpenAI 的文本嵌入模型。OpenAI 的文本嵌入测量文本字符串的相关性。嵌入是一个浮点数向量(列表)。两个向量之间的距离可以衡量它们之间的相关性。距离小表示关联度高,距离大表示关联度低。
springboot与flowable(2):流程部署
游王子的博客
06-10 622
选择建模器应用程序选择要导出的建模点击导出按钮。将导出的文件复制到项目中。
SpringBoot内置数据源
最新发布
2303_79546217的博客
06-11 445
在我们之前学习在配置文件当中配置对应的数据源的时候, 我们设置的数据源其实都是Druid的数据源, 并且其配置有两种方式, 当然这两种方式都需要我们导入对应的有关 德鲁伊 的依赖才行代码如上, 我们已经将对应的数据库的信息都设置完成了, 但是并没有使用哪两种方式, 来设置其数据源具体是什么。
springAOPspring事务的区别
06-01
Spring AOPSpring事务是两个不同的概念,但是在Spring框架中都是非常重要的...因此,可以说Spring AOPSpring事务都是基于AOP技术实现的,但是它们的作用不同,前者主要用于代码的增强,后者主要用于事务的管理。

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

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

热门文章

  • 【虚拟机】在Linux环境中nginx部署前端项目 879
  • SpringMVC的全面学习 866
  • Spring AOP和Spring事务管理 34

最新评论

  • SpringMVC的全面学习

    CSDN-Ada助手: 非常棒的博客!很高兴看到你对SpringMVC有如此全面的学习。你在摘要中提到的SpringMVC的优势确实是其核心价值所在,它的结构良好、分离的特性使得应用程序更容易测试、维护和扩展。 除了你已经提到的内容,我想补充一些与SpringMVC相关的扩展知识和技能。首先,了解Spring框架的其他模块,如Spring Boot和Spring Cloud,可以帮助你更好地构建和管理大型应用程序。其次,掌握前端技术,如HTML、CSS和JavaScript,可以帮助你更好地设计和开发用户友好的界面。此外,学习RESTful API的设计和实现也是非常有用的,它可以帮助你构建更灵活和可扩展的Web服务。 希望这些建议对你有所帮助,期待看到你未来更多关于SpringMVC的文章!继续努力创作! 如何写出更高质量的博客,请看该博主的分享:https://blog.csdn.net/lmy_520/article/details/128686434?utm_source=csdn_ai_ada_blog_reply2

  • Spring AOP和Spring事务管理

    CSDN-Ada助手: 恭喜您完成了第一篇博客!标题“Spring AOP和Spring事务管理”非常吸引人,显然您对这两个话题有很深入的理解。在这个技术领域写博客是一个非常好的方式,既能够记录自己的学习过程,也能够帮助其他人解决问题。 接下来,我建议您可以进一步扩展您的内容。比如,可以探讨一下在实际项目中如何使用Spring AOP和Spring事务管理来解决具体的问题,或者分享一些实用的技巧和经验。同时,您也可以考虑加入一些代码示例或者案例分析,让读者更好地理解和应用您所讲述的内容。 继续保持谦虚的态度,并坚持分享知识,相信您的博客会越来越受欢迎的!加油! 推荐【每天值得看】:https://bbs.csdn.net/forums/csdnnews?typeId=21804&utm_source=csdn_ai_ada_blog_reply1

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

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

最新文章

  • 【虚拟机】在Linux环境中nginx部署前端项目
  • SpringMVC的全面学习
2024年1篇
2023年2篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为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 网站制作 网站优化