最近在学习Spring AOP,其中涉及到AspectJ的AOP框架。主要参考:http://howtodoinjava.com/spring/spring-aop/spring-aop-aspectj-example-tutorial-using-annotation-config/

在编写例子之前,先熟悉几个spring AOP中专业术语:

1. advice,通知,就是在方法之前或者之后你需要做的事情,比如日志记录,事务之类的等等。

2. pointCut,切入点,主要一系列表达式

3. join points,连接点,是为了切入点而定义出来的,pointCut对应的一系列方法

4. aspect, 切面, advice+pointCut,可以确定什么时候(before, after, around)做事情,在哪个点(pointCut)做

在spring中主要使用代理来包裹切面,把他们织入spring管理的bean中。其中有两个方法:

1. 和目标类实现相同的接口

2. 继承目标类

这两种方式都可以通过jvm的检查,在执行具体的功能时还是由目标类完成,伪装类可以在此之前做一些其他的事情。

接下来是一个AspectJ的小例子。

首先,创建一个切面,使用@Aspect注解

@Aspect
public class EmployeeCRUDAspect { @Before("execution(public * howtodoinjava.com.manager.EmployeeManager.*(..))")
public void logBeforeV1(JoinPoint joinPoint)
{
System.out.println("EmployeeCRUDAspect.logBeforeV1() : " + joinPoint.getSignature().getName());
}

然后,对aop进行配置,applicationContext.xml文件的内容是:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <!-- aop命名空间 -->
<aop:aspectj-autoproxy /> <context:component-scan base-package="howtodoinjava.com" /> <bean id="loggingAspect" class="howtodoinjava.com.aspect.EmployeeCRUDAspect" /> </beans>

其他辅助类有EmployeeDTO.java和EmployeeManager.java

---EmployeeDTO.java

package howtodoinjava.com.manager;

import java.util.ArrayList;
import java.util.List;

import howtodoinjava.com.dto.EmployeeDTO;

import org.springframework.stereotype.Component;

@Component
public class EmployeeManager
{
public EmployeeDTO getEmployeeById(Integer employeeId) {
System.out.println("Method getEmployeeById() called");
return new EmployeeDTO();
}

public List<EmployeeDTO> getAllEmployee() {
System.out.println("Method getAllEmployee() called");
return new ArrayList<EmployeeDTO>();
}

public void createEmployee(EmployeeDTO employee) {
System.out.println("Method createEmployee() called");
}

public void deleteEmployee(Integer employeeId) {
System.out.println("Method deleteEmployee() called");
}

public void updateEmployee(EmployeeDTO employee) {
System.out.println("Method updateEmployee() called");
}
}

  ----EmloyeeManager.java

package howtodoinjava.com.manager;

import java.util.ArrayList;
import java.util.List; import howtodoinjava.com.dto.EmployeeDTO; import org.springframework.stereotype.Component; @Component
public class EmployeeManager
{
public EmployeeDTO getEmployeeById(Integer employeeId) {
System.out.println("Method getEmployeeById() called");
return new EmployeeDTO();
} public List<EmployeeDTO> getAllEmployee() {
System.out.println("Method getAllEmployee() called");
return new ArrayList<EmployeeDTO>();
} public void createEmployee(EmployeeDTO employee) {
System.out.println("Method createEmployee() called");
} public void deleteEmployee(Integer employeeId) {
System.out.println("Method deleteEmployee() called");
} public void updateEmployee(EmployeeDTO employee) {
System.out.println("Method updateEmployee() called");
}
}

  构建完成之后,创建测试类TestAOP.java

public class TestAOP
{
@SuppressWarnings("resource")
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("howtodoinjava/com/aspect/applicationContext.xml");
EmployeeManager manager = context.getBean(EmployeeManager.class); manager.getEmployeeById(1);
manager.createEmployee(new EmployeeDTO());
}
}

  执行结果如下:

EmployeeCRUDAspect.logBeforeV1() : getEmployeeById
Method getEmployeeById() called
EmployeeCRUDAspect.logBeforeV1() : createEmployee
Method createEmployee() called

AspectJ AOP例子的更多相关文章

  1. Spring AspectJ AOP 完整示例

    http://outofmemory.cn/java/spring/AOP/aop-aspectj-example-before-after-AfterReturning-afterThrowing- ...

  2. AspectJ AOP学习基础

    一.切入点表达式 1.execution:匹配方法的执行 格式:execution(修饰符 返回值类型 包.类.方法(参数) throw 异常) 1.1修饰符,表示方法的修饰符,一般省略. 1.2返回 ...

  3. 一个简单的Spring AOP例子

    转载自: http://www.blogjava.net/javadragon/archive/2006/12/03/85115.html 经过这段日子的学习和使用Spring,慢慢地体会到Sprin ...

  4. Spring IOC 和Aspectj AOP

    1.Aspectj AOP 是一套独立的AOP 解决方案,不仅限于java应用,不依赖其他方案,属于编译时增强,有自己单独的编译器.Spring AOP 是基于Spring 容器的的AOP解决方式,属 ...

  5. spring aop例子

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAATcAAAFWCAIAAACD6E2aAAAgAElEQVR4nO2df1gTV77/55/93z/2ee

  6. AspectJ AOP介绍

    idea下aspectj程序运行示例 有些同学可能想自己编写aspect程序进行测试练习,博主在这简单介绍运行环境的搭建,首先博主使用的idea的IDE,因此只对idea进行介绍.首先通过maven仓 ...

  7. aop 例子(annotation方式实现)

    面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之 ...

  8. Spring AOP and AspectJ AOP 有什么区别?

    Spring AOP 基于动态代理方式实现:AspectJ 基于静态代理方式实现.Spring AOP 仅支持方法级别的 PointCut:提供了完全的 AOP 支持,它还支持属性级别的 PointC ...

  9. 一个简单的Spring的AOP例子

    目标对象的接口:IStudent.java  1  /**  2  *  3   */  4  package  com.dragon.study; 5   6  /**  7  *  @author ...

随机推荐

  1. php正则提取img所有属性值

    $ext = 'gif|jpg|jpeg|bmp|png';//罗列图片后缀从而实现多扩展名匹配 by http://www.k686.com 绿色软件 $str = ''; $list = arra ...

  2. poj中一些对我来说不错的东西(每天不同的加入,要保持)

    1.关于深度搜索与暴力结合的棋盘翻转问题 poj1753::2965:: 2.贪心算法:2109,2586: 3.韩信点兵问题:poj1006

  3. Python urllib和urllib2模块学习(一)

    (参考资料:现代魔法学院 http://www.nowamagic.net/academy/detail/1302803) Python标准库中有许多实用的工具类,但是在具体使用时,标准库文档上对使用 ...

  4. webstrom 常用快捷键

    最近在学习javascript,同时发现了一款非常好用的IDE webstrom 现在记录改IDE的快捷键 1. ctrl + shift + n: 打开工程中的文件,目的是打开当前工程下任意目录的文 ...

  5. AIX 命令大全

    http://www.ahinc.com/aix/general.htm http://web.mit.edu/javadev/packages/Acme/ http://jparsec.codeha ...

  6. 一步一步学习SignalR进行实时通信_4_Hub

    原文:一步一步学习SignalR进行实时通信_4_Hub 一步一步学习SignalR进行实时通信\_4_Hub SignalR 一步一步学习SignalR进行实时通信_4_Hub 前言 创建Hub 配 ...

  7. C/C++ 用libcurl库进行http通讯网络编程

    C/C++ 用libcurl库进行http通讯网络编程 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_p ...

  8. Guava缓存器源码分析——缓存统计器

    Guava缓存器统计器实现: 全局统计器——         1.CacheBuilder的静态成员变量Supplier<StatsCounter> CACHE_STATS_COUNTER ...

  9. Python学习笔记8-类的继承 、深度优先、广度优先

    Python 类声明 语法: class 类名: 类体 例: #--encoding:utf-8-- # class AddressBookEntity: myVersion=0.1 def __in ...

  10. linux安装mongodb并启动

    CentOS6.4 安装MongoDB   1.下载MongoDB(64位) http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.9.tg ...