`

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 入门实例

    本实例将带你深入理解并实践Spring AOP与@AspectJ的结合使用。 首先,了解AOP的基本概念。面向切面编程是一种编程范式,它允许程序员定义“切面”,即跨越多个对象的行为或责任。这些切面可以包含业务逻辑、日志、...

    spring AOP 实例(@AspectJ)

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

    spring AOP入门实例

    在这个入门实例中,我们将深入理解Spring AOP如何实现简单日志记录。 首先,AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入(Weaving)。切面是AOP中的核心...

    spring2-aop入门实例教程

    ### Spring2-AOP入门实例教程知识点详解 #### 一、Spring框架概述 - **轻量级J2EE开发框架**:Spring是一个轻量级的Java应用框架,它为开发复杂的企业级应用提供了一种简化的方法。 - **发展历程**:自2002年发布...

    使用Spring的注解方式实现AOP入门

    本教程将引导您入门Spring的注解式AOP实现。 首先,我们需要理解AOP的基本概念。AOP的核心是切面(Aspect),它封装了特定的关注点,如日志记录。切点(Pointcut)定义了在何时应用这些关注点,通常是一个方法调用...

    最简单的SpringAOP入门案例

    本教程将通过一个简单的Spring AOP入门案例,帮助初学者理解这一概念。 ### 一、AOP基础 1. **切面(Aspect)**:切面是关注点的模块化,它封装了跨越多个对象的行为或数据。在Spring AOP中,切面可以由一个类定义...

    Spring AOP入门及其实例讲解、下载

    **Spring AOP 入门及其实例讲解** 在软件开发中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种编程范式,它旨在提高代码的可重用性,减少冗余,并将关注点分离。Spring框架是Java开发中的一个流行...

    Aop之AspectJ详解解读demo

    AspectJ是Java平台上的一个开源AOP框架,它提供了一种强大的语言级支持来实现切面。本文将深入探讨AspectJ的使用、框架结构及其应用场景,并通过一个入门实例进行详细解释。 **一、AspectJ简介** AspectJ是一个...

    spring实例

    Spring框架是Java开发中广泛应用的一个开源框架,以其依赖注入(Dependency ...提供的压缩包文件中的spring1至spring5可能包含了Spring的入门示例、配置文件、源代码等,通过实践这些例子,可以加深对Spring的理解。

    学习Spring(一)入门

    Spring提供了两种实现AOP的方式:代理模式(Proxy)和基于注解的切面(@AspectJ)。 在实际项目中,我们通常会结合使用Spring的其他模块,如数据访问/集成层(Data Access/Integration),它包括了对JDBC、...

    spring 入门学习资料

    Spring支持两种AOP实现:基于代理的AOP(JDK动态代理和CGLIB代理)和基于AspectJ的AOP。前者用于处理接口,后者则可以处理类,提供更强大的功能。 6. **数据访问集成**: Spring提供对各种数据库访问技术的支持,...

    spring in action 第二版中文版

    《Spring in Action》第二版中文版是一本深受开发者欢迎的Spring框架入门与进阶书籍,旨在帮助读者深入理解和掌握Spring框架的核心概念和技术。这本书详细介绍了如何利用Spring进行企业级Java应用开发,包括依赖注入...

    Spring3学习资料(包含书签目录)

    - **入门示例**:提供一个简单的AOP入门示例,演示如何使用Spring来实现AOP的基本功能。 #### 5.3 基于Schema的AOP - **配置方式**:介绍如何通过XML配置文件来实现AOP。 - **示例代码**:给出具体的XML配置示例。...

    (入门)什么是AOP?什么是代理模式?怎么设计日志拦截器?

    在Spring框架中,AOP的实现主要依赖于Spring的AspectJ支持。AspectJ是一个全面的AOP语言,它可以声明切面、连接点(join point)、通知(advice)和切点表达式(pointcut expression)。连接点是指程序执行中的某个...

    Spring基础教学视频

    - **实现方式**:通过Spring的&lt;aop:config&gt;元素或@AspectJ注解实现。 #### 五、Spring MVC - **简介**:Spring MVC是Spring框架的一部分,专门用于构建Web应用程序。 - **架构**:基于Model-View-Controller设计...

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

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

Global site tag (gtag.js) - Google Analytics