一、简介
  
1、AOP用在哪些方面:AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制,异常处理等,封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

2、AOP中的概念:
   
Aspect(切面):指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面是横切性关注点的抽象.

joinpoint(连接点):所谓连接点是指那些被拦截到的点(可以是方法、属性、或者类的初始化时机(可以是Action层、Service层、dao层))。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器)

Pointcut(切入点):所谓切入点是指我们要对那些joinpoint进行拦截的定义,也即joinpoint的集合.


Advice(通知):
所谓通知是指拦截到joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知

Target(目标对象):代理的目标对象

Weave(织入)
:指将aspects应用到target对象并导致proxy对象创建的过程称为织入.

Introduction(引入):
在不修改类代码的前提下,
Introduction可以在运行期为类动态地添加一些方法或Field.

  
3、AOP带来的好处::降低模块的耦合度;使系统容易扩展;更好的代码复用性

二、通过注解方式实现Spring的AOPSpring
AOP环境的环境与上篇博文

Spring接口方式相同)

注解在项目中已经到处都是了,撇开一些优劣不提,开发的便利性和可读性是非常的方便的。用来配置Spring
AOP也非常简单便利
步骤一、编写业务类:

@Component   
//使用自动注解的方式实例化并初始化该类
public class Business {
   // 切入点
   
public String delete(String obj) {
       
System.out.println("==========调用切入点:" + obj +
"说:你敢删除我!===========\n");
       
return obj + ":瞄~";
    }

public
String add(String obj) {
       
System.out.println("================这个方法不能被切。。。==============
\n");
       
return obj + ":瞄~ 嘿嘿!";
    }

public
String modify(String obj) {
       
System.out.println("=================这个也设置加入切吧====================\n");

return obj + ":瞄改瞄啊!";
    }

}

步骤二、切面类:

// @Aspect : 标记为切面类
 // @Pointcut : 指定匹配切点集合
 // @Before : 指定前置通知,value中指定切入点匹配
 // @AfterReturning :后置通知,具有可以指定返回值
// @AfterThrowing :异常通知
 //注意:前置/后置/异常通知的函数都没有返回值,只有环绕通知有返回值
@Component   
//首先初始化切面类
@Aspect     
//声明为切面类,底层使用动态代理实现AOP
public class AspectAdvice {

//
指定切入点匹配表达式,注意它是以方法的形式进行声明的。
    //即切点集合是:aop.annotation包下所有类所有方法

//第一个*
代表返回值类型

//如果要设置多个切点可以使用 || 拼接
 
@Pointcut("execution(* aop.annotation.*.*(..))|| execution(*
com.action.admin.*.*update*(..))")
    public void
anyMethod() {
    }

//前置通知
   //在切点方法集合执行前,执行前置通知
   @Before("execution(*
aop.annotation.*.*(..))")

    public void
doBefore(JoinPoint jp) {
       
System.out.println("===========进入before advice============
\n");

System.out.print("准备在" + jp.getTarget().getClass() + "对象上用");
       
System.out.print(jp.getSignature().getName() + "方法进行对 '");
       
System.out.print(jp.getArgs()[0] + "'进行删除!\n\n");

System.out.println("要进入切入点方法了 \n");
    }

//
后置通知

 @AfterReturning(value = "anyMethod()",
returning = "result")

    public void
doAfter(JoinPoint jp, String result) {
       
System.out.println("==========进入after advice=========== \n");
       
System.out.println("切入点方法执行完了 \n");

System.out.print(jp.getArgs()[0] + "在");
       
System.out.print(jp.getTarget().getClass() + "对象上被");
       
System.out.print(jp.getSignature().getName() + "方法删除了");
       
System.out.print("只留下:" + result + "\n\n");
    }

// 环绕通知(##环绕通知的方法中一定要有ProceedingJoinPoint
参数,与
   
//Filter中的 
doFilter方法类似)

@Around("execution(*
aop.annotation.*.*(..))")

    public
Object doAround(ProceedingJoinPoint
pjp) throws Throwable {
       
System.out.println("===========进入around环绕方法!=========== \n");
 HttpSession session =
ServletActionContext.getRequest().getSession();
    
Emp login =(Emp)
session.getAttribute("login");//ssh2整合后AOP也可以得到request、response、session等

// 调用目标方法之前执行的动作
       
System.out.println("调用方法之前: 执行!\n");

// 调用方法的参数
       
Object[] args = pjp.getArgs();
       
// 调用的方法名
       
String method = pjp.getSignature().getName();
       
// 获取目标对象(形如:com.action.admin.LoginAction@1a2467a)
       
Object target = pjp.getTarget();
      
//获取目标对象的类名(形如:com.action.admin.LoginAction)
     
String targetName = pjp.getTarget().getClass().getName();
       
// 执行完方法的返回值:调用proceed()方法,就会触发切入点方法执行
       
Object result =
pjp.proceed();//result的值就是被拦截方法的返回值

System.out.println("输出:" + args[0] + ";" + method + ";" + target +
";" + result + "\n");
       
System.out.println("调用方法结束:之后执行!\n");
     
return result;
    }

// 异常通知
   
   @AfterThrowing(value
= "execution(* aop.annotation.*.*(..))", throwing = "e")

    public void
doThrow(JoinPoint jp, Throwable e) {
       
System.out.println("删除出错啦");
    }

}

 步骤三、xml配置:

<?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:p="http://www.springframework.org/schema/p"
   
xmlns:context="http://www.springframework.org/schema/context"
   
xmlns:aop="http://www.springframework.org/schema/aop"
   
xsi:schemaLocation="  
 
         
http://www.springframework.org/schema/beans  
 
         
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
 
         
http://www.springframework.org/schema/context  
 
         
http://www.springframework.org/schema/context/spring-context-3.0.xsd

http://www.springframework.org/schema/aop  
 
         
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
   
default->

<context:component-scan
base-package="aop.annotation" />
    <!-- 打开aop 注解 -->
   
<aop:aspectj-autoproxy
proxy-target-class="true"/>

</beans>

步骤四、测试类:

public class Debug {

public
static void main(String[] args) {

ApplicationContext context = new
ClassPathXmlApplicationContext("aop/annotation_aop.xml");
       
Business business = (Business) context.getBean("business");
       
business.delete("猫");
    }

}
原文博客:http://www.2cto.com/kf/201208/149757.html

Spring学习4-面向切面(AOP)之aspectj注解方式的更多相关文章

  1. Spring——AOP(面向切面编程)@AspectJ注解方式

    一.什么是AOP? AOP: (Aspect Oriented Programming)即面向切面编程. 试想这样的场景:项目中需要在业务方法执行完打印日志记录.最笨的办法就是在每个方法核心业务执行完 ...

  2. Spring学习笔记-面向切面(AOP)-04

    什么是面向切面编程 先大概了解一下部分术语 横切关注点:软件开发中,散布于多出的功能称为横切关注点(cross-cutting concern),简单的可以描述为可以影响应用多处的功能,比如日志.安全 ...

  3. Spring学习笔记--面向切面编程(AOP)

    什么是AOP AOP(Aspect Oriented Programming),意为面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的 ...

  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学习5-Spring整合JDBC及其事务处理(注解方式)

    一.整合的步骤   1.步骤一:首先要获得DataSource连接池(推荐使用B方式): 要对数据库执行任何的JDBC操作,需要有一个Connection.在Spring中,Connection对象是 ...

  7. spring学习 八 面向切面编程(AOP)概述

    注:本文大部分参考   --------------------- 本文来自 -望远- 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yanquan345/artic ...

  8. Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)

    在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...

  9. Spring学习4-面向切面(AOP)之Spring接口方式

    一.初识AOP    关于AOP的学习可以参看帮助文档:spring-3.2.0.M2\docs\reference\html目录下index.html的相关章节       1.AOP:Aspect ...

  10. Spring框架使用(控制反转,依赖注入,面向切面AOP)

    参见:http://blog.csdn.net/fei641327936/article/details/52015121 Mybatis: 实现IOC的轻量级的一个Bean的容器 Inversion ...

随机推荐

  1. OpenGL2.0及以上版本中glm,glut,glew,glfw,mesa等部件的关系

    OpenGL2.0及以上版本中gl,glut,glew,glfw,mesa等部件的关系 一.OpenGL OpenGL函数库相关的API有核心库(gl),实用库(glu),辅助库(aux).实用工具库 ...

  2. Git基础 - git blame

    当想知道一段代码历史上有哪些人修改时,可以使用git blame查看,正如其名,当你看到那段让你抓狂的代码时,一定想找出是谁写的来一顿blame吧 : ) 使用方法 icebug@localhost: ...

  3. C++系列: 如何将十六机制的字符串转成整数

    bool convertHexStringToInt(char* pstrHex, unsigned long* pResult) { ) return false; else return true ...

  4. Activiti系列: 如何在web中使用activiti和sql server

        最近要开始使用activiti结合原有的系统来开发一个专业领域内的业务管理软件,以下记录了第一次搭建该开发平台过程中所遇到的各种问题,备忘.   一.按照如下方式新建一个web工程 之所以要用 ...

  5. JS闭包的理解

    闭包的两个特点: 1.作为一个函数变量的一个引用 - 当函数返回时,其处于激活状态.2.一个闭包就是当一个函数返回时,一个没有释放资源的栈区. 其实上面两点可以合成一点,就是闭包函数返回时,该函数内部 ...

  6. Operators一句话介绍(RxJava版)

    Cold Observables 在第一个subscriber订阅后才执行事件发送的Observables,默认普通Observables都是这个类型 Cold Observables对于每个订阅的s ...

  7. replace 替换全部的正确姿势

    本文同步自我的个人博客:http://www.52cik.com/2015/11/06/replace-all.html 关于字符串替换问题,其实是个很简单的问题,但却也不那么简单,至少对于很多新手而 ...

  8. SQL脚本循环修改数据库字段类型

    数据库在设计的时候也许考虑不全面,导致某些字段类型不太准确.比如设计的时候是varchar(1024),但是实际使用的时候却发现太小了,装不下,于是需要修改字段类型为ntext什么的. 我最近就遇到了 ...

  9. WCF Data Service 使用小结 (一)—— 了解OData协议

    最近做了一个小项目,其中用到了 WCF Data Service,之前是叫 ADO.NET Data Service 的.关于WCF Data Service,博客园里的介绍并不多,但它确实是个很好的 ...

  10. 第三十六课:如何书写一个完整的ajax模块

    本课主要教大家如何书写一个完整的ajax模块,讲解的代码主要跟ajax有关,而jQuery的ajax模块添加了Deferred异步编程的机制,因此对ajax的理解难度增大,还是忽略掉.但是我要讲解的代 ...