实现aop的几种方式,spring实现aop的几种方式及其适用场合

1,spring实现aop的几种方式及其适用场合本人暂且把spring 中的aop理解成一种方法的拦截器(可能有所片面,主要是方便理解) 。个人通俗理解,就好比你去自动取款机取钱,边上装了个摄像头在监视着 。你取你的钱,不用管那摄像头干嘛,只是对于摄像头来说,已经把你取钱的这一过程记录了下来 。你取钱的这一过程我们可以从oop角度分析,而对于摄像头来说,就是从aop角度去分析了 。反映到我下面要讲的示例就是系统日志的记录 。我要讲的示例大致是这样的,从oop角度分析 , 就是说现在有一个user对象,然后你要调用业务逻辑实现去保存(或者其他行为)这个user对象,或者说是做持久化操作 , 把user对象相关信息写进数据库 。那么从aop角度来看,就是在你进行保存对象这一行为发生的时候进行日志记录 。就是说,你在进行业务操作的时候,不需要去关心系统背后到底做了啥,spring aop它已经帮你搞定了 。aop 可以说是spring的一大特色,主要应用场景有事物管理、权限、日志这几块用的比较多 。
2,Java实现AOP的几种方式(1)AOP的各种实现在编译器修改源代码、在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码 。以下是各种实现机制的比较:类别分为静态AOP(包括静态织入)和动态AOP(包括动态代理、动态字节码生成、自定义类加载器、字节码转换) 。静态织入:a、原理:在编译期,切面直接以字节码形式编译到目标字节码文件中 ;b、优点:对系统性能无影响; c、缺点:不够灵活;动态代理 :a、原理:在运行期,目标类加载后,为接口动态生成代理类 。将切面织入到代理类中;b、优点:更灵活;c、缺点:切入的关注点要实现接口;
3,Spring的AOP框架是如何搭建并实现的ioc:控制反转 , 是一种设计模式 。一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制;第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系 。他们的依赖关系只在使用的时候才建立 。aop:面向切面,是一种编程思想,oop的延续 。将系统中非核心的业务提取出来 , 进行单独处理 。比如事务、日志和安全等 。spring 的aop和ioc都是为了解决系统代码耦合度过高的问题 。使代码重用度高、易于维护 。不过aop和ioc并不是spring中特有的 , 只是spring把他们应用的更灵活方便从源头上说 aop总共有那么几种方法1.用AspectJ,这需要引入该语法的编译器,但是功能最强大 , spring貌似有对其提供支持或者封装,用spring可以不用引入AspectJ编译器直接是用Annotation来是用aspectJ的aop功能 。2.是用asm或apache commons项目的BCEL包直接操作class文件,如 。spring中需要引入asm包,所以里面肯定有引用该功能的地方 。如Hibernate即是使用该包实现实体映射 。【实现aop的几种方式,spring实现aop的几种方式及其适用场合】
4,spring配置aop的方式有哪些在Spring中实现AOP根据版本不同 , 可以有大致四种配置方式 。现简单列一下 。在介绍Spring的AOP配置方式前,先要注意Spring中Advisor的概念 。在Spring中Advisor是Advice和Pointcut的结合 , 但它还不是AOP概念上的Aspect 。因为在Spring中Advisor还是Spring用来生成Aspect对象的一个原型,根据配置的不同,Spring可以只对某个类生成Aspect , 也可以对所有的类生成Aspect 。1. 基于xml配置文件的代理配置方式这种方式在2.0以后很少用了,原因是配置项过多,过于繁琐 。但对于理解Spring AOP还是很有帮助的1.1 定义通知<bean id="advice" class="yourAdviceImpl" />1.2 定义切点要定义一个切点,可以选择使用正则表达式方式声明的切点或者AspectJ方式声明的切点 。对正则表达式切点,使用Perl5RegexpMethodPointcut或JdkRegexpMethodPointcut(Java 1.4以上版本,不需要Jakarta ORO的支持了);对AspectJ切点 , 使用AspectJExpressPointcut<bean id="pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"><property name="pattern"value="http://www.lisdn.com/gkrj/shwd/yourRegularExpression" /></bean><bean id="pointcut" class="org.springframework.aop.aspectj.AspectJExpressionPointcut"><property name="expression" value="http://www.lisdn.com/gkrj/shwd/yourAspectJExpression" /></bean>1.3 定义通知者DefaultPointcutAdvisor是Spring提供的默认通知者,它需要提供通知和切点的引用 。Spring也提供了RegexpMethodPointcutAdvisor和AspectJExpressionPointcutAdvisor来对应两种声明切点的方式,不用再单独定义切点 。<bean id="advisor" class="org.springframework.aop.support.DefaultPointcutAdvisor"><property name="advice" ref="advice" /><property name="pointcut" ref="pointcut" /></bean><bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"><property name="advice" ref="advice" /><property name="pattern" value="http://www.lisdn.com/gkrj/shwd/yourRegularExpression" /></bean><bean id="advisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcut"><property name="advice" ref="advice" /><property name="expression" value="http://www.lisdn.com/gkrj/shwd/yourAspectjExpression" /></bean>1.4 定义ProxyFactoryBean<bean id="yourBean" class="org.springframework.aop.framework.ProxyFactoryBean><property name="target" ref="yourTargetBean" /><property name="interceptorNames" value="http://www.lisdn.com/gkrj/shwd/advisor" /><property name="proxyInterfaces" value="http://www.lisdn.com/gkrj/shwd/interfaceClass" /></bean>interceptorNames和proxyInterfaces都是数组属性 , 所以可以声明要使用的一个list,也可以让Spring自动把单个值转化为数组上面明确定义了要对那个targetBean应用代理生成切面实例 。如果不想限制targetBean , 可以让Spring为所有匹配切点声明的bean生成切面实例,这样就不用一个个定义ProxyFactoryBean了 , 只需要定义<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />这是一个BeanPostProcessor , 所以Spring会自动识别并在bean的声明周期使用2 利用2.0以后使用aop标签<aop:config><aop:aspect ref=""><aop:pointcut id="performance" expression="execution(* *.perform(..))" /> <aop:before method="" pointcut-ref="performance" /> <aop:before method="" pointcut="execution(* *.perform(..))" /> <aop:after-returning method="" pointcut="execution(* *.perform(..))" /> <aop:after-throwing method="" pointcut="execution(* *.perform(..))" /></aop:aspect></aop:config>3 利用Annotation3.1 利用@Aspect将一个POJO类声明为一个切面 。3.2 定义切点@Pointcut("execution(* *.perform(..))")public void performance()通过@Pointcut定义的切点的名字就是它所注解的方法的名字 , 因此例子中的切点名字是performance() 。这里声明的performance()方法实际圣只是一个标记,为@Pointcut提供附加的点,并不要求有实际意义 。3.3 定义通知对要执行切面的方法,通过@Before("performance()"),@AfterReturning("performance()")来定义通知 。注意这里提供的切点名称,是performance(),而不是performance如果对上面的两点不是很理解,也可以省略@Pointcut,而将AspectJ表达式直接定义在@Before等通知中,将上面的两步合为一步,如@Before("execution(* *.perform(..))")3.4 通知Spring创建代理<aop:aspectj-autoproxy>这实际上相当于声明了一个AnnotationAwareAspectJAutoProxyCreator,从而根据@Pointcut声明的切点来自动代理匹配的bean实例4 在Spring中结合进AspectJ对于超出Spring AOP支持范围的,可以采用这种方式 。只需要在Spring中配置AspectJ的Class实例时让Spring能够获得AspectJ类的实例就可以了,比如<bean class="a_aspectj_class" factory-method="aspectOf"><preperty ..../></bean>5,spring配置aop的方式有哪些1. 基于xml配置文件的代理配置方式这种方式在2.0以后很少用了 , 原因是配置项过多,过于繁琐 。但对于理解spring aop还是很有帮助的1.1 定义通知1.2 定义切点要定义一个切点,可以选择使用正则表达式方式声明的切点或者aspectj方式声明的切点 。对正则表达式切点,使用perl5regexpmethodpointcut或jdkregexpmethodpointcut(java 1.4以上版本,不需要jakarta oro的支持了);对aspectj切点,使用aspectjexpresspointcut1.3 定义通知者defaultpointcutadvisor是spring提供的默认通知者,它需要提供通知和切点的引用 。spring也提供了regexpmethodpointcutadvisor和aspectjexpressionpointcutadvisor来对应两种声明切点的方式,不用再单独定义切点 。1.4 定义proxyfactorybeaninterceptornames和proxyinterfaces都是数组属性,所以可以声明要使用的一个list,也可以让spring自动把单个值转化为数组上面明确定义了要对那个targetbean应用代理生成切面实例 。如果不想限制targetbean,可以让spring为所有匹配切点声明的bean生成切面实例,这样就不用一个个定义proxyfactorybean了 , 只需要定义这是一个beanpostprocessor , 所以spring会自动识别并在bean的声明周期使用2 利用2.0以后使用aop标签3 利用annotation3.1 利用@aspect将一个pojo类声明为一个切面 。3.2 定义切点@pointcut("execution(* *.perform(..))")public void performance()通过@pointcut定义的切点的名字就是它所注解的方法的名字,因此例子中的切点名字是performance() 。这里声明的performance()方法实际圣只是一个标记,为@pointcut提供附加的点,并不要求有实际意义 。3.3 定义通知对要执行切面的方法,通过@before("performance()"),@afterreturning("performance()")来定义通知 。注意这里提供的切点名称,是performance(),而不是performance如果对上面的两点不是很理解,也可以省略@pointcut,而将aspectj表达式直接定义在@before等通知中,将上面的两步合为一步,如@before("execution(* *.perform(..))")3.4 通知spring创建代理这实际上相当于声明了一个annotationawareaspectjautoproxycreator,从而根据@pointcut声明的切点来自动代理匹配的bean实例 4 在spring中结合进aspectj 对于超出spring aop支持范围的,可以采用这种方式 。只需要在spring中配置aspectj的class实例时让spring能够获得aspectj类的实例就可以了 , 比如在Spring中实现AOP根据版本不同,可以有大致四种配置方式 。现简单列一下 。在介绍Spring的AOP配置方式前,先要注意Spring中Advisor的概念 。在Spring中Advisor是Advice和Pointcut的结合,但它还不是AOP概念上的Aspect 。因为在Spring中Advisor还是Spring用来生成Aspect对象的一个原型 , 根据配置的不同,Spring可以只对某个类生成Aspect,也可以对所有的类生成Aspect 。1. 基于xml配置文件的代理配置方式这种方式在2.0以后很少用了,原因是配置项过多,过于繁琐 。但对于理解Spring AOP还是很有帮助的1.1 定义通知1.2 定义切点要定义一个切点,可以选择使用正则表达式方式声明的切点或者AspectJ方式声明的切点 。对正则表达式切点,使用Perl5RegexpMethodPointcut或JdkRegexpMethodPointcut(Java 1.4以上版本,不需要Jakarta ORO的支持了);对AspectJ切点,使用AspectJExpressPointcut1.3 定义通知者DefaultPointcutAdvisor是Spring提供的默认通知者,它需要提供通知和切点的引用 。Spring也提供了RegexpMethodPointcutAdvisor和AspectJExpressionPointcutAdvisor来对应两种声明切点的方式,不用再单独定义切点 。1.4 定义ProxyFactoryBeaninterceptorNames和proxyInterfaces都是数组属性,所以可以声明要使用的一个list,也可以让Spring自动把单个值转化为数组上面明确定义了要对那个targetBean应用代理生成切面实例 。如果不想限制targetBean,可以让Spring为所有匹配切点声明的bean生成切面实例,这样就不用一个个定义ProxyFactoryBean了,只需要定义这是一个BeanPostProcessor,所以Spring会自动识别并在bean的声明周期使用2 利用2.0以后使用aop标签3 利用Annotation3.1 利用@Aspect将一个POJO类声明为一个切面 。3.2 定义切点@Pointcut("execution(* *.perform(..))")public void performance()通过@Pointcut定义的切点的名字就是它所注解的方法的名字,因此例子中的切点名字是performance() 。这里声明的performance()方法实际圣只是一个标记,为@Pointcut提供附加的点,并不要求有实际意义 。3.3 定义通知对要执行切面的方法 , 通过@Before("performance()"),@AfterReturning("performance()")来定义通知 。注意这里提供的切点名称,是performance(),而不是performance如果对上面的两点不是很理解,也可以省略@Pointcut,而将AspectJ表达式直接定义在@Before等通知中,将上面的两步合为一步,如@Before("execution(* *.perform(..))")3.4 通知Spring创建代理这实际上相当于声明了一个AnnotationAwareAspectJAutoProxyCreator,从而根据@Pointcut声明的切点来自动代理匹配的bean实例 4 在Spring中结合进AspectJ 对于超出Spring AOP支持范围的,可以采用这种方式 。只需要在Spring中配置AspectJ的Class实例时让Spring能够获得AspectJ类的实例就可以了,比如