Aop面向切面编程

切面(Aspect):
  一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关
  注点的很好的例子。在Spring AOP中,切面可以使用基于模式)或者基于@Aspect注解的方式来实现。
连接点(Joinpoint):
  在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。在Spring
  AOP中,一个连接点总是表示一个方法的执行。
通知(Advice):
  在切面的某个特定的连接点上执行的动作。其中包括了“around”、“before”和“after”等
  不同类型的通知(通知的类型将在后面部分进行讨论)。许多AOP框架(包括Spring)都是以拦截器做通知模型,
  并维护一个以连接点为中心的拦截器链。
切入点(Pointcut):
  匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行
  (例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用
AspectJ切入点语法。
引入(Introduction):
  用来给一个类型声明额外的方法或属性(也被称为连接类型声明(inter-type
  declaration))。Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用引入
  来使一个bean实现IsModified接口,以便简化缓存机制。
目标对象(Target Object):
  被一个或者多个切面所通知的对象。也被称做被通知(advised)对象。 既然Spring
  AOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。
AOP代理(AOP Proxy):
  AOP框架创建的对象,用来实现切面契约(例如通知方法执行等等)。在Spring中,
  AOP代理可以是JDK动态代理或者CGLIB代理。
织入(Weaving):
  把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象。这些可以在编译时
  (例如使用AspectJ编译器),类加载时和运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。

==================================================

==================================================

 1.添加配置

<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.5.4</version>
</dependency> <!-- 或者这个,他会自动导入aspectj,
用这个就可以使用annotation的注释功能-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
<!-- 这一句 -->
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"
>

2.写一个通之类,用于添加到别处

public class MyAspect {

    public void beforeAdvice() {
System.out.println("前置通知....");
}
/*后置通知如果需要接受方法的返回值才能做下去的话,参数是OBj,因为不知道返回式
是什么类型*/
public void afterAdvice(Object obj) {
System.out.println("后置通知..." + obj);
}
// 如果需要获取异常信息,可以传入参数信息
public void exceptionAdvice(Exception ex) {
System.out.println("异常通知..." + ex.getMessage());
} public void finallyAdvice() {
System.out.println("最终通知....");
}
//需要传进去参数ProceedingJoinPoint
public void aroundAdvice(ProceedingJoinPoint jp) { try {
System.out.println("前置通知");
// 这个方法代表了目标方法的执行
Object obj = jp.proceed();
System.out.println("后置通知");
} catch (Throwable e) {
e.printStackTrace();
System.out.println("异常通知");
} finally {
System.out.println("最终通知");
} } }

3.将写通知的类交给spring管理

 

<!-- 1.将通知类交给Spring管理 -->
<bean id="myAspect" class="com.kaishengit.service.MyAspect"/> <!-- 配置aop项 -->
<aop:config>
<!-- ref定义通知类是哪一个 -->
<aop:aspect ref="myAspect">
<!-- 2.定义切入点表达式 :指的是指定通知类加载到哪个类,哪个方法上
第一个*代表方法的返回类型(各种) com.kaishengit.dao包名
..(两个)指的是本包,及其子包
*代表这个包里面的所有类
.后面的*,代表类里面的所有方法
(..)参数列表不限-->
<aop:pointcut expression="execution(* com.kaishengit.dao..*.*(..))" id="myPointcut"/>
<!-- 3.定义通知类型 -->
<!-- 前置通知 method="beforeAdvice"指定前置通知的方法,指定切入点表达式-->
<aop:before method="beforeAdvice" pointcut-ref="myPointcut"/>
<!-- 后置通知 ,有返回值的话,就把返回值给后置通知.return的是OBJ,因为返回的类型不定-->
<aop:after-returning method="afterAdvice" pointcut-ref="myPointcut" returning="obj"/>
<!-- 异常通知 如果需要知道异常信息 throwing="ex"-->
<aop:after-throwing method="exceptionAdvice" pointcut-ref="myPointcut" throwing="ex"/>
<!-- 最终通知 -->
<aop:after method="finallyAdvice" pointcut-ref="myPointcut"/> <!-- 这是环绕通知,与前面的四个有可替代性,定义了前面四个,就不要定义这个
定义这个,就不要定义前面四个,他可以替代前面的四个通知,方法在上面定义,上去看看-->
<aop:around method="aroundAdvice" pointcut-ref="myPointcut"/>
</aop:aspect>
</aop:config>

  

spring aop 笔记2的更多相关文章

  1. Spring AOP笔记

    AOP的核心概念 AOP(Aspect-Oriented Programming)面向切面编程可以实现横切点与他们所影响的对象之间的解耦.如将公共的日志.权限.事务等业务隔离出来,但不影响原来程序的逻 ...

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

    Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...

  3. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  4. Spring学习笔记(二)Spring基础AOP、IOC

    Spring AOP 1. 代理模式 1.1. 静态代理 程序中经常需要为某些动作或事件作下记录,以便在事后检测或作为排错的依据,先看一个简单的例子: import java.util.logging ...

  5. Spring4.0学习笔记(10) —— Spring AOP

    个人理解: Spring AOP 与Struts 的 Interceptor 拦截器 有着一样的实现原理,即通过动态代理的方式,将目标对象与执行对象结合起来,降低代码之间的耦合度,主要运用了Proxy ...

  6. Spring学习笔记IOC与AOP实例

    Spring框架核心由两部分组成: 第一部分是反向控制(IOC),也叫依赖注入(DI); 控制反转(依赖注入)的主要内容是指:只描述程序中对象的被创建方式但不显示的创建对象.在以XML语言描述的配置文 ...

  7. spring学习笔记二 注解及AOP

    本节需要导入spring-aop包 注解 使用注解的目的是为了代替配置,在使用注解时,省略键时,则是为value赋值. 扫描某个包下的所有类中的注解 <?xml version="1. ...

  8. Spring AOP 整理笔记

    一.AOP概念 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 利用AOP可以对业务逻辑的各 ...

  9. Spring AOP学习笔记

      Spring提供了一站式解决方案:          1) Spring Core  spring的核心功能: IOC容器, 解决对象创建及依赖关系          2) Spring Web ...

随机推荐

  1. 向前辈致敬 strspn

    把8位的CHAR型数据分解为:前5位和后3位,这样2^5 = 32个CHAR型数+值就可表示所有的CHAR型数据 这样做的好处:在给出子串后,不用比较256次,最多比较32次即可判断出是否一个数在子串 ...

  2. [C# 基础知识系列]专题六:泛型基础篇——为什么引入泛型

    引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...

  3. JS 在html中的位置

    前言 当我了解完html在浏览器中的解析渲染流程后,反而又发现了新的困扰自己的问题. Q:即然html要渲染需要渲染树,而渲染树又需要DOMTree和CSSRuleTree,DOMTree需要解析HT ...

  4. C++内联函数与宏定义

    用内联取代宏: 1.内联可调试: 2.可进行类型安全检查或自动类型转换: 3.可访问成员变量. 另外,定义在类声明中的成员函数自动转化为内联函数. 文章(一) 内联函数与宏定义 在C中,常用预处理语句 ...

  5. 【Java】 实现一个简单文件浏览器(1)

    学习Java的Swing的时候写的一个超简单文件浏览器 效果如图: 项目结构: 这里面主要用了两个控件,JTree和JTable 下面先说下左侧的文件树如何实现: 首先是FileTree类,继承于JT ...

  6. Contributing to Open Source on GitHub(转)

    A great way to get involved in open source is to contribute to the existing projects you’re using. G ...

  7. 微信开发_微信教程__微信通讯框架V1.0

    做个广告先, PHP千人群(6848027) C++群 (1414577) 看雪汇编&反汇编群(15375777) 看雪汇编&反汇编2群(4915800) 转载不一定注明出处,只要推荐 ...

  8. windows下安装MySQLdb模块

    从http://www.codegood.com/downloads 下载mysqldb相应的exe文件直接安装. 我用的是MySQL-python-1.2.3.win32-py2.7.exe

  9. IOS 表视图(UITableVIew)的使用方法(5)表视图的编辑功能(删除)

    默认的,如果表视图支持编辑,那用户可以通过两种方式来删除某些行,其一为单击左侧的红色按钮后行右侧显示“Delete”按钮,其二为在单元行上的手指向左滑动,“Delete”按钮也会出现供用户单击.无论哪 ...

  10. Linux软件安装包中devel与非devel包之间的区别

    带devel(develop)的包,俗称开发包.功能上与普通包相同,但体积更大使用rpm -qi看看这两类包的区别: # rpm -qi glibc-devel-2.12-1.149.el6.x86_ ...