最近在学习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. python---连接MySQL第三页

    用python语言从MySQL中查询数据 #!conding:utf-8 from mysql.connector import errorcode import mysql.connector cn ...

  2. android apk 导出(签名) is not translated in xx 代码混淆 反编译

    apk导出遇到问题 解决方式如下 1.导出步骤第一步 2.提示错误 3.解决 其余步骤参见: 代码混淆和数字签名(现在版本混淆) http://blog.csdn.net/moruna/article ...

  3. layerX offsetX pageX

    offsetX/offsetY:相对于当前元素的位移x/y:相对于当前座标系的位移,但是IE常常搞错当前座标系layerX/layerY:相对于当前座标系的位移pageX/pageY:相对于网页的位移 ...

  4. redis.conf配置详解

    http://www.2cto.com/database/201307/225113.html

  5. poj 1065 简单的贪心算法

    题意大概是:有一组木头需要处理,每块木头有长度,重量两个属性,处理的前一块木头长len,重wei,当下一块木头的len1,与wei1满足:len1>len&&wei1>we ...

  6. 杭电oj1326 Box of Bricks

    Tips:先求出平均数再分别计算各数与平均数的差相加,注意两个测试结果之间要空一行 #include<iostream> using namespace std; int main() { ...

  7. Hibernate 多表关联映射- 一对多关系映射(one-to-many)

    Hibernage.cfg.xml: <hibernate-configuration> <session-factory name="sessionFactory&quo ...

  8. wx.Frame

    wx.Frame A frame is a window whose size and position can (usually) be changed by the user. It usuall ...

  9. ChartControl一个小Demo

    我X轴设置的是时间,类型是DatetimeY轴设置的是数量,类型是Numerical当日期不一样时显示曲线正常,但是如果是同一天的话就成了下面的效果 怎么做才能让全部是同一天的时候显示小时为单位的曲线 ...

  10. jQuery源码笔记——回调对象

    回调对象是一个多用途的回调列表对象,提供了强大的的方式来管理回调函数列表. 最简单的缓存对象 function Callbacks(){ var list = [], self = { add: fu ...