Spring 2.X中AOP的使用浅析

和Spring1.X相比,Spring2.X使用AspectJ的语法来声明AOP,这使得它更“标准”,更灵活了。还是那句话,如果你不了解AspectJ并且打算使用Spring2.X的AspectJ式AOP,那就学学AspectJ吧,这方面的书还是很多了。

Spring2.X下的切面有两种实现方式,一种是以Java文件定义切面(其只是普通的Java类),然后在配置文件中声明定义的切面;另一种是在Java类中引入和AOP相关的元数据(注释)。

先介绍第一种配置方式。需要指出的是,Spring2.X的beans名称空间和Spring1.X有所不同,它采用了Schema而不是DTD(也可采用DTD方式,具体的请参考文档)。还是引入毫无意义的日志切面,定义的切面类LogingAspect 如下:

public class LogingAspect {
  public void logMethod(JoinPoint jp){
   System.err.println(jp.getTarget().getClass());
   System.err.println(jp.getSignature().getName());
  }
}

同时在配置文件中如下配置:

< bean id = " logAspectTarget " class = " hibernatesample.service.util.LogingAspect " >
</ bean >
< aop:config >
< aop:aspect id = " logAspect " ref = " logAspectTarget " >
< aop:pointcut id = " businessService " expression = " execution(* hibernatesample.service.*.*(..)) " />
< aop:after pointcut - ref = " businessService " method = " logMethod " />
</ aop:aspect >
</ aop:config >

对于上面的切面,切入点businessService是在配置文件中声明的,其表达式采用了 AspectJ的语法,LogingAspect 类中logMethod(JoinPoint jp)方法根据配置文件信息可知其是after通知,方法的JoinPoint参数不是必须的,它是来自于AspectJ的实用类,这里用它不过输出一些和连接点有关的信息。当然,在Spring2.X中,切入点和通知能更灵活的使用,我们可以如AspectJ一样传递参数给通知。如果需要在Service中引入事务功能,需要如下配置事务通知:

< tx:advice id = " txAdvice " transaction - manager = " transactionManager " >
< tx:attributes >
< tx:method name = " get* " read - only = " true " />
< tx:method name = " find* " read - only = " true " />
< tx:method name = " * " />
</ tx:attributes >
</ tx:advice >
< aop:config >
< aop:pointcut id = " demoServiceMethods " expression = " execution(* hibernatesample.service.*.*(..)) " />
< aop:advisor advice - ref = " txAdvice " pointcut - ref = " demoServiceMethods " />
< aop:aspect id = " logAspect " ref = " logAspectTarget " >
< aop:pointcut id = " businessService " expression = " execution(* hibernatesample.service.*.*(..)) " />
< aop:after pointcut - ref = " businessService " method = " logMethod " />
</ aop:aspect >
</ aop:config >

完成上面的工作相当于完成了 Spring1.X 的 自动代理。 我们接下来需要定义的任何 Service Bean 都可以很纯粹很纯粹了:

< bean id ="accountService" class ="hibernatesample.service.impl.AccountServiceImpl" >
< property name ="accountDAO" ref ="accountDAO" ></ property >
</ bean >

时间: 2024-08-30 08:59:23

Spring 2.X中AOP的使用浅析的相关文章

举例讲解Java的Spring框架中AOP程序设计方式的使用_java

1.什么是AOP AOP是Aspect Oriented Programming的缩写,意思是面向方面编程,AOP实际是GoF设计模式的延续. 2.关于Spring AOP的一些术语: A.切面(Aspect):在Spring AOP中,切面可以使用通用类或者在普通类中以@Aspect 注解(@AspectJ风格)来实现 B.连接点(Joinpoint):在Spring AOP中一个连接点代表一个方法的执行 C.通知(Advice):在切面的某个特定的连接点(Joinpoint)上执行的动作.通

Spring中AOP的原理?

问题描述 面试问Spring中AOP的原理?用到哪些技术?答:通过动态代理技术,然后简单说了些实现方式.这只是其中的一种,还有其他的吗?答:........求大哥们指点! 问题补充:suziwen 写道 解决方案 其实它的代理 :分为动态代理和静态代理解决方案二:spring 提供了多种不同的方案实现对 bean 的 aop proxy, 包括 ProxyFactoryBean, 便利的 TransactionProxyFactoryBean 以及 AutoProxyCreator 等, 下图是

在Spring 2.0中集成AspectJ

在Java语言中,从织入切面的方式上来看,存在三种织入方式:编译期织入.类加载期织入和运行期织入.编译期织入是指在Java编译期,采用特殊的编译器,将切面织入到Java类中:而类加载期织入则指通过特殊的类加载器,在类字节码加载到JVM时,织入切面:运行期织入则是采用CGLib工具或JDK动态代理进行切面的织入. AspectJ采用编译期织入和类加载期织入的方式织入切面,是语言级的AOP实现,提供了完备的AOP支持.它用AspectJ语言定义切面,在编译期或类加载期将切面织入到Java类中. 在低

Java Spring的IoC和AOP的知识点速记

Spring简介 Spring解决的最核心的问题就是把对象之间的依赖关系转为用配置文件来管理,这个是通过Spring的依赖注入机制实现的. Spring Bean装配 1. IOC的概念以及在Spring容器中如何进行IOC的操作. IOC:Inversion of Control,控制反转.在Java开发中,IOC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制,这称为控制反转,就是被调用类的实例由原先的调用类控制创建.销毁现在转变成由Spring的容器管理. 2. Spring容器

Spring学习笔记之aop动态代理(3)

Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. PersonDao.java public interface PersonDao { public void savePerson(); } PersonDaoImpl.java public class PersonDaoImpl implements PersonDao{ public void save

spring-Spring中aop的@Before,使用时出错,在线等!急!

问题描述 Spring中aop的@Before,使用时出错,在线等!急! org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.config.internalAutoProxyCreator': Instantiation of bean failed; nested exception is org.springframewo

【Spring实战】—— 10 AOP针对参数的通知

通过前面的学习,可以了解到 Spring的AOP可以很方便的监控到方法级别的执行 ,针对于某个方法实现通知响应. 那么对于方法的参数如何呢? 比如我们有一个方法,每次传入了一个字符串,我想要知道每次传入的这个字符串是神马?这又如何办到呢! 举个Action上面的例子,一个思考者(thinker),每次在思考时,都会传入一个字符串作为思考的内容. 我们想要每次获取到这个思考的内容,实现一个通知.因此读心者可以通过AOP直接监控到每次传入的内容. 源码参考 首先看一下思考者的接口和实现类: pack

PHP中的流(streams)浅析

  这篇文章主要介绍了PHP中的流(streams)浅析,本文讲解了流的概述.流基础知识.php://包装器.流上下文(Stream Contexts)等内容,需要的朋友可以参考下 概述 流(streams)是PHP4.3版本引入的一个特性,主要是为了统一文件.sockets以及其他类似资源的工作方法.PHP4.3距今已经有很长时间了,但是很多程序员似乎都不能正确使用PHP中的流,当然这也包括我.以前也在一些程序中遇到过流的使用,如php://input,但是一直没机会整理,今天就把这部分知识整

Javascript中的Callback方法浅析

 这篇文章主要介绍了Javascript中的Callback方法浅析,本文讲解了什么是callback.Javscript Callback.Callback是什么.Callback实例等内容,需要的朋友可以参考下     什么是callback   代码如下: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的