简单介绍下如何使用PointCut、Advisor
@Component @Aspect public class LogAspect { private static final Logger log = LoggerFactory.getLogger(LogAspect.class); @Autowired TestService testService; @Pointcut("execution(* com.aop.service.UserService.add*(..))&& args(userDto)&& !within(com.aop.service.UserService)") public void getPointcutName(UserDto userDto) { } @After("getPointcutName(userDto)") public void logBeforePointCut(JoinPoint joinPoint, UserDto userDto) throws Throwable { log.info("logBeforePointCut() is running!"); log.info("method: " + joinPoint.getSignature().getName()); log.info("params: " + Arrays.toString(joinPoint.getArgs())); log.info("username: " + userDto.getUsername()); log.info("email: " + userDto.getEmail()); } @Before("execution(* com.aop.service.UserService.addUserBefore(..)) && args(userDto)") public void logBefore(JoinPoint joinPoint, UserDto userDto) throws Throwable { log.info("logBefore() is running!"); log.info("method: " + joinPoint.getSignature().getName()); log.info("params: " + Arrays.toString(joinPoint.getArgs())); log.info("username: " + userDto.getUsername()); log.info("email: " + userDto.getEmail()); } @After("execution(* com.aop.service.UserService.addUserAfter(..)) && args(userDto)") public void logAfter(JoinPoint joinPoint, UserDto userDto) throws Throwable { log.info("logAfter() is running!"); log.info("method: " + joinPoint.getSignature().getName()); log.info("params: " + Arrays.toString(joinPoint.getArgs())); log.info("username: " + userDto.getUsername()); log.info("email: " + userDto.getEmail()); } @AfterReturning( pointcut = "execution(* com.aop.service.UserService.addUserAfterReturning(..))", returning = "userDto") public void logAfterReturning(JoinPoint joinPoint, UserDto userDto) { log.info("logAfterReturning() is running!"); log.info("method: " + joinPoint.getSignature().getName()); log.info("username: " + userDto.getUsername()); log.info("email: " + userDto.getEmail()); } @Around("execution(* com.aop.service.UserService.addUserAround(..)) && args(userDto)") public void logAround(ProceedingJoinPoint joinPoint, UserDto userDto) throws Throwable { log.info("logAround() is running!"); log.info("method: " + joinPoint.getSignature().getName()); log.info("params: " + Arrays.toString(joinPoint.getArgs())); log.info("username: " + userDto.getUsername()); log.info("email: " + userDto.getEmail()); log.info("around before is running!"); joinPoint.proceed(); log.info("around after is running"); } @Before("execution(* com.aop.service.UserService.addUserBeforeVoid(..)) && args(userDto)") public void logBeforeVoid(JoinPoint joinPoint, UserDto userDto) throws Throwable { log.info("logBeforeVoid() is running!"); log.info("method: " + joinPoint.getSignature().getName()); log.info("username: " + userDto.getUsername()); log.info("email: " + userDto.getEmail()); testService.testService(); } }
public interface UserService { UserDto addUserBefore(UserDto userDto); UserDto addUserAfter(UserDto userDto); UserDto addUserAfterReturning(UserDto userDto); UserDto addUserAround(UserDto userDto); void addUserBeforeVoid(UserDto userDto); }
Advisor提供了before、after、around、afterreturning,具体用处的场景,我简单罗列下
1.日志=》追踪问题
2.运行期间加强类的额外功能,注入拦截,鉴权...
额外这里谈下pointCut结合advice,两者主要应用场景有类似之处,pointCut可能更应用在多个复杂条件,advice更为注重其方法行为,通过注解名字before、after等能够一眼感觉出来,那么两者结合后,即把行为+多场景同时结合起来。
总结:
spring提供aop后,基本上其它框架只要实现其体现,想做什么就能够为所欲为
相关推荐
Spring mvc mybatis plus 实现AOP 切面日志系统,带有数据库。可以自行拓展
aop切面拦截单个方法实例
spring aop切面拦截指定类和方法实现流程日志跟踪 一般情况下,在不侵入业务代码的情况下,需要做流程日志跟踪是比较合理的 采用springaop切面思想
spring AOP切面编程 运行环境:eclipse 构建工具:maven 不提供maven构建,maven用来解决jar包的依赖
学习Spring开发的AOP面向切面编程时所需要的jar包,包括com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
Spring 动态代理和aop切面编程例子,自己写的例子!!!!!!!
最简单的aop切面方法,配置好后,自动扫描需要切面的方法,无需添加其他冗余代码。简洁实用@!@
最近公司要求和别的公司对接,但是不想破坏原有的架构,就只有用切面了,百度了下都不全面,就自己写了个小demo,只要导入spring4.2.3的jar就直接可以用,注解实现spingaop机制,1分意思下
实现spring的aop的操作,采用AspectJ技术,通过xml的配置来实现,本人亲自测试过,aop相关架包已引入
spring aop 自定义切面示例 aspectj 需要相应的架包支持
aop切面插件包
NULL 博文链接:https://zyssnh.iteye.com/blog/1866867
将execl导出功能进行AOP切面 1.只需要在controller层增加自定义注解@ExportExcel就可以实现。利用切面和反射的原理 将导出和业务层分开。 2.在对应的model层增加@ExportFiled注解 表示需要导出的字段和顺序。 ...
AOP面向切面编程.ppt
AOP面向切面编程实例,可当作业提交。.net代码亲测,完全正确运行。
JAVA简单AOP切面编程;依赖注入;代码配置Bean源码 JAVA简单AOP切面编程;依赖注入;代码配置Bean源码
AOP面向切面架构设计Demo
spring AOP 切面日志 分层打日志
关于AOP切面的demo,研究aop的一些过程,使用aspecJ 。
spring切面AOP所使用的jar包