您的位置:首页 > 编程语言 > Java开发

Spring面向切面编程(AOP)

2017-05-12 16:50 489 查看
转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/71747299,建议读者阅读原文,确保获得完整的信息

1.前言说明

  AOP即Aspect-Oriented Programming,面向切面的编程,与OOP想对应,是OOP的补充和完善,OOP横向上区分一个个类,AOP则从纵向上考察对象。AOP是一种动态地将代码切入到类的指定方法、指定位置上的编程思想。

  AOP一方面实现松耦合,使业务代码更加纯粹,即减少业务无关代码;另一方面实现统筹管理,提升业务开发效率,即可以随时给所有业务新增附加功能,而无须修改即有业务代码,这也体现了开闭原则,即对扩展开放,修改关闭。

2.应用场景

Log日志管理

Authentication 权限

Caching 缓存

Context passing 内容传递

Error handling 错误处理

Lazy loading 懒加载

Debugging 调试

Logging, tracing, profiling and monitoring 记录跟踪 优化 校准

Performance optimization 性能优化

Persistence 持久化

Resource pooling 资源池

Synchronization 同步

Transactions 事务

3.实例说明

  本文通过一个实例来说明SpringBoot中AOP的配置方式,至于其他的框架的配置方法,没有什么大差异,主要差一点会在依赖包上,Java方法类及AOP配置没有大差别。

  本文实例实现在指定包中的方法执行 前后执行切面方法,记录下方法输入、输出参数。

  第一步:pom.xml中添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>


  添加完上述依赖后,maven会自动下载依赖及间接依赖。如下图所示,SpringBoot AOP依赖包含3个依赖,spring-boot-starter-aop-1.3.6.RELEASE.jar、spring-sop-4.2.7.RELEASE.jar、aspectjweaver-1.8.9.jar。



  第二步:创建切面方法

public class LogAspect {

private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);

// 前置通知
public void beforeAdvice(JoinPoint joinPoint){
logger.info("============before advice");
logger.info(joinPoint.getSignature().getDeclaringTypeName() + " [input parameters] " + Arrays.toString(joinPoint.getArgs()));
}

// 后置通知
public void afterAdvice(JoinPoint joinPoint, Object retValue){
logger.info("============after advice");
logger.info(joinPoint.getSignature().getDeclaringTypeName() + " [output parameters] " + retValue);
}

}


  上述类中,有两个方法,分别对应前置和后置两种模式执行的方法。前置方法实现输入参数打印,后置方法实现输出参数打印。

  第三步:新增AOP配置

  在已有的beans.xml文件中新增aop配置,由于原来的beans.xml不支持aop配置,因此需要对该文件做2点调整:

新增头配置xmlns:aop、xsi:schemaLocation中关于aop的配置。

添加aop切面及模式配置。

  本例中的配置仅截取关键配置项。

<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> 
<bean id="logAspect" class="com.loongshawn.aop.LogAspect"/>
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* com.loongshawn.method.ces..*.*(..))" />
<aop:aspect ref="logAspect">
<aop:before pointcut-ref="pointcut" method="beforeAdvice"/>
<aop:after-returning pointcut-ref="pointcut" arg-names="joinPoint,retValue" returning="retValue" method="afterAdvice"/>
</aop:aspect>
</aop:config>

</beans>


  配置参数解释说明:

aop.pointcut,横切点,即在什么位置执行切面方法。

aop.expression,横切点规则表达式,过滤符合规则的切点。有关表达式规则将会在另外一篇文章中详细说明。

aop.aspect,切面。

aop:before,前置模式,切面执行模式。

aop:after-returning,后置返回模式,切面执行模式。

4.运行结果



  程序正常运行,指定包中的方法在执行前后均会执行切面服务。本文仅对AOP进行了简要说明,更加详细深入的说明请参考网上的其他资料。

  由于刚开始梳理这块内容,知识面还不够宽,如果文中有错误之处,希望大家能够指出,谢谢!

5.参考资料

(1).什么是面向切面编程AOP:https://www.zhihu.com/question/24863332
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: