`

Spring Aop Schema实现

阅读更多

本例使用的是Spring2.5

1.Aop配置文件spring-aop.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:p="http://www.springframework.org/schema/p"  
    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.5.xsd  
        http://www.springframework.org/schema/aop  
        http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">  
      
    <bean id="helloWorldServiceImpl" class="com.spring.bijian.aop.HelloWorldServiceImpl">  
    </bean>  
      
    <bean id="aspect" class="com.spring.bijian.aop.HelloWorldAspect">  
    </bean>  
      
    <aop:config>  
        <aop:pointcut id="pointcut" expression="execution(* com.spring..*.sayHello(..)) and args(user)"/>  
        <aop:aspect ref="aspect">  
            <aop:before pointcut-ref="pointcut" method="beforeAdvice(java.lang.String)" arg-names="user"/>  
            <aop:after pointcut="execution(* com.spring..*.sayHello(..))" method="afterAdvice"/>  
            <aop:after-returning pointcut="execution(* com.spring..*.sayAfterReturning(..))"   
                                 method="afterReturningAdvice"  
                                 arg-names="value"  
                                 returning="value"/>  
            <aop:after-throwing pointcut="execution(* com.spring..*.sayAfterThrowing(..))"  
                                method="afterThrowingAdvice"  
                                arg-names="e"  
                                throwing="e"/>  
            <aop:around pointcut="execution(* com.spring..*.sayAround(..))" method="aroundAdvice"/>  
        </aop:aspect>  
    </aop:config>  
</beans>

2.HelloWorldService接口

package com.spring.bijian.aop;

public interface HelloWorldService {  
	  
    public void sayHello(String username);  
    public boolean sayAfterReturning();   
    public void sayAfterThrowing();  
    public int sayAround(String username,String password);  
}

3.HelloWorldServiceImpl类

package com.spring.bijian.aop;

import java.lang.RuntimeException;

public class HelloWorldServiceImpl implements HelloWorldService {
	
	public void sayHello(String username) {
		System.out.println("My first Aop test " + username);
	}

	public boolean sayAfterReturning() {
		System.out.println("after returning");
		return true;
	}

	public void sayAfterThrowing() {
		System.out.println("After throwing");
		throw new RuntimeException();
	}

	public int sayAround(String username, String password) {
		System.out.println("Around username:" + username + ",password:" + password);
		int val = 1;
		return val;
	}
}

4.具体实现AOP编程的HelloWorldAspect类

package com.spring.bijian.aop;

import org.aspectj.lang.JoinPoint;  
import org.aspectj.lang.ProceedingJoinPoint;
  
public class HelloWorldAspect {  
      
    public void beforeAdvice(String user){  
        //System.out.println(jp.getArgs()[0].toString());   
        System.out.println("before advice " + user);  
    }  
      
    public void afterAdvice(JoinPoint jp){  
        System.out.println("after advice "+jp.getArgs()[0].toString());  
    }  
      
    public void afterReturningAdvice(Object value){  
        System.out.println("afterReturning advice "+value);  
          
    }  
    public void afterThrowingAdvice(Exception e){  
        System.out.println("after throwing advice exception:" + e);   
    }  
      
    public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable{  
        /**System.out.println(pjp.toLongString()); 
        System.out.println(pjp.getSignature().toString()); 
        System.out.println(pjp.getKind().toString()); 
        System.out.println(pjp.getArgs()[0].toString()); 
        System.out.println("name+psd");*/  
        Object [] obj = pjp.getArgs();  
        String username = (String) obj[0];  
        String password = (String) obj[1];  
        System.out.println(username+","+password);  
        Object retVal;  
        if(username.equals("bijian") && password.equals("color")){  
            retVal = pjp.proceed();  
        }else{  
            retVal = pjp.proceed(new Object[]{"ideal","*******"});  
        }  
        System.out.println("name+password");  
        if(retVal == null) System.out.println("false");  
        else{  
            System.out.println(retVal.toString());  
        }  
        return 2;  
    }  
}

5.测试类

package com.spring.bijian.aop;

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

public class AopTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		ApplicationContext context = new ClassPathXmlApplicationContext(
				"com/spring/bijian/aop/spring-aop.xml");
		HelloWorldService hello = (HelloWorldService) context
				.getBean("helloWorldServiceImpl");
		hello.sayHello("bijian");
//		System.out.println("===================================");
//		hello.sayAfterReturning();
//		System.out.println("===================================");
//		hello.sayAfterThrowing();
		System.out.println("===================================");
		Object val = (Object) hello.sayAround("bijian", "colo");
		System.out.println(val.toString());
	}
}

运行结果:

before advice bijian
My first Aop test bijian
after advice bijian
===================================
bijian,colo
Around username:ideal,password:*******
name+password
1
2

6.AOP Around(环绕通知)可以控制返回对象,即你可以返回一个与目标对象完全不同的返回值,虽然这很危险,但是你却可以办到。目标方法的返回值 就是 环绕通知的返回值。proceed() 方法可以在通知体内调用一次、多次 或根本不用调用;还可以控制执行方法的参数值。具体见aroundAdvice方法的实现。

        这里使用AOP Around就可以用来进行一个身份验证,通过面向切面编程(AOP)将验证部分独立出来,使得代码的耦合度降低,如果使用面向对象思想(OOP)就应该是独立写一个身份验证的方法,然后当需要使用该方法再去new 一个身份验证方法的类,然后传递参数通过验证类中的方法去验证,这样代码的耦合度就变强了。

 

文章来源:http://blog.csdn.net/acceptedxukai/article/details/7784986

分享到:
评论

相关推荐

    征服Spring AOP—— Schema

    总结来说,Spring AOP的Schema配置是实现面向切面编程的一种方式,它通过XML定义切面、切入点和通知,使得非侵入式的关注点分离成为可能。通过熟练掌握这一技术,开发者可以更好地组织代码,提升代码的可维护性和可...

    Spring  AOP实现方法大全

    【Spring AOP实现方法大全】 在Spring框架中,面向切面编程(Aspect-Oriented Programming,简称AOP)是一种强大的设计模式,它允许我们在不修改业务代码的情况下,插入额外的功能,比如日志记录、事务管理等。在...

    Spring AOP之基于Schema配置总结与案例

    **Spring AOP:基于Schema配置的总结与案例** 在Java企业级开发中,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,Spring AOP(面向切面编程)是解决横切关注点问题的一个重要工具,它允许我们把业务逻辑...

    spring aop xml实现

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许程序员在不修改源代码的情况下,通过在关键点(切点)插入拦截器(通知)来增强功能,实现横切关注点,如日志、事务管理等。XML配置是Spring AOP早期...

    Spring AOP依赖jar包

    Spring AOP 提供了在运行时实现切面的功能,无需修改现有代码。本篇文章将详细介绍 Spring AOP 的核心概念、如何配置以及所依赖的 Jar 包,特别是 `AspectJ 1.6.12` 版本。 1. **AOP 概念** - **切面(Aspect)**...

    Spring aop 基于schema的AOP支持及JoinPoint的使用、如何使用CGLIB代理

    Spring AOP提供了基于XML配置的元数据方式来实现切面,这被称为基于Schema的AOP支持。 1. **创建切面(Aspect)** - 切面通常是一个包含切点(Pointcut)和通知(Advice)的类。在XML配置中,我们需要定义一个`...

    SpringAop xml方式配置通知

    在Spring框架中,AOP通过代理实现,可以使用XML配置或注解进行配置。本篇文章主要聚焦于Spring AOP的XML配置通知。 **一、AOP概念解析** 1. **切面(Aspect)**:一个关注点的模块化,例如事务管理就是一个切面。...

    javaXML方式实现SpringAop编程(源码+jar包)

    本篇文章将深入探讨如何通过XML配置来实现Spring AOP,并结合提供的源码和jar包进行详细讲解。 首先,我们需要理解Spring AOP的基本概念。AOP是一种编程范式,用于将关注点(如日志、安全检查)与业务逻辑分离,...

    SpringAOP依赖包

    在Spring框架中,AOP通过代理模式实现,提供了声明式企业级服务,如事务管理、安全控制等,使得开发者无需在业务代码中插入这些繁琐的逻辑,从而提高了代码的可读性和可维护性。 首先,我们来了解Spring AOP的基本...

    Spring AOP+ehCache简单缓存系统解决方案

    在IT行业中,Spring AOP(面向切面编程)和ehCache是两个重要的工具,它们在构建高效、可扩展的应用程序时发挥着关键作用。本文将深入探讨如何利用这两个技术实现一个简单的缓存系统解决方案。 首先,Spring AOP是...

    spring aop 实现源代码--xml and annotation(带lib包)

    在Spring1.2或之前的版本中,实现AOP的传统方式就是通过实现Spring的AOP API来定义Advice,并设置代理对象。Spring根据Adivce加入到业务流程的时机的不同,提供了四种不同的Advice:Before Advice、After Advice、...

    spring-aop实例demo

    本实例将详细介绍如何在Spring 3.2.8版本中实现AOP。 首先,我们需要理解AOP的基本概念。AOP的核心是切面(Aspect),它包含了通知(Advice)和切点(Pointcut)。通知是在特定的连接点(Join Point)执行的代码,...

    Spring之AOP配置文件详解

    从上述配置可以看出,Spring AOP主要是通过`ProxyFactoryBean`来创建代理对象,通过配置不同的拦截器来实现对目标对象方法的增强。这种配置方式非常灵活,可以根据实际需求动态地添加或修改拦截器,从而实现特定的...

    基于注解配置和使用spring AOP(spring mvc框架)

    在Spring MVC框架中,AOP通常用于实现日志记录、事务管理、性能监控等功能。本篇文章将深入探讨如何在Spring MVC中配置和使用基于注解的AOP。 一、Spring AOP基础知识 1. **切面(Aspect)**:切面是关注点的模块...

    spring framework schema

    5. **AOP Schema**: `aop` schema涉及到面向切面编程,提供拦截器、通知和切面的配置。它允许开发者定义切点表达式,控制何时执行特定的代码片段,从而实现代码逻辑的分离。 6. **TX Schema**: `tx` schema处理事务...

    spring-aop-aspectj(Schema)-case

    学习这个案例,你将了解到如何使用XML Schema配置实现Spring AOP,包括创建切面、定义切入点、编写通知,并理解这些元素如何协同工作以实现AOP的功能。这将有助于你更好地理解和利用Spring AOP在实际项目中进行横切...

    最简单的SpringAOP入门案例

    5. **代理模式**:Spring AOP通过代理模式实现切面功能,有JDK动态代理和CGLIB代理两种方式,前者针对实现了接口的类,后者则用于未实现接口的类。 通过这个简单的案例,你应该对Spring AOP有了初步的理解。随着...

    spring-aop.xsd

    `spring-aop.xsd`文件是Spring AOP配置的XML Schema定义文件,用于指导和验证XML配置中的元素和属性,确保其符合规范,同时也为IDE提供代码提示和自动补全功能,提高开发效率。 在Java开发中,AOP(Aspect Oriented...

Global site tag (gtag.js) - Google Analytics