资讯专栏INFORMATION COLUMN

<spring 3.x企业应用开发实战>读书笔记-基于注解和声明式的aop

马龙驹 / 3013人阅读

摘要:配置切面编程方式实现说结账说要点什么注解表示前置增强后面的切点表达式表示在目标类的方法织入增强,方法可以带任意的传入参数和任意的返回值。类相当于上一篇中的增强切点,切面三者联合表达的信息。

@AspectJ配置切面 编程方式实现
public class Waiter {
    public void check(String name){
        System.out.println("waiter说:结账?"+name);
    }
    public void serve(String name){
        System.out.println("waiter说:要点什么?"+name);
    }
}
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class PreGreeting {
    @Before("execution(* serve(..))")
    public void beforeGreeting(){
        System.out.println("how are you!");
    }
}

@Before注解表示前置增强,后面的切点表达式表示在目标类的serve()方法织入增强,serve()方法可以带任意的传入参数和任意的返回值。
PreGreeting类通过注解,将切点,增强类型和增强的横切逻辑组合在一起。PreGreeting类相当于上一篇中的BeforeAdvice(增强),NameMatchMethodPointcut(切点)DefaultPointcutAdvisor(切面)三者联合表达的信息。

        Waiter waiter=new Waiter();
        AspectJProxyFactory factory=new AspectJProxyFactory();
        factory.setTarget(waiter);//设置目标类
        factory.addAspect(PreGreeting.class);//添加切面
        Waiter proxy=factory.getProxy();
        proxy.serve("TheViper");
        proxy.check("TheViper");
how are you!
waiter说:要点什么?TheViper
waiter说:结账?TheViper
通过配置使用

    
    
    

引用aop命名空间

xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="...  
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop.xsd"

自动为spring容器中那些匹配@AspectJ切面的Bean创建代理,完成切面织入

        ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
        Waiter waiter=(Waiter)ctx.getBean("waiter");
        waiter.serve("TheViper");
        waiter.check("TheViper");

使用的时候,直接获取bean操作就可以了,不用像前面还要创建AspectJProxyFactory,设置好代理才能用。

schema配置切面 配置命名切点

需要引入aspectjweaver

public class GreetBefore {
    public void say(String name){
        System.out.println("hallo!"+name);
    }
}

增强不用像上一篇中那样,需要继承特定类或实现特定接口。


    
    
    
        
        
            
        
    
  

匹配Waiter类中的check()方法。

需要引入aop命名空间

xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="... http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop.xsd"

定义切面,其内部可以定义多个增强,ref属性指定引用的具体增强

声明了一个前置增强,通过pointcut-ref属性引用切点,method属性指定增强中哪个方法用于具体的增强行为

定义切点,expression属性设置切点表达式,其语法和@AspectJ中的语法完全相同。

public class Waiter {
    public void check(String name){
        System.out.println("waiter说:结账?"+name);
    }
    public void serve(String name){
        System.out.println("waiter说:要点什么?"+name);
    }
}
        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        Waiter waiter=(Waiter)ctx.getBean("waiterTarget");
        waiter.serve("TheViper");
        waiter.check("TheViper");
waiter说:要点什么?TheViper
hallo!TheViper
waiter说:结账?TheViper
配置顺序问题

命名切点只能被当前内定义的元素访问到,中的配置顺序必须是=>=>

各种增强类型 后置增强

    ...
    
        
    
环绕增强

    ...
    
        
    
    public void aroundMethod(ProceedingJoinPoint pjp){
    //pjp可以访问到环绕增强的连接点信息
        ...
    }
抛出异常增强

    ...
    
        
    
public void afterThrowingMethod(Exception exception){
    ...
}

throwing属性声明需要绑定的异常对象,指定的异常名必须和增强方法对应的传入参数一致

final增强

    ...
    
        
    
引介增强

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64687.html

相关文章

  • &lt;spring 3.x企业应用开发实战&gt;读书笔记-aop基础

    摘要:是什么是面向切面编程的简称。负责实施切面,它将切面所定义的横切逻辑织入到切面所指定的连接点钟。静态正则表达式匹配切面是正则表达式方法匹配的切面实现类。流程切面的流程切面由和实现。 aop是什么 aop是面向切面编程(aspect oriented programing)的简称。aop的出现并不是要完全替代oop,仅是作为oop的有益补充。aop的应用场合是有限的,一般只适合于那些具有横...

    isaced 评论0 收藏0
  • Spring编程式和声明式事务实例讲解

    摘要:基于和命名空间的声明式事务管理目前推荐的方式,其最大特点是与结合紧密,可以充分利用切点表达式的强大支持,使得管理事务更加灵活。基于的全注解方式将声明式事务管理简化到了极致。 Java面试通关手册(Java学习指南):https://github.com/Snailclimb/Java_Guide 历史回顾:可能是最漂亮的Spring事务管理详解 Spring事务管理 Spring支持两...

    lushan 评论0 收藏0
  • Spring实战读书笔记——Spring简介

    摘要:如何降低开发的复杂性最小侵入编程通过面向接口和依赖注入实现松耦合基于编程惯例和切面进行声明式编程通过模板减少样板式代码容器在应用中,不再由对象自行创建或管理它们之间的依赖关系容器负责创建对象装配对象配置它们并管理它们的整个生命周期。 欢迎大家关注我的微信公众号,一起探讨Java相关技术 showImg(https://segmentfault.com/img/bVboaBO?w=129...

    CKJOKER 评论0 收藏0
  • Spring知识——事务解析

    摘要:编程式事务指的是通过编码方式实现事务声明式事务基于将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件中做相关的事务规则声明,另一种是基于注解的方式。 事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。编程式...

    tuomao 评论0 收藏0
  • MyBatis集成Spring

    摘要:各方面有各种常见的良好示例,包括日志记录,声明式事务,安全性,缓存等。声明式事务管理这意味着你从业务代码中分离事务管理。但作为一种横切关注点,声明式事务管理可以使用方法进行模块化。支持使用框架的声明式事务管理。 本章主要内容包括Spring简介、Spring的两大特性(IOC和AOP)、事务MyBatis集成Spring等。也许有读者会疑惑,明明是MyBatis-Plus实战,怎么还讲...

    ckllj 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<