`
hypgr
  • 浏览: 277755 次
社区版块
存档分类
最新评论

Spring2.5注解实现AOP

阅读更多

这个例子非常的简单,下面是实体类

package test;

/**
 * 
 * @author neu_20063500
 * 
 */
public class HelloWorld {

 public void sayHello(String helloworld) {
  System.out.println(helloworld);
  throw new RuntimeException();
                //这个异常是拿来测试,可有可无
 }
}

 
 

想使用AOP去处理这个sayHello方法

那么我们定义切面

 

package test;   
  
import org.aspectj.lang.ProceedingJoinPoint;   
import org.aspectj.lang.annotation.After;   
import org.aspectj.lang.annotation.AfterReturning;   
import org.aspectj.lang.annotation.AfterThrowing;   
import org.aspectj.lang.annotation.Around;   
import org.aspectj.lang.annotation.Aspect;   
import org.aspectj.lang.annotation.Before;   
import org.aspectj.lang.annotation.Pointcut;   
  
/**  
 *   
 * @author neu_20063500  
 *   
 */  
@Aspect  
public class AspectS {   
  
    // execution最常用,可以通过 & || !进行切入点表达式的连接   
    // 可是是表达式,可以通过切入点标识重用表达式   
    @Pointcut("execution(public void test.HelloWorld.sayHello(String))")   
    public void helloworld() {   
    }   
  
    @Before("execution(public void test.HelloWorld.sayHello(String))")   
    public void beforeSayHello() {   
        System.out.println("before sayHello");   
    }   
  
    @After("helloworld()")   
    public void afterSayHello() {   
        System.out.println("after sayHello");   
    }   
  
    @AfterThrowing("test.AspectS.helloworld()")   
    public void exceptionSayHello() {   
        System.out.println("throw runtime exception");   
    }   
  
    @AfterReturning("test.AspectS.helloworld()")   
    public void returnSayHello() {   
        System.out.println("method has returned");   
    }   
  
    @Around("test.AspectS.helloworld()")   
    public Object aroundSayHello(ProceedingJoinPoint pjp) {   
        Object obj = null;   
        try {   
            System.out.println("around start");   
            obj = pjp.proceed();   
            System.out.println("around end");   
        } catch (Throwable e) {   
            e.printStackTrace();   
        }   
        return obj;   
    }   
       
    /*  
 
任意公共方法的执行:  
 
execution(public * *(..))  
任何一个以“set”开始的方法的执行:  
 
execution(* set*(..))  
AccountService 接口的任意方法的执行:  
 
execution(* com.xyz.service.AccountService.*(..))  
定义在service包里的任意方法的执行:  
 
execution(* com.xyz.service.*.*(..))  
定义在service包或者子包里的任意方法的执行:  
 
execution(* com.xyz.service..*.*(..))  
在service包里的任意连接点(在Spring AOP中只是方法执行) :  
 
within(com.xyz.service.*)  
在service包或者子包里的任意连接点(在Spring AOP中只是方法执行) :  
 
within(com.xyz.service..*)  
实现了 AccountService 接口的代理对象的任意连接点(在Spring AOP中只是方法执行) :  
 
this(com.xyz.service.AccountService)  
'this'在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得代理对象可以在通知体内访问到的部分。  
实现了 AccountService 接口的目标对象的任意连接点(在Spring AOP中只是方法执行) :  
 
target(com.xyz.service.AccountService)  
'target'在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得目标对象可以在通知体内访问到的部分。  
任何一个只接受一个参数,且在运行时传入的参数实现了 Serializable 接口的连接点 (在Spring AOP中只是方法执行)   
 
args(java.io.Serializable)  
'args'在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得方法参数可以在通知体内访问到的部分。  
请注意在例子中给出的切入点不同于 execution(* *(java.io.Serializable)): args只有在动态运行时候传入参数是可序列化的(Serializable)才匹配,而execution 在传入参数的签名声明的类型实现了 Serializable 接口时候匹配。  
 
有一个 @Transactional 注解的目标对象中的任意连接点(在Spring AOP中只是方法执行)   
 
@target(org.springframework.transaction.annotation.Transactional)  
'@target' 也可以在binding form中使用:请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。  
任何一个目标对象声明的类型有一个 @Transactional 注解的连接点(在Spring AOP中只是方法执行)  
 
@within(org.springframework.transaction.annotation.Transactional)  
'@within'也可以在binding form中使用:- 请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。  
任何一个执行的方法有一个 @Transactional annotation的连接点(在Spring AOP中只是方法执行)   
 
@annotation(org.springframework.transaction.annotation.Transactional)  
'@annotation' 也可以在binding form中使用:- 请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。  
任何一个接受一个参数,并且传入的参数在运行时的类型实现了 @Classified annotation的连接点(在Spring AOP中只是方法执行)   
 
@args(com.xyz.security.Classified)  
'@args'也可以在binding form中使用:- 请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。  
 
*/  
}  

 

然后定义配置文件,注意将切面对象和实体对象交给Spring管理:

 

<?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:context="http://www.springframework.org/schema/context"  
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
    xsi:schemaLocation="      
    http://www.springframework.org/schema/beans       
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd       
    http://www.springframework.org/schema/context       
    http://www.springframework.org/schema/context/spring-context-2.5.xsd      
    http://www.springframework.org/schema/aop      
    http://www.springframework.org/schema/aop/spring-aop-2.5.xsd      
    http://www.springframework.org/schema/tx      
    http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">   
    <context:annotation-config />   
    <aop:aspectj-autoproxy />   
    <bean id="aspects" class="test.AspectS"></bean>   
    <bean id="helloworld" class="test.HelloWorld"></bean>   
</beans>  
 

 

然后使用客户端调用:

 

package test;   
  
import org.springframework.context.ApplicationContext;   
import org.springframework.context.support.ClassPathXmlApplicationContext;   
  
public class Client {   
  
 public static void main(String[] args) {   
  ApplicationContext cx = new ClassPathXmlApplicationContext(   
    "applicationContext.xml");   
  HelloWorld bean = (HelloWorld)cx.getBean("helloworld");   
  bean.sayHello("hello world");   
 }   
} 

 

 

当sayHello没有抛出异常时,执行结果是:

 

before sayHello   
around start   
hello world   
after sayHello   
method has returned   
around end  

 

 

当sayHello执行抛出异常时候,执行结果是

 

around start   
hello world   
after sayHello   
throw runtime exception  

 

 

给出一个比较典型和常用的切点:

package test;   
  
import org.aspectj.lang.annotation.Aspect;   
import org.aspectj.lang.annotation.Pointcut;   
  
@Aspect  
public class SystemArchitecture {   
  
    /**  
     * A join point is in the web layer if the method is defined in a type in  
     * the com.xyz.someapp.web package or any sub-package under that.  
     */  
    @Pointcut("within(com.xyz.someapp.web..*)")   
    public void inWebLayer() {   
    }   
  
    /**  
     * A join point is in the service layer if the method is defined in a type  
     * in the com.xyz.someapp.service package or any sub-package under that.  
     */  
    @Pointcut("within(com.xyz.someapp.service..*)")   
    public void inServiceLayer() {   
    }   
  
    /**  
     * A join point is in the data access layer if the method is defined in a  
     * type in the com.xyz.someapp.dao package or any sub-package under that.  
     */  
    @Pointcut("within(com.xyz.someapp.dao..*)")   
    public void inDataAccessLayer() {   
    }   
  
    /**  
     * A business service is the execution of any method defined on a service  
     * interface. This definition assumes that interfaces are placed in the  
     * "service" package, and that implementation types are in sub-packages.  
     *   
     * If you group service interfaces by functional area (for example, in  
     * packages com.xyz.someapp.abc.service and com.xyz.def.service) then the  
     * pointcut expression "execution(* com.xyz.someapp..service.*.*(..))" could  
     * be used instead.  
     */  
    @Pointcut("execution(* com.xyz.someapp.service.*.*(..))")   
    public void businessService() {   
    }   
  
    /**  
     * A data access operation is the execution of any method defined on a dao  
     * interface. This definition assumes that interfaces are placed in the  
     * "dao" package, and that implementation types are in sub-packages.  
     */  
    @Pointcut("execution(* com.xyz.someapp.dao.*.*(..))")   
    public void dataAccessOperation() {   
    }   
}  


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/neusoftware_20063500/archive/2009/04/27/4129957.aspx

 

分享到:
评论

相关推荐

    Spring 2.5 AOP 例子

    Spring 2.5 AOP(面向切面编程)...综上所述,Spring 2.5 AOP例子展示了如何利用类扫描和XML配置实现面向切面编程。通过理解这些概念和实践,我们可以更高效地管理和维护我们的应用程序,使其更具可扩展性和可维护性。

    Spring2.5使用AOP需要的aspectJ

    AspectJ是一个成熟的AOP框架,Spring在其AOP实现中整合了AspectJ,提供了更强大的面向切面编程能力。本篇文章将详细探讨在Spring 2.5中使用AspectJ进行AOP开发所需的知识点。 首先,我们需要理解AOP的核心概念: 1....

    spring2.5注解驱动

    Spring 2.5还支持基于注解的AOP(面向切面编程)。`@Aspect`注解用于定义一个切面,`@Before`、`@After`、`@Around`、`@AfterReturning`和`@AfterThrowing`注解用于声明前置通知、后置通知、环绕通知、返回后通知和...

    精通Spring2.5pdf书籍proSpring2.5

    《精通Spring2.5》是一本深度探讨Spring框架的权威指南,主要针对Spring 2.5版本进行深入解析。Spring是Java企业级应用开发中最受欢迎的框架之一,它以其轻量级、模块化的设计,以及对IoC(Inversion of Control,...

    Spring 2.5 基于注解驱动的Spring MVC

    这种面向切面编程(AOP)的特性,以及对注解的广泛支持,使得Spring MVC成为了一个更加灵活、高效且易于维护的Web应用开发框架。随着版本的更新,Spring MVC的注解功能也在不断扩展和完善,提供了更多用于构建现代...

    Spring2.5注解(标注)学习笔记

    ### Spring2.5注解(标注)学习笔记 在探讨Spring2.5中常见的四个注解之前,我们先简要回顾一下Spring框架的基本概念。Spring框架是一个轻量级的Java应用开发框架,它通过依赖注入(DI)和面向切面编程(AOP)等...

    Spring2.5-中文参考手册chm

    Spring2.5版本是该框架的一个重要里程碑,它在2008年发布,带来了许多新特性和改进,提升了开发者在构建应用程序时的灵活性和效率。 **依赖注入(DI)和控制反转(IoC)** Spring的核心特性之一是依赖注入(Dependency...

    Spring2.5 源代码

    Spring 2.5增加了对注解驱动的切面的支持,`@Aspect`、`@Before`、`@After`等注解使得AOP的使用更加直观。 4. **Bean工厂与ApplicationContext**: Spring 2.5中的Bean工厂是容器的基础,而ApplicationContext是更...

    struts2.0 spring2.5 hibernate3.2 注解最新框架

    Spring2.5是核心的依赖注入(DI)和面向切面编程(AOP)框架,它可以管理对象的生命周期和依赖关系。在Spring2.5中,注解如`@Autowired`、`@Service`、`@Repository`和`@Controller`引入了无XML配置的可能性。`@...

    spring2.5的所有jar包

    9. **事务管理**:Spring 2.5的事务管理支持包括编程式和声明式两种方式,可以在不侵入业务代码的情况下实现事务的控制。 10. **国际化(i18n)支持**:Spring 2.5提供了更好的国际化支持,使得应用可以轻松地根据...

    spring 2.5框架图

    在Spring 2.5中,AOP支持更灵活的切入点表达式和更多类型的切面,如注解驱动的切面,这使得AOP更加易用和强大。 3. **Beans包**:这是Spring框架的基础,包含Bean的定义、实例化、配置和管理。在Spring 2.5中,对...

    spring2.5中文文档

    3. **AOP增强**:Spring的面向切面编程(AOP)在2.5版本中也有所改进,新增了`@Aspect`注解,允许开发者直接在类级别定义切面。此外,还支持了注解驱动的通知,如`@Before`、`@After`、`@Around`和`@AfterThrowing`。 ...

    spring_2.5_aop_lib.zip

    AspectJ是Spring AOP实现的基础,它提供了一种声明式的方式来定义切面,包括切入点、通知等,极大地简化了代码的组织结构。 接着是spring-beans.jar,这是Spring的核心组件,它负责Bean的创建、配置和管理。在AOP中...

    传智播客spring2.5源代码

    3. **AOP(Aspect-Oriented Programming,面向切面编程)**:在Spring 2.5中,AOP支持更加丰富,包括注解式切面定义,如`@Before`、`@After`、`@Around`等,以及基于注解的切入点表达式,让切面的定义更加直观。...

    Spring2.5-中文参考手册chm.zip

    这个"Spring2.5-中文参考手册chm.zip"文件包含了关于Spring 2.5版本的详细中文指南,对于学习和理解Spring框架具有很高的价值。 Spring框架的核心特性包括依赖注入(Dependency Injection,DI)、面向切面编程...

    spring2.5基于注解例子程序

    综上所述,这个"spring2.5基于注解的例子程序"涵盖了Spring 2.5的核心特性,包括注解驱动的配置、自动扫描、基于注解的事务管理、AOP支持、MVC框架的使用,以及依赖注入等。通过学习和理解这个例子,开发者可以更好...

    spring 2.5中文帮助文档

    通过阅读《Spring2.5-中文参考手册.chm》这份文档,开发者可以深入了解Spring 2.5的各种特性和用法,解决实际开发中遇到的问题,提升开发效率。文档不仅包含详细的API参考,还包含丰富的示例和最佳实践指导,是学习...

    spring2.5中文文档(PDF)

    Spring框架是一个开源的Java平台,它主要简化了企业级应用的开发工作,通过依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)等核心特性,实现了代码的解耦和模块化。...

    struts1.2 + spring2.5 + hibernate3.2框架demo

    Spring2.5是一个全面的后端应用管理框架,提供了依赖注入、AOP(面向切面编程)、数据访问等服务;Hibernate3.2则是一个对象关系映射(ORM)工具,简化了数据库操作。 首先,Struts1.2框架的核心是ActionServlet,...

Global site tag (gtag.js) - Google Analytics