Spring中使用AspectJ实现AOP

一,一些基本概念

               Spring除了IOC容器之外,另一大核心就是AOP了。Spring 中AOP是通过AspectJ来实现的。

          

       首先来看下AOP 的相关概念:

       1,Aspect

                    对横切性关注点的模块化。

        2,Advice

                     对横切性关注点的具体实现

       3,Cross Cutting Concern

                    一种独立服务,它会遍布在系统的处理流程之中。

        4,PointCut

                      定义了Advice应用到哪些JoinPoint上,对Spring来说是方法的调用

        5,Weave

                       将Advice应用到Target Object上的过程叫做织入,Spring支持的是动态织入。

         6,Target Objet

                       Advice被应用的对象

        7,Proxy

                        Spring AOP 默认使用JDK的动态代理,它的代理是运行时创建的,也可以使用CGLIB代理

         8,Introduction

                        可以动态的为类添加方法。

               9,JointPoint           

                      Advice在应用程序上执行的时机,而spring只支持方法JointPoint,这个点也可以使属性修改

二,采用Annotation方式实现AOP

         1,引入AspectJ的Jar包:

                          

          2,定义Aspect

                                  将横切点——检查安全性模块化,写入SecurityHandler类中。

          3,采用注解指定SecurityHandler为Aspect

                            

            4,采用注解定义Advice和Pointcut

                       

@Aspect
public class SecurityHandler {
	/*PointCut定义了Advice应用到哪些JointPoint上,对Spring来说是方法的调用
	 * 定义Pointcut,Pointcut的名称为addMethod(),此方法没有返回值和参数
	 * 该方法就是一个标识,不进行调用
	 * */
	@Pointcut("execution(* add*(..))")
	private void addMethod(){
	}

	/*
	 * 定义Advice(对横切性关注点的具体实现),表示我们的Advice应用到哪些pointcut订阅的Joinpoint上
	 * */
	@Before("addMethod()")
	private void  checkSecurity(){
		//TODO:放入检查安全性的方法
		System.out.println("--------checkSecurity------------");
	}
}

         5,启用AspectJ对Annotation的支持,并且将目标类和Aspect类配置到IoC容器中

      

三,采用静态配置文件方式实现AOP

        对于前面的SecurityHandler类,只留下Advice的方法体:

public class SecurityHandler {
	private void  checkSecurity(){
		//TODO:Some things
		System.out.println("--------checkSecurity------------");
	}
}

         将应用时机,应用时机与具体实现的关联放到配置文件中:

              

               概念好多,但是总的来说,就两方面,一个是我要切入的方法,一个是我要定义在什么时候切入这个方法,放到类上说,就是把切面对象的方法应用到目标对象。

时间: 2024-12-21 23:03:13

Spring中使用AspectJ实现AOP的相关文章

谈谈Spring中的IOC和AOP概念

  IOC和AOP是spring中的两个核心的概念,下面谈谈对这两个概念的理解. 1. IOC(Inverse of Control):控制反转,也可以称为依赖倒置.         所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B.所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如果不倒置,意思就是A主动获取B的实例:B b = new B(),这就是最简单的获取B实例的方法(当然还有各种设计模式可以帮助你去获得B的实

Spring中的AOP(一)——AspectJ的基本使用

    AOP(Aspect Orient Programming),也就是面向切面编程,作为面向对象编程的一种补充,当前已经成为一种比较成熟的编程思想,其实AOP问世的时间并不长,甚至在国内的翻译还不太统一(另有人翻译为"面向方面编程").AOP和OOP(Object Orient Programming,面向对象编程)互为补充,OOP将程序分解成各个层次的对象,而AOP则将程序运行过程分解成各个切面.可以这样理解:OOP是从静态角度考虑程序结构,而AOP则从动态角度考虑程序运行过程

Spring中基于aop命名空间的AOP 一(一点准备工作和一个例子)

在某些时候,我们工程中使用的JDK 不一定就是1.5 以上,也就是说可能不支持Annotation 注解,这时自然也就不能使用@AspectJ 注解驱动的AOP 了,那么如果我们仍然想使用AspectJ 灵活的切入点表达式,那么该如何呢?Spring 为我们提供了基于xml schematic 的aop 命名空间,它的使用方式和@AspectJ 注解类似,不同的是配置信息从注解中转移到了Spring 配置文件中.在这里,我们将详细介绍如何使用Spring 提供的<aop:config/> 标签

在Spring 2.0中集成AspectJ

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

Spring中的AOP(七)——基于XML配置文件方式的AOP

    除了前面介绍的基于JDK1.5的注解方式来定义切面,切入点和增强处理外,Spring AOP也允许直接使用XML配置文件来管理它们.在JDK1.5之前,只能使用配置文件的方式来管理,在Spring2.X后提供了一个新的aop命名空间来定义切面.切入点和增强处理.     相比之下,使用XML配置文件方式有如下优点: 如果没有使用JDK1.5以上版本,只能使用XML配置文件的方式 对早期的Spring用于来说更加习惯,而且这种方式允许使用纯粹的POJO来支持AOP 采用XML配置方式时,我

Spring中的AOP(二)——AOP基本概念和Spring对AOP的支持

AOP的基本概念     AOP从运行的角度考虑程序的流程,提取业务处理过程的切面.AOP面向的是程序运行中的各个步骤,希望以更好的方式来组合业务逻辑的各个步骤.AOP框架并不与特定的代码耦合,AOP框架能处理程序执行中特定切入点,而不与具体某个类耦合(即在不污染某个类的情况下,处理这个类相关的切点).下面是一些AOP的一些术语:     切面(Aspect):业务流程运行的某个特定步骤,也就是应用运行过程的关注点,关注点通常会横切多个对象,因此常被称为横切关注点     连接点(JoinPoi

Spring中的AOP(六)——定义切入点和切入点指示符

定义切入点     在前文(点击查看)中使用到的AdviceTest类中同一个切点(即* com.abc.service.*.advice*(..)匹配的连接点)却重复定义了多次,这显然不符合软件设计的原则,为了解决这个问题,AspectJ和Spring都提供了切入点的定义.所谓定义切入点,其实质就是为一个切入点表达式起一个名称,从而允许在多个增强处理中重用该名称.     Spring AOP只支持以Spring Bean的方法执行组作为连接点,所以可以把切入点看作所有能和切入表达式匹配的Be

Spring中的AOP(三)——基于Annotation的配置方式(一)

    AspectJ允许使用注解用于定义切面.切入点和增强处理,而Spring框架则可以识别并根据这些注解来生成AOP代理.Spring只是使用了和AspectJ 5一样的注解,但并没有使用AspectJ的编译器或者织入器,底层依然使用SpringAOP来实现,依然是在运行时动态生成AOP代理,因此不需要增加额外的编译,也不需要AspectJ的织入器支持.而AspectJ采用编译时增强,所以AspectJ需要使用自己的编译器来编译Java文件,还需要织入器.     为了启用Spring对@A

Spring中的AOP(五)——定义切入点和切入点指示符

定义切入点     在前文(点击查看)中使用到的AdviceTest类中同一个切点(即* com.abc.service.*.advice*(..)匹配的连接点)却重复定义了多次,这显然不符合软件设计的原则,为了解决这个问题,AspectJ和spring都提供了切入点的定义.所谓定义切入点,其实质就是为一个切入点表达式起一个名称,从而允许在多个增强处理中重用该名称.     Spring AOP只支持以Spring Bean的方法执行组作为连接点,所以可以把切入点看作所有能和切入表达式匹配的Be