开场白
当前主流的开发理念为面向对象编程,简称OOP,其中抽象性、封装性、继承性以及多态性被视为其核心的四大特性。面向切面编程,即AOP,作为OOP的强化与辅助,其核心同样体现在对抽象与封装理念的运用。在OOP中,类(Class)构成了我们的基本构建模块,而在AOP中,这一角色则由Aspect(切面)所承担。
AOP的核心术语
一个例子
悠悠今日心情愉悦,打算亲自下厨烹饪一道红烧肉,以此慰劳自己这段时间的辛勤劳作。于是,她下班后立刻赶到菜市场,在生肉摊位前仔细挑选,最终选中了一块肥瘦相间的肉。她面带诚恳地对摊主说:“老板,请帮我切一块。”话音刚落,摊主手法娴熟,一刀下去,肉块便被精准地切下,随后打包好递给了她。
对以上这个小例子稍作转换,就是“说人话”...
Aspcect(刀--类比封装的切面逻辑)Advice
简言之,面向对象编程(OOP)是针对业务逻辑开发提出的一种解决方案,而面向切面编程(AOP)则是为了满足对现有业务逻辑追加功能需求而诞生的解决方案。AOP的实施模式包括过滤器、拦截器等多种形式,但本文将探讨一种更为灵活的AOP实现途径。简单来说,这涉及将新增的附加功能,如日志记录、权限验证和声明式事务等,提炼并封装成独立的模块,即所谓的“切面”。接着,我们制定一套规则,将这些切面巧妙地融入业务流程之中。在这个过程中,业务逻辑的执行点被称作“Join Point”。切面被细分为两个部分:一是“Point Cut”,它负责确定哪些Join Point需要被切入;二是“Advice”,这部分则负责实现所需的增强功能。
实战——AOP应用之日志记录
What is it?How to do it?Why?
@Target({ElementType.METHOD})
该注解指定了运行时保留策略。
@Documented
public @interface LogInfo {
}
@Aspect
@Component
public class LogAspect {
此代码段中定义了一个名为logger的私有、最终常量,该常量是一个Logger实例,它通过getClass()方法获取当前类的Logger对象。
定义切点,标注为“@Pointcut”,指定为“@annotation(com.springframework.roadmap.aop.demo_00001.LogInfo)”。
public void pointcut() {
}
@Before("pointcut()")
公开执行记录方法调用参数的操作,针对传入的连接点对象进行处理。
记录器输出信息:“开始执行方法{}调用,参数为:{}”,其中方法签名通过joinPoint.getSignature().toShortString()获取。
joinPoint
.getArgs());
}
@After("pointcut()")
在执行方法调用后,进行日志记录操作。
logger输出信息:“-------之后--------”。
}
在方法执行完毕后,若满足指定的切点条件,将自动执行注解@AfterReturning,并将返回值存储在变量retVal中。
公开方法调用结果记录(通过joinPoint参数获取调用点信息),并将返回值(retVal参数)进行记录。
记录器输出信息:“执行方法{}结束,调用参数为:{},返回结果为:{}”,其中方法签名由joinPoint.getSignature()获取。
.toShortString(),
joinPoint.getArgs(), retVal);
}
在抛出异常之后,通过指定pointcut()作为切入点,以及将exception作为抛出异常的参数,对代码进行相应的处理。
在执行方法调用时,若遇到异常情况,应调用此方法记录异常信息,其中参数point表示调用点,参数exception表示捕获到的异常对象。
信息记录器输出:“-----------------抛出异常()----------”
}
@Around(value = "pointcut()")
公开方法调用前后记录,通过ProceedingJoinPoint参数接收调用点信息。
try {
Object result = joinPoint执行后续操作得到的结果;
logger.info("执行方法{}结束,调用结果为:", joinPoint.getSignature().toLongString(),);
result);
捕获到任何异常情况后,{
throwable.printStackTrace();
}
}
}
@Component
public class LogService {
@LogInfo
公开方法logTest接受一个整型参数x和一个字符串参数str。
输出以下字符到控制台:'================test========='
return "test ok!";
}
}
@SpringBootApplication
@EnableAspectJAutoProxy
@Component
public class LogAOPTest {
@Resource
此代码块中定义了一个名为logService的私有成员变量,该变量用于封装日志服务功能。
此代码段中,我创建了一个Logger实例,该实例通过LoggerFactory的getLogger方法,针对当前类进行了获取。
执行程序的初始化和运行流程。
启动Spring应用,运行LogAOPTest类,并传入参数args。
}
@PostConstruct
public void aopTest() {
logService执行了logTest方法,传入参数123和字符串"aop"。
}
}
4.0.0
com.springframework
spring-roadmap
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-parent
1.5.8.RELEASE
org.springframework.boot
spring-boot-starter-aop
org.springframework.boot
spring-boot-starter-web
参数资料:
此链接指向的文章内容禁止进行任何形式的修改。
该文章位于segmentfault.com的特定链接下,编号为1190000007469982。
Copyright © 2018 All Rights Reserved 版权所有 宁国人才网 苏ICP备2024139598号-6
地址:安徽省合肥市瑶海区 EMAIL:
Powered by PHPYun.