1:什么是aop?

Aspect Oriented Programming 面向切面编程
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

面向对象编程是从【静态角度】考虑程序的结构,而面向切面编程是从【动态角度】考虑程序运行过程。
AOP底层,就是采用【动态代理】模式实现的。采用了两种代理:JDK动态代理和CGLIB动态代理。

2:

基本术语(一些名词):
(1)切面(Aspect)
切面泛指[*交叉业务逻辑*]。事务处理和日志处理可以理解为切面。常用的切面有通知(Advice)与顾问(Advisor)。实际就是对主业务逻辑的一种增强。

(2)织入(Weaving)
织入是指将切面代码插入到目标对象的过程。代理的invoke方法完成的工作,可以称为织入。

(3) 连接点(JoinPoint)
连接点是指可以被切面织入的方法。通常业务接口的方法均为连接点

(4)切入点(PointCut)
切入点指切面具体织入的方法
注意:被标记为final的方法是不能作为连接点与切入点的。因为最终的是不能被修改的,不能被增强的。

(5)目标对象(Target)
目标对象指将要被增强的对象。即包含主业务逻辑的类的对象。

(6)通知(Advice)
通知是切面的一种实现,可以完成简单的织入功能。通知定义了增强代码切入到目标代码的时间点,是目标方法执行之前执行,还是执行之后执行等。切入点定义切入的位置,通知定义切入的时间。

(7)顾问(Advisor)
顾问是切面的另一种实现,能够将通知以更为复杂的方式织入到目标对象中,是将通知包装为更复杂切面的装配器。

3:配置前置丶后置丶环绕丶异常通知增强

定义接口:

  1. package methodBefore;
  2.  
  3. public interface IsomeService {
  4. public void doTran();
  5. public void doLog();
  6. }

定义实现类:

  1. package methodBefore;
  2.  
  3. public class SomeServiceimpl implements IsomeService {
  4.  
  5. @Override
  6. public void doTran() {
  7. // TODO Auto-generated method stub
  8. System.out.println("事务开始");
  9. }
  10.  
  11. @Override
  12. public void doLog() {
  13. // TODO Auto-generated method stub
  14. System.out.println("日志开始");
  15. }
  16.  
  17. }

定义代理类:

  1. package methodBefore;
  2.  
  3. import java.lang.reflect.Method;
  4.  
  5. import org.aopalliance.intercept.MethodInvocation;
  6. import org.springframework.aop.MethodBeforeAdvice;
  7.  
  8. //MethodBeforeAdvice 前置接口
  9. //AfterReturningAdvice 后置接口
  10. //MethodInterceptor环绕接口
  11. public class MethodBeforeAdviceimpl implements MethodBeforeAdvice //AfterReturningAdvice MethodInterceptor
  12. {
  13.  
  14. //MethodBeforeAdvice 接口中重写的方法
  15. @Override
  16. public void before(Method arg0, Object[] arg1, Object arg2)
  17. throws Throwable {
  18. System.out.println("==before");
  19. //System.out.println("==after");
  20. }
  21.  
  22. /*@Override
  23. * AfterReturningAdvice 接口中重写的方法
  24. public void afterReturning(Object arg0, Method arg1, Object[] arg2,
  25. Object arg3) throws Throwable {
  26. System.out.println("===after=====");
  27.  
  28. }*/
  29.  
  30. /*@Override
  31. * MethodInterceptor接口中重写的方法
  32. public Object invoke(MethodInvocation arg0) throws Throwable {
  33. System.out.println("after");
  34. arg0.proceed();
  35. System.out.println("before");
  36. return null;
  37. }*/
  38.  
  39. }

配置文件:

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="
  4. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <bean id="impl" class="MyThrowsException.SomeServiceimpl"></bean>
  6. <bean id="before" class="MyThrowsException.MethodBeforeAdviceimpl"></bean>
  7. <bean id="beanfactory" class="org.springframework.aop.framework.ProxyFactoryBean">
  8. <property name="target" ref="impl"></property>
  9. <property name="interceptorNames" value="before"></property>
  10. </bean>
  11. </beans>

但是使用以上方式代码的灵活度不高:原因是无法指定在具体哪个业务方法之前(或之后)配置增强代码

在配置文件中注入这段代码:配置advisor来包装advice 来配置各种增强类型

  1. <!-- 03.配置顾问 advisor 包装 advice-->
  2. <bean id="beforeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
  3. <property name="advice" ref="beforeAdvice"></property>
  4. <property name="pattern" value=".*do.*"></property>
  5. </bean>

4:当然 spring集成了另一种方式来实现aop编程:aspectj

切面类:

  1. package cn.happy.aop;
  2.  
  3. import org.aspectj.lang.annotation.Aspect;
  4. import org.aspectj.lang.annotation.Before;
  5.  
  6. //普通类 切面类
  7. @Aspect
  8. public class MyAspect {
  9. @Before(value = "execution(* *..service.*.*(..))")
  10. public void MyBeforeAdvice(){
  11. System.out.println("====before");
  12. }
  13. }

配置文件:如此简单

  1. <aop:config>
  2. <aop:pointcut expression="execution(* *..SomeServiceImpl.doLog(..))" id="beforePointcut"/>
  3. <aop:aspect ref="myAspect">
  4. <aop:before method="myBefore(org.aspectj.lang.JoinPoint)" pointcut-ref="beforePointcut"/>
  5. </aop:aspect>
  6. </aop:config>

使用spring方式来实现aop编程的更多相关文章

  1. spring 学习之二 AOP编程

    AOP概念 AOP, aspect oriented programing,翻译过来就是面向切面编程的意思,那什么叫面向切面编程呢?相对于之前传统的纵向继承方式来对原有功能进行功能扩展, 面向切面编程 ...

  2. AOP编程,spring实现及JDK,CGLIB实现

    什么是AOP? AOP(Aspect-OrientedProgramming,面向方面编程)和OOP(Object-Oriented Programing,面向对象编程)思想不同,两者并非对立关系,前 ...

  3. Spring AOP编程(二)-AOP实现的三种方式

    AOP的实现有三种方式: l         aop底层将采用代理机制进行实现. l         接口 + 实现类 :spring采用 jdk 的动态代理Proxy. l         实现类: ...

  4. spring AOP编程--AspectJ注解方式

    1. AOP 简介 AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, ...

  5. spring AOP 编程--AspectJ注解方式 (4)

    1. AOP 简介 AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, ...

  6. Spring学习笔记之四----基于Annotation的Spring AOP编程

    你能使用@Aspect annotation将某个Java类标注为Aspect,这个Aspect类里的所有公有方法都可以成为一个Advice,Spring提供了5个Annotation去将某个方法标注 ...

  7. Spring框架--AOP编程

    2 手动实现AOP编程 AOP 面向切面的编程, AOP可以实现"业务代码"与"关注点代码"分离 // 保存一个用户 public void add(User ...

  8. Spring之注解实现aop(面向切面编程)

    1:Aop(aspect object programming)面向切面编程,名词解释:    1.1:功能:让关注点代码与业务逻辑代码分离    1.2:关注点        重复代码就叫做关注点  ...

  9. Spring之AOP编程

    一.AOP简介     AOP的英文全称是Aspect Oriented Programming,意为:面向切面编程.     AOP采取横向抽取的机制,取代了传统纵向继承体系的代码复用.AOP常用于 ...

随机推荐

  1. Java字节、十进制、十六进制、字符串之间的相互转换

    1. 字节转10进制 直接使用(int)类型转换. /* * 字节转10进制 */ public static int byte2Int(byte b){ int r = (int) b; retur ...

  2. [deviceone开发]-do_Http组件示例

    一.简介 详细展示do_Http组件的使用,包括get,post,upload,form,download的http请求.另外还附加了一个Java实现的后台程序作为参考.初学者强烈推荐. 二.效果图 ...

  3. 可轮播滚动的Tab选项卡

    前段时间有试着搭建个后台主题ui框架,有用到可支持滚动的Tab选项卡,模仿着H+后台主题ui框架中的代码造轮子改造了下,可惜代码在公司,不能把代码外发出来(感觉这样被限制了很多,对于这样的公司没办法, ...

  4. SharePoint 自定义的列表页面中添加javascript的一个 For循环语句后,该页面就打不开了。

    一个sharepoint 2013的普通的列表的自定义新建页面,我在其中新添加几行javascript代码后页面就打不开了.如图所示: 真是一言不合,友谊的页面说打不开就打不开啊.后来慢慢比对发现是因 ...

  5. Android 更新UI的几种方式

    1.Activity的 runOnUiThread textView = (TextView) findViewById( R.id.tv ); new Thread(new Runnable() { ...

  6. React Native之FlexBox介绍和使用

    # 前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会 ...

  7. iOS 摇一摇的功能

    效果如下 相关素材 相关代码如下 #import "ShakeViewController.h" #import <AudioToolbox/AudioToolbox.h&g ...

  8. Reveal1.5破解,iOS_UI调试利器Reveal最新版本破解方法

    Reveal1.0.7破解 1.官网下载最新版Reveal,拖动应用程序中,运行一次2.下载16进制编辑器"0xED" for mac(http://dl.vmall.com/c0 ...

  9. 锋友分享:国行和非国行iPhone的送修需知

    锋友 hfln0829 分享了一些关于苹果 iPhone 售后服务的注意事项以及有可能的维修方式.他表示,无论是国行还是港版送修,都必须关闭查找我的 iPhone 这个功能,如果你关闭不了,售后不会受 ...

  10. Windows on Device 项目实践 2 - 感光灯制作

    在上一篇<Windows on Device 项目实践 1 - PWM调光灯制作>中,我们学习了如何利用Intel Galileo开发板和Windows on Device来设计并完成一个 ...