最近要用到切面来统一处理日志记录,写了个小实例练了练手:

具体实现类:

  1. public interface PersonServer {
  2. public void save(String name);
  3. public void update(String name, Integer id);
  4. public String getPersonName(Integer id);
  5. }
  1. import org.springframework.stereotype.Component;
  2.  
  3. @Component("personServerBean")
  4. public class PersonServerBean implements PersonServer {
  5. public void save(String name) {
  6. System.out.println("save方法");
  7. }
  8. public void update(String name, Integer id) {
  9. System.out.println("update方法");
  10. }
  11. public String getPersonName(Integer id) {
  12. System.out.println("getPersonName方法");
  13. return "myName";
  14. }
  15. }

切面类:

  1. import org.aspectj.lang.ProceedingJoinPoint;
  2. import org.aspectj.lang.annotation.*;
  3. import org.springframework.stereotype.Component;
  4.  
  5. @Aspect
  6. @Component
  7. public class MyInterceptor {
  8. @Pointcut("execution(* com.alibaba.aop.PersonServerBean.*(..))")
  9. private void anyMethod(){}
  10.  
  11. @Before("anyMethod()")
  12. public void doAccessCheck() {
  13. System.out.println("前置通知");
  14. }
  15. @After("anyMethod()")
  16. public void after() {
  17. System.out.println("最终结果");
  18. }
  19. @AfterReturning("anyMethod()")
  20. public void doAfter() {
  21. System.out.println("后置通知");
  22. }
  23. @AfterThrowing("anyMethod()")
  24. public void doAfterThrow() {
  25. System.out.println("例外通知");
  26. }
  27. @Around("anyMethod()")
  28. public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
  29. System.out.println("进入环绕通知");
  30. Object object = pjp.proceed();
  31. System.out.println("退出方法");
  32. return object;
  33. }
  34. // 顺序: before->method->after->afterReturning
  35. }

XML文件配置:

  1. <?xml version="1.0" encoding="GBK"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
  8.  
  9. <!--<context:annotation-config />这个配置可以去掉,在aspject-autoproxy里面包含了这个配置-->
  10.  
  11. <aop:aspectj-autoproxy />
  12.  
  13. <context:component-scan base-package="com...." />
  14. <!--<import resource="classpath:tutorial-beans.xml" /> 写到其他文件里面去,引入-->
  15. </beans>

引用jar包pom文件配置:

  1. <aspect-version>1.8.0</aspect-version>
  2. <spring-version>3.2.7.RELEASE</spring-version>
  3. <dependency>
  4. <groupId>org.springframework</groupId>
  5. <artifactId>spring-aspects</artifactId>
  6. <version>${spring-version}</version>
  7. </dependency>
  8. <dependency>
  9. <groupId>org.aspectj</groupId>
  10. <artifactId>aspectjrt</artifactId>
  11. <version>${aspect-version}</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.aspectj</groupId>
  15. <artifactId>aspectjweaver</artifactId>
  16. <version>${aspect-version}</version>
  17. </dependency>

执行测试类:

  1. import org.springframework.context.ApplicationContext;
  2. import org.springframework.context.support.ClassPathXmlApplicationContext;
  3. import org.springframework.stereotype.Component;
  4.  
  5. @Component("springAOPTest")
  6. public class SpringAOPTest {
  7. public static void main(String[] args) {
  8. ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  9. PersonServer bean = (PersonServerBean) ctx.getBean("personServerBean");
  10. bean.save("test");
  11. }
  12. }

执行结果:

  1. 进入环绕通知
  2. 前置通知
  3. save方法
  4. 退出方法
  5. 最终结果
  6. 后置通知

总结-执行顺序:around->before->around->after->afterReturning

参考连接:http://blog.csdn.net/wangpeng047/article/details/8556800

[Spring] AOP, Aspect实例解析的更多相关文章

  1. Spring系列(五):Spring AOP源码解析

    一.@EnableAspectJAutoProxy注解 在主配置类中添加@EnableAspectJAutoProxy注解,开启aop支持,那么@EnableAspectJAutoProxy到底做了什 ...

  2. Spring AOP应用实例demo

    AOP(Aspect-Oriented Programming.面向方面编程).能够说是OOP(Object-OrientedPrograming.面向对象编程)的补充和完好.OOP引入封装.继承和多 ...

  3. Spring AOP 入门实例详解

    目录 AOP概念 AOP核心概念 Spring对AOP的支持 基于Spring的AOP简单实现 基于Spring的AOP使用其他细节 AOP概念 AOP(Aspect Oriented Program ...

  4. Spring Aop 应用实例与设计浅析

    0.代码概述 代码说明:第一章中的代码为了突出模块化拆分的必要性,所以db采用了真实操作.下面代码中dao层使用了打印日志模拟插入db的方法,方便所有人运行demo. 1.项目代码地址:https:/ ...

  5. Spring AOP @Aspect

    spring提供了两个核心功能,一个是IoC(控制反转),另外一个便是Aop(面向切面编程),IoC有助于应用对象之间的解耦,AOP则可以实现横切关注点(如日志.安全.缓存和事务管理)与他们所影响的对 ...

  6. Spring AOP 源码解析

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...

  7. Spring AOP(aspect oriented programming) 转载

    1.面向切面的基本原理 软件系统可以看成是由一组关注点组成的,其中,直接的业务关注点,是直切关注点.而为直切关注点提供服务的,就是横切关注点. 01.什么是面向切面编程 横切关注点:影响应用多处的功能 ...

  8. Spring AOP Aspect的简单实现(基于XML)

    第一步:导包 第二步:实现类和切面类 Service("userService")public class IUserviceImpl implements IUserServic ...

  9. Spring学习(十五)----- Spring AOP通知实例 – Advice

    Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后 ...

随机推荐

  1. Java集合之HashSet

    1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素.HashSe ...

  2. zen Code 支持的代码样式

    这里是一个支持的属性和操作符的列表: E 元素名称(div, p); E#id 使用id的元素(div#content, p#intro, span#error); E.class 使用类的元素(di ...

  3. vim 编辑器的光标操作

    vim中最简单的移动光标的方式是使用使用方向键操作,但这种方式的效率底下,更高效的方式是使用快捷键,常用的快捷键如下表所示. 快捷键                                 功 ...

  4. [Tomcat] Tomcat的classloader

    定义 同其他服务器应用一样,tomcat安装了各种classloader(classes that implement java.lang.ClassLoader) Bootstrap | Syste ...

  5. [Algorithm] 局部敏感哈希算法(Locality Sensitive Hashing)

    局部敏感哈希(Locality Sensitive Hashing,LSH)算法是我在前一段时间找工作时接触到的一种衡量文本相似度的算法.局部敏感哈希是近似最近邻搜索算法中最流行的一种,它有坚实的理论 ...

  6. ORACLE_UNQNAME

    之前在自己笔记本win7系统上安装了oracle 11g,当时为了节省资源,没启用EM. 此时查看EM状态: C:\Windows\system32>emctl status dbconsole ...

  7. paintEvent(QPaintEvent*)是系统自动调用的

    qt中函数paintEvent(QPaintEvent*)是被系统自动调用. paintEvent(QPaintEvent *)函数是QWidget类中的虚函数,用于ui的绘制,会在多种情况下被其他函 ...

  8. C++11的简单线程池代码阅读

    这是一个简单的C++11实现的线程池,代码很简单. 原理就是管理一个任务队列和一个工作线程队列. 工作线程不断的从任务队列取任务,然后执行.如果没有任务就等待新任务的到来.添加新任务的时候先添加到任务 ...

  9. 【splay】文艺平衡树 BZOJ 3223

    Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3  ...

  10. DNS解析过程详解

    先说一下DNS的几个基本概念: 一. 根域 就是所谓的“.”,其实我们的网址www.baidu.com在配置当中应该是www.baidu.com.(最后有一点),一般我们在浏览器里输入时会省略后面的点 ...