`

Spring @AspectJ 实现AOP 入门例子

阅读更多
AOP的作用这里就不再作说明了,下面开始讲解一个很简单的入门级例子。

引用一个猴子偷桃,守护者守护果园抓住猴子的小情节。

1、猴子偷桃类(普通类):
package com.samter.common;

/**
 * 猴子
 * @author Administrator
 *
 */
public class Monkey {
	
	public void stealPeaches(String name){
		System.out.println("【猴子】"+name+"正在偷桃...");
	}
}


2、守护者类(声明为Aspect):
package com.samter.aspect;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

/**
 * 桃园守护者
 * @author Administrator
 *
 */

@Aspect
public class Guardian {
	
	@Pointcut("execution(* com.samter.common.Monkey.stealPeaches(..))")
	public void foundMonkey(){}

	@Before(value="foundMonkey()")
	public void foundBefore(){
		System.out.println("【守护者】发现猴子正在进入果园...");
	}
	
	@AfterReturning("foundMonkey() && args(name,..)")
	public void foundAfter(String name){
		System.out.println("【守护者】抓住了猴子,守护者审问出了猴子的名字叫“"+name+"”...");
	}
	
}


3、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-2.0.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"
>

    <!-- 定义Aspect -->
    <bean id="guardian" class="com.samter.aspect.Guardian" />

    <!-- 定义Common -->
    <bean id="monkey" class="com.samter.common.Monkey" />

    <!-- 启动AspectJ支持 -->
    <aop:aspectj-autoproxy />

</beans>



4、测试类:
package com.samter.common;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
        Monkey monkey = (Monkey) context.getBean("monkey");
        try {
        	monkey.stealPeaches("孙大圣的大徒弟");
        }
        catch(Exception e) {}
    }

}



5、控制台输出:
【守护者】发现猴子正在进入果园...
【猴子】孙大圣的大徒弟正在偷桃...
【守护者】抓住了猴子,守护者审问出了猴子的名字叫“孙大圣的大徒弟”...


解说:1写了一个猴子正在偷桃的方法。
      2写了一个标志为@Aspect的类,它是守护者。它会在猴子偷桃之前发现猴子,并在猴子偷桃之后抓住猴子。
      原理:A、@Aspect的声明表示这是一个切面类。
            B、@Pointcut使用这个方法可以将com.samter.common.Monkey.stealPeaches(..)方法声明为poincut即切入点。作用,在stealPeaches方法被调用的时候执行2的foundMonkey方法。其中execution是匹配方法执行的切入点,也就是spring最常用的切入点定义方式。
            C、@Before(value="foundMonkey()"):@Before声明为在切入点方法执行之前执行,而后面没有直接声明切入点,而是value="foundMonkey()",是因为如果@afterReturning等都有所改动的时候都必须全部改动,所以统一用Pointcut的foundMonkey代替,这样子有改动的时候仅需改动一个地方。其他@AfterReturning类同。
      3是xml配置文件,里面有具体的注释。

特别说明:Guardian类里面的@Pointcut("execution(* com.samter.common.Monkey.stealPeaches(..))"),如果stealPeaches有参数则..表示所有参数,@AfterReturning("foundMonkey() && args(name,..)")的&& args(name,..)可以获取切入点方法stealPeaches的参数。

总结:这里列举了一个简单的例子,但是不难引申到应用中,当你写一个登陆系统的时候,你或许要记录谁成功登陆了系统,谁登陆系统密码错误等等的信息,这样子你用切面是再合适不过的了,总之当你的事务逻辑都设计到日志、安全检查、事务管理等等共同的内容的时候,用切面是要比你没有一个事务逻辑类都有相关代码或者相关引用好得多。

2011-08-04补充:
今天给筒子们上课,补充了一点。就是@Pointcut切入点的时候,我们改写一下正则表达式,修改为“@Pointcut("execution(* steal*(..))")”,意思就是说,针对工程下面所有的类以steal开头的方法都监控。即:我再添加一个大象类,它去偷香蕉(stealBanana)也会被抓。但是猴子类再加一个lookPeaches方法(看桃子)的话,就不会被抓。

  • src.rar (1.7 KB)
  • 下载次数: 181
4
0
分享到:
评论
3 楼 YY008871 2014-07-01  
感谢,写的非常好。
2 楼 wodesnake 2014-04-19  
非常感谢,通俗易懂
1 楼 pengchang_2008 2012-11-06  
最近学些spring的aop和Annotation看到此文,写的很好,我对你的例子按照spring3注解的方式改写了下,也能跑出来,在Monkey和Guardian类加上@Component("monkey")和@Component,在配置文件中加上了
<context:annotation-config/>
						   				
	   				<context:component-scan base-package="com.samter"/>
,前面也要增加
xmlns:context="http://www.springframework.org/schema/context"
这些引用,对main方法用junit的改写
@Test
	public void testMonkey() {
		ApplicationContext context = new ClassPathXmlApplicationContext(
				"config.xml");

		Monkey monkey = (Monkey) context.getBean("monkey");

		try {
			monkey.stealPeaches("孙大圣的大徒弟111111");
		} catch (Exception e) {

		}
	}
,但是运行出现了Cannot proxy target class because CGLIB2 is not available,加上了cglib-2.1.3.jar和asm.jar就可以得到和你相同的执行结果,我参考了
http://blog.csdn.net/oathevil/article/details/7288867

相关推荐

    spring AOP 实例(@AspectJ)

    一个基于@AspectJ的spring2.0 AOP应用实例,很小很简单,没有任何额外信息,最适合AOP入门学习。使用log4j打印信息。把项目直接import进myeclipse就可以使用啦......

    Spring AOP @AspectJ 入门实例

    NULL 博文链接:https://rain1109.iteye.com/blog/1838100

    spring2.5学习PPT 传智博客

    使用Spring的注解方式实现AOP入门 18.使用Spring的注解方式实现AOP的细节 19.使用Spring配置文件实现AOP 20.aspectj的切入点语法定义细节 21.搭建和配置Spring与jdbc整合的环境 22.Spring集成的jdbc编码和事务...

    Spring.3.x企业应用开发实战(完整版).part2

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    Spring3.x企业应用开发实战(完整版) part1

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    【2019版】Spring4.3入门视频课程

    Spring AOP的配置实现 AspectJ表达式 三、Spring注解配置 注解简介 IOC注解 AOP注解 四、Spring整合 Spring整合Web Spring整合JDBC Spring整合MyBatis 教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

    Spring攻略(第二版 中文高清版).part1

    第3章 Spring AOP和AspectJ支持 112 3.1 启用Spring的AspectJ注解支持 113 3.1.1 问题 113 3.1.2 解决方案 113 3.1.3 工作原理 113 3.2 用AspectJ注解声明aspect 115 3.2.1 问题 115 3.2.2 解决方案...

    Spring攻略(第二版 中文高清版).part2

    第3章 Spring AOP和AspectJ支持 112 3.1 启用Spring的AspectJ注解支持 113 3.1.1 问题 113 3.1.2 解决方案 113 3.1.3 工作原理 113 3.2 用AspectJ注解声明aspect 115 3.2.1 问题 115 3.2.2 解决方案...

    SpringSecurity 3.0.1.RELEASE.CHM

    入门 1. 介绍 1.1. Spring Security是什么? 1.2. 历史 1.3. 发行版本号 1.4. 获得Spring Security 1.4.1. 项目模块 1.4.1.1. Core - spring-security-core.jar 1.4.1.2. Web - spring-security-web.jar ...

    Spring Security-3.0.1中文官方文档(翻译版)

    Spring Security-3.0.1 中文官方文档(翻译版) 这次发布的Spring Security-3.0.1 是一个bug fix 版,主要是对3.0 中存在的一些问题进 行修 正。文档中没有添加新功能的介绍,但是将之前拼写错误的一些类名进行...

    Spring Security 中文教程.pdf

    入门 1. 介绍 1.1. Spring Security是什么? 1.2. 历史 1.3. 发行版本号 1.4. 获得Spring Security 1.4.1. 项目模块 1.4.1.1. Core - spring-security-core.jar 1.4.1.2. Web - spring-security-...

    spring学习笔记

    Spring的Ioc Spring的AOP , AspectJ Spring的事务管理 , 三大框架的整合 目录 1.1 Spring 框架学习路线:..........................................................................................................

Global site tag (gtag.js) - Google Analytics