- 浏览: 276804 次
文章分类
最新评论
-
guji528:
oracle的统计函数真的很强大
Oracle 使用LAG和LEAD函数统计 -
haiyangyiba:
受教了
No Dialect mapping for JDBC type: 3 -
elvishehai:
能不能给个完整点的例子呀,我一直都没有试成功过,
简单的使用jackson的annotation -
miaoyue:
如果我想把name属性转成注释之后,之前的注释还在怎么做?
PowerDesigner 中将Comment(注释)及Name(名称)内容互相COPY的VBS代码 -
ianl_zt:
以上方法只适合在hibernate2中使用,现在hiberna ...
Hibernate的批量更新和删除
这个例子非常的简单,下面是实体类
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
发表评论
-
AnnotationFormatError when using Spring 3.0 & JavaConfig
2011-02-25 10:52 5780Spring 3.0M3 及其以后的版本包含 ... -
Spring Schemas and Namespaces
2010-05-11 11:34 5986本章研究Spring命名空间,你将学到新的并且更简单的办 ... -
Spring 中的一些事务注解属性
2010-01-11 10:36 4252用 spring 事务管理器, ... -
Spring 3.0呼之欲出
2009-10-28 10:20 3221业界最著名使用最广泛的开源Java框架Spring宣布推出3. ... -
CXF jaxws spring configuration
2009-08-27 11:35 4807如果大家只是想了解如何写jaxws:endpoint 配置文件 ... -
Spring与SOA
2009-08-27 09:28 44721.引言 SOA是一种构造分布式系统的方法,它将业务应用功能 ... -
Spring 2.5新特性(2)-Spring MVC中的新特性
2009-08-20 11:06 3928Spring框架从创建伊始就 ... -
Spring 2.5的新特性(1):配置简化和基于注解的功能
2009-08-20 10:55 4088简介 从诞生之初,Spring框架就坚守它的宗旨:简化企业级 ... -
Spring 2.5新特性及架构图
2009-07-03 09:04 3665Spring2.5是Spring2.1各个里程碑版本的终结。 ... -
Spring 2.5.6新特性之packagesToScan
2009-07-03 08:58 3199如果你使用早前版本的Spring,又恰好采用了Annotati ... -
图解Spring Security默认使用的过滤器
2009-06-15 11:03 3852首先看一下auto-config="tr ... -
使用 Spring 2.5 TestContext 测试框架
2009-04-29 16:41 3044Spring 2.5 TestContext 测试框架用于测试 ... -
Spring 2.5 Annotation
2009-04-07 11:44 3314基于注释(Annotation) ... -
spring 注解
2009-04-01 09:33 3075Spring JSR-250注解 注释配 ... -
Spring2.0用注解实现事务管理
2009-04-01 09:31 4413Spring2.0框架的事务处理有两大类: 1 编码式事务 ... -
Spring技巧之简洁配置
2009-01-09 11:08 3278Spring2.0在配置上调整了不少地方,增加更加灵活、简洁的 ... -
spring框架使用任务调度quartz的例子-TriggerListener 篇
2008-09-04 21:31 2580有时候我们的任务(Job)需要再某些任务完成之后 ... -
spring框架使用任务调度quartz的例子-Job and Trigger 篇
2008-09-04 21:21 2291MainJob.java 1package jobs; 2 ... -
基于struts+spring+ibatis的轻量级J2EE开发
2008-08-29 09:17 2106JpetStore 4.0是ibatis的最新示例程序,基于S ... -
关于IntrospectorCleanupListener
2008-08-15 10:28 3555spring中的提供了一个名为org.springframew ...
相关推荐
Spring 2.5 AOP(面向切面编程)...综上所述,Spring 2.5 AOP例子展示了如何利用类扫描和XML配置实现面向切面编程。通过理解这些概念和实践,我们可以更高效地管理和维护我们的应用程序,使其更具可扩展性和可维护性。
AspectJ是一个成熟的AOP框架,Spring在其AOP实现中整合了AspectJ,提供了更强大的面向切面编程能力。本篇文章将详细探讨在Spring 2.5中使用AspectJ进行AOP开发所需的知识点。 首先,我们需要理解AOP的核心概念: 1....
Spring 2.5还支持基于注解的AOP(面向切面编程)。`@Aspect`注解用于定义一个切面,`@Before`、`@After`、`@Around`、`@AfterReturning`和`@AfterThrowing`注解用于声明前置通知、后置通知、环绕通知、返回后通知和...
《精通Spring2.5》是一本深度探讨Spring框架的权威指南,主要针对Spring 2.5版本进行深入解析。Spring是Java企业级应用开发中最受欢迎的框架之一,它以其轻量级、模块化的设计,以及对IoC(Inversion of Control,...
这种面向切面编程(AOP)的特性,以及对注解的广泛支持,使得Spring MVC成为了一个更加灵活、高效且易于维护的Web应用开发框架。随着版本的更新,Spring MVC的注解功能也在不断扩展和完善,提供了更多用于构建现代...
### Spring2.5注解(标注)学习笔记 在探讨Spring2.5中常见的四个注解之前,我们先简要回顾一下Spring框架的基本概念。Spring框架是一个轻量级的Java应用开发框架,它通过依赖注入(DI)和面向切面编程(AOP)等...
Spring2.5版本是该框架的一个重要里程碑,它在2008年发布,带来了许多新特性和改进,提升了开发者在构建应用程序时的灵活性和效率。 **依赖注入(DI)和控制反转(IoC)** Spring的核心特性之一是依赖注入(Dependency...
Spring 2.5增加了对注解驱动的切面的支持,`@Aspect`、`@Before`、`@After`等注解使得AOP的使用更加直观。 4. **Bean工厂与ApplicationContext**: Spring 2.5中的Bean工厂是容器的基础,而ApplicationContext是更...
Spring2.5是核心的依赖注入(DI)和面向切面编程(AOP)框架,它可以管理对象的生命周期和依赖关系。在Spring2.5中,注解如`@Autowired`、`@Service`、`@Repository`和`@Controller`引入了无XML配置的可能性。`@...
9. **事务管理**:Spring 2.5的事务管理支持包括编程式和声明式两种方式,可以在不侵入业务代码的情况下实现事务的控制。 10. **国际化(i18n)支持**:Spring 2.5提供了更好的国际化支持,使得应用可以轻松地根据...
在Spring 2.5中,AOP支持更灵活的切入点表达式和更多类型的切面,如注解驱动的切面,这使得AOP更加易用和强大。 3. **Beans包**:这是Spring框架的基础,包含Bean的定义、实例化、配置和管理。在Spring 2.5中,对...
3. **AOP增强**:Spring的面向切面编程(AOP)在2.5版本中也有所改进,新增了`@Aspect`注解,允许开发者直接在类级别定义切面。此外,还支持了注解驱动的通知,如`@Before`、`@After`、`@Around`和`@AfterThrowing`。 ...
AspectJ是Spring AOP实现的基础,它提供了一种声明式的方式来定义切面,包括切入点、通知等,极大地简化了代码的组织结构。 接着是spring-beans.jar,这是Spring的核心组件,它负责Bean的创建、配置和管理。在AOP中...
3. **AOP(Aspect-Oriented Programming,面向切面编程)**:在Spring 2.5中,AOP支持更加丰富,包括注解式切面定义,如`@Before`、`@After`、`@Around`等,以及基于注解的切入点表达式,让切面的定义更加直观。...
其次,Spring2.5在AOP(面向切面编程)方面也有所加强。AOP是Spring用于实现横切关注点,如日志、事务管理的关键特性。在2.5版本中,AOP支持更灵活的切入点表达式,可以基于方法参数类型和注解进行匹配,增强了切面...
这个"Spring2.5-中文参考手册chm.zip"文件包含了关于Spring 2.5版本的详细中文指南,对于学习和理解Spring框架具有很高的价值。 Spring框架的核心特性包括依赖注入(Dependency Injection,DI)、面向切面编程...
综上所述,这个"spring2.5基于注解的例子程序"涵盖了Spring 2.5的核心特性,包括注解驱动的配置、自动扫描、基于注解的事务管理、AOP支持、MVC框架的使用,以及依赖注入等。通过学习和理解这个例子,开发者可以更好...
通过阅读《Spring2.5-中文参考手册.chm》这份文档,开发者可以深入了解Spring 2.5的各种特性和用法,解决实际开发中遇到的问题,提升开发效率。文档不仅包含详细的API参考,还包含丰富的示例和最佳实践指导,是学习...
Spring框架是一个开源的Java平台,它主要简化了企业级应用的开发工作,通过依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)等核心特性,实现了代码的解耦和模块化。...