`
cywhoyi
  • 浏览: 421020 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

AOP的切面思考

    博客分类:
  • JAVA
 
阅读更多

简单介绍下如何使用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后,基本上其它框架只要实现其体现,想做什么就能够为所欲为

 

1
3
分享到:
评论

相关推荐

    Chapter 6_ 使用Spring进行面向切面编程(AOP)

    面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足。 除了类(classes)以外,AOP提供了 切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理。

    深入理解Android之AOP

    面向切面编程(AOP)是软件开发领域的一项重要技术,它与面向对象编程(OOP)相对应,但关注点不同。在本篇中,我们将深入探讨AOP的基本概念、优势以及在Android开发中的应用,同时与OOP进行比较分析。 首先,面向...

    AOP——面向服务--面向方面编程

    在AOP中,这些关注点被分离出来,形成独立的模块,称为切面(Aspect),然后通过特定的织入机制与主业务逻辑结合。 在描述中提到的问题是,为了记录40多个类中的方法调用,最直观的方法是创建一个基类或接口,让...

    Android中AOP(面向切向编程)的深入讲解

    AOP则提供了一种新的思考方式,将这类关注点定义为“切面”,并在运行时自动插入到目标代码的特定位置,称为“连接点”(Join Point)。 在Android中实现AOP的一种常见方式是使用注解(Annotation)和编译时织入...

    Java框架技术 Spring 学习案例 Spring AOP案例和Spring事务处理案例

    AOP是面向切面编程的缩写,它允许程序员定义“切面”,这些切面可以封装跨多个对象的行为或责任。在Spring中,AOP主要用于日志记录、性能监控、事务管理等横切关注点。例如,在"业务层接口万次执行效率"案例中,我们...

    spring2-aop.pdf

    Spring框架通过控制反转(IoC)和面向切面编程(AOP)技术,解决了传统Java应用开发中一些常见的问题,并且支持多种编程模式和应用程序结构。 AOP(面向切面编程)是Spring框架中的一个关键特性,它允许开发者将横...

    Manning - AspectJ in Action

    在阅读《Manning - AspectJ in Action》这本书后,读者不仅能掌握AspectJ的基本用法,还能了解到如何在实际项目中进行面向切面的思考和设计,从而提高代码的组织性和可维护性。书中提供的实践指导和案例分析将帮助...

    spring4.2.4源码

    Spring框架是中国Java开发领域中最广泛使用的轻量级框架之一,其4.2.4版本是一个稳定且成熟的版本,包含了对IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)的重要实现。...

    引出对Spring底层实现再思考

    Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(DI)和面向切面编程(AOP)功能闻名。在深入探讨Spring的底层实现时,我们需要理解几个关键概念和技术。 首先,Spring的核心在于IoC(Inversion of...

    基于SSM框架的Java Web开发课程教学中的几点思考.pdf

    - Spring AOP学习:介绍面向切面编程的概念,帮助学生掌握如何在Spring框架中运用AOP来处理业务逻辑。 - Spring JDBC学习:为了与数据库交互,学生将学会如何使用Spring框架来访问数据库,虽然最终会使用MyBatis框架...

    Spring应用开发代码

    Spring框架是Java开发中广泛应用的一个开源框架,以其强大的依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)功能而著名。它简化了企业级应用程序的开发,提供了...

    SpringBoot-Demo-master.zip

    AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。其与设计模式完成的任务差不多,是提供另一种角度来思考程序的...

    spring入门的所有代码,可以运行

    通过这些图片和代码示例,你可以逐步学习如何创建Spring项目、配置Bean、定义依赖关系、编写AOP切面、实现Spring MVC以及进行数据访问。在学习过程中,如果遇到任何问题,可以通过描述中的留言方式寻求帮助。 总的...

    spring3.2源码包

    AOP模块支持面向切面编程,允许开发者定义“切面”,将关注点如日志、事务管理等与业务逻辑分离,提高了代码的重用性和可读性。在Spring 3.2中,AOP进一步增强了对注解的支持,使得切面的定义更为简洁。 4. **Data...

    基于SSM框架的Java Web开发课程教学中的几点思考.zip

    Spring的核心特性包括依赖注入(DI)和面向切面编程(AOP)。依赖注入使得组件之间的耦合度降低,提高了代码的可测试性和可维护性。面向切面编程则允许开发者将关注点分离,如日志、事务管理等,从而实现代码的模块...

    aspectjrt.jar 包-C#文档类资源

    AspectJ是一个强大的面向切面编程(AOP)框架,它允许开发者在不修改原有业务逻辑的情况下,插入额外的功能或监控代码,以实现更精细的控制。aspectjrt.jar是AspectJ运行时库,它是AspectJ框架的核心组件之一,对C#...

    Spring基础教程36个学时的练习

    在"Spring基础教程36个学时的练习"中,你将全面掌握Spring的核心概念和技术,包括依赖注入(DI)、面向切面编程(AOP)、事务管理、数据访问、Web开发等方面。下面,我们将深入探讨这些知识点。 1. **依赖注入...

    spring-配套代码

    3. **Spring AOP**:这一部分将介绍如何创建切面、定义通知(advice)、切入点表达式(pointcut)等,以便实现事务管理、日志记录等跨切面功能。 4. **Spring JDBC** 和 **Spring Data JPA**:Spring 提供了对...

    计算机语言中spring全家桶去进行简单的功能实现

    - **AOP(面向切面编程)**:允许将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,以声明式的方式添加到应用程序中,从而减少代码重复,提高模块化程度。 - **代理与切面**:AOP的实现通常涉及动态...

Global site tag (gtag.js) - Google Analytics