SpringAOP在真实项目中的实际应用?

今天,Java已经卷到“屎上雕花”的程度,八股文的准备如果仅仅靠背诵,很容易陷入“背了忘,忘了背”的死循环中。

所以,我们必须:结合具体的代码demo,尝试系统地掌握,才能更好的卷出一条活路。

1. 日志记录

记录方法的执行时间、参数和返回值。

@Aspect
@Component
public class LoggingAspect {

    @Around("execution(* com.example.service.*.*(..))")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object proceed = joinPoint.proceed();
        long executionTime = System.currentTimeMillis() - start;

        System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");
        return proceed;
    }
}

@Service
public class MyService {
    public void perform() {
        System.out.println("Performing service...");
    }
}
2. 权限检查

在方法执行前进行权限验证,防止未经授权的访问。

@Aspect
@Component
public class SecurityAspect {

    @Before("execution(* com.example.service.*.*(..)) && @annotation(com.example.security.Secured)")
    public void checkSecurity(JoinPoint joinPoint) {
        // 这里进行权限检查逻辑
        System.out.println("Checking security for " + joinPoint.getSignature().getName());
    }
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Secured {
    String role() default "USER";
}

@Service
public class MyService {

    @Secured(role = "ADMIN")
    public void performAdminTask() {
        System.out.println("Performing admin task...");
    }

    public void perform() {
        System.out.println("Performing service...");
    }
}
3. 事务管理

自动管理事务的开启、提交和回滚。

@Aspect
@Component
public class TransactionAspect {

    @Around("execution(* com.example.service.*.*(..))")
    public Object manageTransaction(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Transaction start");
        try {
            Object result = joinPoint.proceed();
            System.out.println("Transaction commit");
            return result;
        } catch (Exception ex) {
            System.out.println("Transaction rollback due to: " + ex.getMessage());
            throw ex;
        }
    }
}

@Service
public class MyService {

    public void performTransaction() {
        System.out.println("Performing transactional service...");
        // 模拟异常
        if (true) throw new RuntimeException("Transaction failed");
    }
}
4. 异常处理

统一处理方法执行时的异常。

@Aspect
@Component
public class ExceptionHandlingAspect {

    @AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "ex")
    public void handleException(JoinPoint joinPoint, Exception ex) {
        System.out.println("Exception in " + joinPoint.getSignature().getName() + " with message: " + ex.getMessage());
        // 这里可以记录日志、通知管理员等
    }
}

@Service
public class MyService {

    public void perform() {
        System.out.println("Performing service...");
        throw new RuntimeException("Unexpected error");
    }
}
5. 缓存管理

在方法执行前检查缓存,在执行后更新缓存。

@Aspect
@Component
public class CachingAspect {

    private Map<String, Object> cache = new HashMap<>();

    @Around("execution(* com.example.service.*.*(..)) && @annotation(com.example.cache.Cacheable)")
    public Object cacheResult(ProceedingJoinPoint joinPoint) throws Throwable {
        String key = joinPoint.getSignature().toString();
        if (cache.containsKey(key)) {
            System.out.println("Returning cached result for " + key);
            return cache.get(key);
        }

        Object result = joinPoint.proceed();
        cache.put(key, result);
        System.out.println("Caching result for " + key);
        return result;
    }
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Cacheable {
}

@Service
public class MyService {

    @Cacheable
    public String getData() {
        System.out.println("Fetching data from database...");
        return "Data from DB";
    }
}

总结:

Spring AOP 在实际项目中广泛用于日志记录、权限检查、事务管理、异常处理和缓存管理等场景。这些示例展示了如何通过切面简化和增强应用程序的业务逻辑。

Coding不易,棒棒,加油!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值