springboot之JoinPoint的getSignature方法

在使用springboot写aop的时候,有个JoinPoint类,用来获取代理类和被代理类的信息。

这个文章记录一下JoinPoint的getSignature方法返回的是什么格式。

不废话,贴代码

package org.aspectj.lang;

public interface Signature {
    String toString();

    String toShortString();

    String toLongString();

    String getName();

    int getModifiers();

    Class getDeclaringType();

    String getDeclaringTypeName();
}

打印输出,getString是测试类的方法名,TestController是类名

joinPoint.getSignature().toString():String com.fast.web.controller.TestController.getString()
joinPoint.getSignature().toShortString():TestController.getString()
joinPoint.getSignature().toLongString():public java.lang.String com.fast.web.controller.TestController.getString()
joinPoint.getSignature().getName():getString
joinPoint.getSignature().getModifiers():1
joinPoint.getSignature().getDeclaringType():class com.fast.web.controller.TestController
joinPoint.getSignature().getDeclaringTypeName():com.fast.web.controller.TestController

冒号前面是使用的方法,后面是本次测试输出的结果。

附上被测试的类:

package com.fast.web.controller;

import com.fast.framework.dao.TestDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class TestController {

    @Autowired
    private TestDao testDao;

    @RequestMapping("/test")
    public String getString() {
        int i = testDao.selectBase();
        return String.valueOf(i);
    }
}

 

在Spring Boot应用中,如果你需要两个数据源(通常一个是主库,一个是备份或读库),并且希望在操作完成后同时回滚两个数据源的数据更改,可以使用AOPAspect Oriented Programming)或者Repository的Transaction Management来实现。 **方法一:使用AOP(切面编程)** 1. 首先,你需要创建一个自定义的事务管理切面,比如`@Transactional`注解配合`PlatformTransactionManager`来处理两个数据源。 2. 在这个切面中,你可以使用`Propagation.REQUIRES_NEW`传播行为开启一个新的数据库事务,并在`AfterCommit`或`AfterCompletion`通知中关闭这两个数据源的连接。 ```java @Aspect @Component public class DualDataSourceAspect { @Autowired private PlatformTransactionManager primaryTxManager; @Autowired private PlatformTransactionManager secondaryTxManager; @Around("execution(* com.example.service..*(...))") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { TransactionDefinition primaryDef = primaryTxManager.getTransactionDefinition(); TransactionDefinition secondaryDef = secondaryTxManager.getTransactionDefinition(); // 开启新的事务 primaryTxManager.getTransaction().begin(); secondaryTxManager.getTransaction().begin(); try { Object result = joinPoint.proceed(); // 执行业务逻辑 // 如果业务逻辑成功完成 if (joinPoint.getSignature().getName().startsWith("success")) { primaryTxManager.commit(); secondaryTxManager.commit(); } else { primaryTxManager.rollback(); secondaryTxManager.rollback(); } return result; } catch (Throwable e) { primaryTxManager.rollback(); secondaryTxManager.rollback(); throw e; } finally { primaryTxManager.clearTransaction(); secondaryTxManager.clearTransaction(); } } } ``` **方法二:使用Repository的Transaction Management** 如果是在Repository层操作,可以在Repository接口上声明两个TransactionManagement的注解,分别对应两个数据源。 ```java @Repository @EnableTransactionManagement(transactionManager = "primaryEntityManagerFactory", readOnlyForCollections = false) @Transactional(propagation = Propagation.REQUIRES_NEW) public interface PrimaryRepository extends JpaRepository<YourEntity, Long> {} @Repository @EnableTransactionManagement(transactionManager = "secondaryEntityManagerFactory", readOnlyForCollections = false) @Transactional(propagation = Propagation.REQUIRES_NEW) public interface SecondaryRepository extends JpaRepository<YourEntity, Long> {} ``` 在这种情况下,当执行`PrimaryRepository`和`SecondaryRepository`的方法时,会自动开启新的事务并保证两个数据源的操作都会一起回滚。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值