Spring AOP

本文详细解释了面向切面编程(AOP)的概念及其优势,包括切面、连接点、通知、切入点等术语,并通过实例展示了如何实现AOP以优化代码结构,提升效率。此外,文章还阐述了AOP的实现原理,从组件注解到代理创建过程,提供了一个全面的AOP学习指南。

AOP
什么是AOP?
AOP是指面向切面编程,是通过动态代理的方式为程序添加统一功能,解决一些公共问题,如:日志、鉴权和异常处理等。
好处:降低代码耦合度,使开发人员聚焦业务,公共统一处理,修改方便。

AOP的术语
1、切面Aspect:多个类都关注的方法
2、连接点Join point:代表一个方法的调用
3、Advice通知:我们要在切面上做什么事情(动作-action)
4、Pointcut切入点:用来描述我们要在哪些地方执行
5、Target object目标对象:被一个或多个切面通知的对象

AOP有哪些常用的注解?
@Aspect:在类上使用@Aspect可使之成为切面类
@Before(“execution(* com.qcc.beans.aop..(…))”):前置通知
@After(“execution(* com.qcc.beans.aop..(…))”):后置通知
@Around(“execution(* aop.service.impl.BusinessServiceImpl.(…))"):环绕通知,可以在方法的调用前后完成自定义行为,甚至可以选择不调用方法和修改返回对象,这是和前置后置通知的区别。
@AfterThrowing(value="execution(
com.qcc.beans.aop..(…))”,throwing=“e”):异常通知
@AfterReturning(value=“execution(* com.qcc.beans.aop..(…))”,returning=“result”):返回通知

如何实现AOP?
举例:设计性能拦截器,用于打印服务层所有方法的执行时间。
1、业务服务接口

public interface IBusinessService {
    //业务执行方法A
    void executeBusinessA();
    //业务执行方法B
    void executeBusinessB();
}

2、业务实现类

@Service("businessService")
public class BusinessServiceImpl implements IBusinessService {
public void executeBusinessA() {
        logger.info("executing business in methodA");
    }
    public void executeBusinessB() {
    	logger.info("executing business in methodB");
    }
}

3、性能分析器

@Component // 放入IOC容器
@Aspect // 切面类
public class PerformanceAnalysisInterceptor {
// 切入点是所有方法
public static final String POINTCUT = 
"execution (* aop.service.impl.BusinessServiceImpl.*(..))";

    @Around(POINTCUT)
    public Object analysisAround(ProceedingJoinPoint joinPoint) {
        Object obj = null;
        long startTime = System.currentTimeMillis();
        try {
            obj = joinPoint.proceed(joinPoint.getArgs());
        } catch (Throwable e) {	
            logger.error(e.getMessage());
        }
        long endTime = System.currentTimeMillis();
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        String methodName = signature.getDeclaringTypeName() + "." + signature.getName();
        long diffTime = endTime - startTime;
        logger.info("-----" + methodName + "执行时间 :" + diffTime + " ms");
        return obj;
    }
}

4、xml配置

<context:component-scan base-package="aop"/>
<aop:aspectj-autoproxy/>

5、主函数调用

public class AopMain {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext f = 
new ClassPathXmlApplicationContext("spring-aop.xml");
        IBusinessService businessService = (IBusinessService) f.getBean("businessService");
        businessService.executeBusinessA();
        businessService.executeBusinessB();

    }
}

6、打印
executing business in methodA
aop.service.IBusinessService.executeBusinessA执行时间 :203 ms
executing business in methodB
aop.service.IBusinessService.executeBusinessB执行时间 :1003 ms

AOP的实现原理?
以上面的AOP实现为例分析AOP的实现原理:
1、@Component
@Component会让Spring将切面类加入Spring的Bean容器;
2、@Aspect
@Aspect告诉Spring该Bean是一个拦截器,Spring就会去其中寻找所有的拦截方法和拦截规则。
3、创建代理
Spring有2种方式创建代理:JDK动态代理和CGLIB代理。
spring选择策略:
(1)如果目标类实现了接口,默认采用jdk动态代理来实现AOP
(2)如果目标类实现了接口,可以通过配置文件强行使用CGLib来实现AOP代理
(3)如果目标类没有实现接口,只能使用CGlib来实现AOP代理。
【注】CGlib可以为那些没有实现接口的类增强行为,原理是为目标类生成一个子类,并覆盖其中的方法

**项目名称:** 基于Vue.js与Spring Cloud架构的博客系统设计与开发——微服务分布式应用实践 **项目概述:** 本项目为计算机科学与技术专业本科毕业设计成果,旨在设计并实现一个采用前后端分离架构的现代化博客平台。系统前端基于Vue.js框架构建,提供响应式用户界面;后端采用Spring Cloud微服务架构,通过服务拆分、注册发现、配置中心及网关路由等技术,构建高可用、易扩展的分布式应用体系。项目重点探讨微服务模式下的系统设计、服务治理、数据一致性及部署运维等关键问题,体现了分布式系统在Web应用中的实践价值。 **技术架构:** 1. **前端技术栈:** Vue.js 2.x、Vue Router、Vuex、Element UI、Axios 2. **后端技术栈:** Spring Boot 2.x、Spring Cloud (Eureka/Nacos、Feign/OpenFeign、Ribbon、Hystrix、Zuul/Gateway、Config) 3. **数据存储:** MySQL 8.0(主数据存储)、Redis(缓存与会话管理) 4. **服务通信:** RESTful API、消息队列(可选RabbitMQ/Kafka) 5. **部署与运维:** Docker容器化、Jenkins持续集成、Nginx负载均衡 **核心功能模块:** - 用户管理:注册登录、权限控制、个人中心 - 文章管理:富文本编辑、分类标签、发布审核、评论互动 - 内容展示:首页推荐、分类检索、全文搜索、热门排行 - 系统管理:后台仪表盘、用户与内容监控、日志审计 - 微服务治理:服务健康检测、动态配置更新、熔断降级策略 **设计特点:** 1. **架构解耦:** 前后端完全分离,通过API网关统一接入,支持独立开发与部署。 2. **服务拆分:** 按业务域划分为用户服务、文章服务、评论服务、文件服务等独立微服务。 3. **高可用设计:** 采用服务注册发现机制,配合负载均衡与熔断器,提升系统容错能力。 4. **可扩展性:** 模块化设计支持横向扩展,配置中心实现运行时动态调整。 **项目成果:** 完成了一个具备完整博客功能、具备微服务典型特征的分布式系统原型,通过容器化部署验证了多服务协同运行的可行性,为云原生应用开发提供了实践参考。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值