简单介绍下如何使用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后,基本上其它框架只要实现其体现,想做什么就能够为所欲为
相关推荐
面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足。 除了类(classes)以外,AOP提供了 切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理。
面向切面编程(AOP)是软件开发领域的一项重要技术,它与面向对象编程(OOP)相对应,但关注点不同。在本篇中,我们将深入探讨AOP的基本概念、优势以及在Android开发中的应用,同时与OOP进行比较分析。 首先,面向...
在AOP中,这些关注点被分离出来,形成独立的模块,称为切面(Aspect),然后通过特定的织入机制与主业务逻辑结合。 在描述中提到的问题是,为了记录40多个类中的方法调用,最直观的方法是创建一个基类或接口,让...
AOP则提供了一种新的思考方式,将这类关注点定义为“切面”,并在运行时自动插入到目标代码的特定位置,称为“连接点”(Join Point)。 在Android中实现AOP的一种常见方式是使用注解(Annotation)和编译时织入...
AOP是面向切面编程的缩写,它允许程序员定义“切面”,这些切面可以封装跨多个对象的行为或责任。在Spring中,AOP主要用于日志记录、性能监控、事务管理等横切关注点。例如,在"业务层接口万次执行效率"案例中,我们...
Spring框架通过控制反转(IoC)和面向切面编程(AOP)技术,解决了传统Java应用开发中一些常见的问题,并且支持多种编程模式和应用程序结构。 AOP(面向切面编程)是Spring框架中的一个关键特性,它允许开发者将横...
在阅读《Manning - AspectJ in Action》这本书后,读者不仅能掌握AspectJ的基本用法,还能了解到如何在实际项目中进行面向切面的思考和设计,从而提高代码的组织性和可维护性。书中提供的实践指导和案例分析将帮助...
Spring框架是中国Java开发领域中最广泛使用的轻量级框架之一,其4.2.4版本是一个稳定且成熟的版本,包含了对IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)的重要实现。...
Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(DI)和面向切面编程(AOP)功能闻名。在深入探讨Spring的底层实现时,我们需要理解几个关键概念和技术。 首先,Spring的核心在于IoC(Inversion of...
- Spring AOP学习:介绍面向切面编程的概念,帮助学生掌握如何在Spring框架中运用AOP来处理业务逻辑。 - Spring JDBC学习:为了与数据库交互,学生将学会如何使用Spring框架来访问数据库,虽然最终会使用MyBatis框架...
Spring框架是Java开发中广泛应用的一个开源框架,以其强大的依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)功能而著名。它简化了企业级应用程序的开发,提供了...
AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。其与设计模式完成的任务差不多,是提供另一种角度来思考程序的...
通过这些图片和代码示例,你可以逐步学习如何创建Spring项目、配置Bean、定义依赖关系、编写AOP切面、实现Spring MVC以及进行数据访问。在学习过程中,如果遇到任何问题,可以通过描述中的留言方式寻求帮助。 总的...
AOP模块支持面向切面编程,允许开发者定义“切面”,将关注点如日志、事务管理等与业务逻辑分离,提高了代码的重用性和可读性。在Spring 3.2中,AOP进一步增强了对注解的支持,使得切面的定义更为简洁。 4. **Data...
Spring的核心特性包括依赖注入(DI)和面向切面编程(AOP)。依赖注入使得组件之间的耦合度降低,提高了代码的可测试性和可维护性。面向切面编程则允许开发者将关注点分离,如日志、事务管理等,从而实现代码的模块...
AspectJ是一个强大的面向切面编程(AOP)框架,它允许开发者在不修改原有业务逻辑的情况下,插入额外的功能或监控代码,以实现更精细的控制。aspectjrt.jar是AspectJ运行时库,它是AspectJ框架的核心组件之一,对C#...
在"Spring基础教程36个学时的练习"中,你将全面掌握Spring的核心概念和技术,包括依赖注入(DI)、面向切面编程(AOP)、事务管理、数据访问、Web开发等方面。下面,我们将深入探讨这些知识点。 1. **依赖注入...
3. **Spring AOP**:这一部分将介绍如何创建切面、定义通知(advice)、切入点表达式(pointcut)等,以便实现事务管理、日志记录等跨切面功能。 4. **Spring JDBC** 和 **Spring Data JPA**:Spring 提供了对...
- **AOP(面向切面编程)**:允许将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,以声明式的方式添加到应用程序中,从而减少代码重复,提高模块化程度。 - **代理与切面**:AOP的实现通常涉及动态...