文档章节

AOP之AspectJ的方式

kingwrcy
 kingwrcy
发布于 2016/03/31 16:56
字数 427
阅读 9
收藏 0

前面写了下spring的proxyFactoryBean,可以看出动态bean的局限很大,每个被代理的类都得在xml里配置,很繁琐,这里说下AspectJ的写法.


maven依赖

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.8</version>
</dependency>


spring-test.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">


    <aop:aspectj-autoproxy/>

    <bean id="student" class="Student"/>
    <!--<bean id="interceptor" class="ProxyStudent"/>-->
    <bean id="aspectJStudent" class="AspectJStudent"/>

    <!--<bean id="myPointcut" class="org.springframework.aop.support.NameMatchMethodPointcut">-->
        <!--&lt;!&ndash; 只对say方法拦截 &ndash;&gt;-->
        <!--<property name="mappedName" value="say"/>-->
    <!--</bean>-->

    <!--<bean id="myAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">-->
        <!--<property name="advice" ref="interceptor"/>-->
        <!--<property name="pointcut" ref="myPointcut"/>-->
    <!--</bean>-->

    <!--<bean id="proxyStudent" class="org.springframework.aop.framework.ProxyFactoryBean">-->
        <!--<property name="interfaces">-->
            <!--<list>-->
                <!--<value>Person</value>-->
            <!--</list>-->
        <!--</property>-->
        <!--<property name="interceptorNames">-->
            <!--<list>-->
                <!--&lt;!&ndash;<value>interceptor</value>&ndash;&gt;-->
                <!--<value>myAdvisor</value>-->
            <!--</list>-->
        <!--</property>-->
        <!--<property name="target" ref="student"/>-->
    <!--</bean>-->
</beans>


AspectJStudent.java

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

/**
 * Created by wangrui04 on 2016/3/31.
 */
@Aspect
public class AspectJStudent {

    @Pointcut("execution (* Student.say(..))")
    public void pointcut(){}

    @Around("pointcut()")
    public void around (ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("AspectJ around before");
        joinPoint.proceed();
        System.out.println("AspectJ around after");
    }

    @Before("pointcut()")
    public void before(JoinPoint joinPoint){
        System.out.println("AspectJ before");
    }

    @After("pointcut()")
    public void after(JoinPoint joinPoint){
        System.out.println("AspectJ after");
    }

    @AfterReturning("pointcut()")
    public void afterReturning(JoinPoint joinPoint){
        System.out.println("AspectJ after returning");
    }


}


BootMain.java

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

/**
 * Created by wangrui04 on 2016/3/31.
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-test.xml"})
public class BootMain {

//    @Resource(name = "proxyStudent")
    @Resource
    @Qualifier("student")
    private Person student;

    @Test
    public void testMain(){
        student.say();
        student.run();
    }

}


output

AspectJ around before
AspectJ before
hello world!
AspectJ around after
AspectJ after
AspectJ after returning
run fast!

  • 对比二种方式可以看出AspectJ的方式更加灵活,配置文件更少,更加强大.

  • 配置文件里启用<aspectj-autoproxy/>

  • 注意调用的顺序

  • pointcut的写法还支持很多,比如支持注解,这样就实现了只要被xx注解了,这个方法就会被拦截到,通常做日志拦截.

© 著作权归作者所有

共有 人打赏支持
kingwrcy
粉丝 0
博文 8
码字总数 1619
作品 0
浦东
私信 提问
Spring中的AOP(一)——AspectJ的基本使用

AOP(Aspect Orient Programming),也就是面向切面编程,作为面向对象编程的一种补充,当前已经成为一种比较成熟的编程思想,其实AOP问世的时间并不长,甚至在国内的翻译还不太统一(另有人...

摆渡者
2014/03/13
0
1
2014-03-11 Spring的学习(3)------面向切面编程(AOP)

AOP概念 首先让我们从一些重要的AOP概念和术语开始。这些术语不是Spring特有的。不过AOP术语并不是特别的直观,如果Spring使用自己的术语,将会变得更加令人困惑。 切面(Aspect):一个关注...

查封炉台
2014/03/11
0
0
Aspectj与Spring AOP比较

1、简介 今天有多个可用的 AOP 库, 它们需要能够回答许多问题: 是否与用户现有的或新的应用程序兼容? 在哪里可以实现 AOP? 与自己的应用程序集成多快? 性能开销是多少? 在本文中, 我们将...

沈渊
2018/04/18
0
0
Spring AOP 实现原理与 CGLIB 应用

AOP(Aspect Orient Programming),也就是面向方面编程,作为面向对象编程的一种补充,专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在 Java EE 应用中,常常通过 ...

IBMdW
2012/09/26
1K
2
《Spring Recipes》第三章笔记1:Enabling AspectJ Annotation

《Spring Recipes》第三章笔记:Enabling AspectJ Annotation 问题 如何开启Spring容器对AspectJ注解的支持。 解决方案 在配置文件中引入aop schema,添加<aop:aspectj-autoproxy />配置。 ...

LiJIaming
2012/05/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一致性hash和虚拟节点

consistent hashing 算法的原理 consistent hashing 是一种 hash 算法,简单的说,在移除 / 添加一个 cache 时,它能够尽可能小的改变已存在key 映射关系,尽可能的满足单调性的要求。 下面就...

群星纪元
22分钟前
2
0
说一下Dubbo 的工作原理?注册中心挂了可以继续通信吗?

面试题 说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗?说说一次 rpc 请求的流程? 面试官心理分析 MQ、ES、Redis、Dubbo,上来先问你一些思考性的问题、原理,比如 kafka 高可用架...

李红欧巴
33分钟前
19
0
腾讯面试:一条SQL语句执行得很慢的原因有哪些?

说实话,这个问题可以涉及到 MySQL 的很多核心知识,可以扯出一大堆,就像要考你计算机网络的知识时,问你“输入URL回车之后,究竟发生了什么”一样,看看你能说出多少了。 之前腾讯面试的实...

java菜分享
51分钟前
11
0
Java 基本功 之 CAS

本文首发于个人公众号《andyqian》, 期待你的关注! 前言 在Java并发编程中,我们经常使用锁对竞争资源予以并发控制,以解决资源竞争的问题。但无论是使用 Lock 还是 Synchronized,随着锁机...

andyqian
55分钟前
5
0
信号量与条件变量的区别

注意信号量与条件变量的区别 信号量内容可见:http://www.cnblogs.com/charlesblc/p/6142868.html 信号量、共享内存,以及消息队列等System V IPC三剑客主要关注进程间通信; 而条件变量、互...

shzwork
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部