开发过程中很多时候会用到日志、事务等操作,这些操作如果要写在业务代码中会相当麻烦,这时就会用到面向切面编程(AOP),AOP作为一种编程思想,和OOP有着不同的侧重点,面向对象侧重于万事万物皆对象,而面向切面编程则侧重于事务的一个方面。在面向切面编程过程中有几个比较重要的概念:切面、切点、连接点、通知,

通知:描述了切面要完成的工作,例如,要向某个方法注入日志功能,这里的日志功能就是通知;通知分为5种:Before、After、After-returning、After-throwing、Around

切点:定义了通知被应用的地方,如,某个类上的某个方法;例如,在test类的print方法;

切面:横切关注点被模块化的类,由通知和切点组成,换句话来说切面定义了要向目标程序注入的全部内容;规定了在目标方法上执行什么样的动作;

连接点:程序执行过程中切面可以被插入的一个点,如方法调用、成员变量初始化,在spring中只支持方法调用;

面向切面编程有两种实现方式,一种是预编译,另一种是动态代理,AspectJ属于预编译,springAOP属于运行期动态代理方式。spring实现了对AspectJ的支持。下面看springAOP和AspectJ的使用方式,

springAOP

这里使用配置文件的方式,实现springAOP,看配置文件,

    <aop:config>
<!--声明一个切面类 可以有多个-->
<aop:aspect id="myAspect" ref="aspect">
<!--声明一个切点-->
<aop:pointcut id="point1" expression="execution(* com.cn.study.day6.Test.*(..))"/>
<!--通知-->
<aop:before method="before" pointcut-ref="point1" />
<aop:around method="around" pointcut-ref="point1"/>
</aop:aspect> </aop:config>
<!--配置切面类-->
<bean id="aspect" class="com.cn.study.day6.Aspect"></bean>

要配置AOP,在spring中使用了<aop:config>标签,在这个标签中可以配置多个切面标签(<aop:aspect>),每个切面代表了一种横切关注点,从前面的阐述中可以知道一个切面包含两部分,一个是切点,另一个是通知,在<aop:aspect>标签中定义切点(<aop:pointcut>)和通知(aop:before 前置通知),在切点中配置了通知被应用的位置,即匹配Test类的任何方法(execution(* com.cn.study.day6.Test.*(..))),在通知标签中配置了执行目标方法前通知,切点是point1;下面看具体的切面类,

package com.cn.study.day6;

import org.aspectj.lang.ProceedingJoinPoint;

//切面类
public class Aspect {
//前置通知调用的方法
public void before(){ System.out.println("我是前置通知!"); }
public Object around(ProceedingJoinPoint jp){
System.out.println("我是环绕通知!"); Object object=null;
try {
System.out.println("方法执行前");
object = jp.proceed();
System.out.println("方法执行之后");
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return object;
} }

切面类中的方法要和通知中method属性的方法名字保持一致,下面是目标方法,

package com.cn.study.day6;

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
@Component
public class Test { public void method1(){
System.out.println("业务方法!");
}
}

上面是一个简单的业务方法,
总结下这个切面类的含义,即在执行com.cn.study.day6.Test类中的任何方法之前都会首先执行com.cn.study.day6.Aspect切面类中的before方法,看打印结果,

我是前置通知!
业务方法!

结果显示首先执行了切面类中的before方法,然后执行的是目标类中的method1方法。

上面就完成了一个面向切面编程的例子,我们实现的是在方法被调用之前实现横切,那么面向切面编程到底有什么用处呢?我们在最后进行说明,接着看AspectJ

AspectJ

AspectJ是AOP的另一种实现,要使用AspectJ必须打开自动代理,如下

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

这是对AspectJ的自动代理,然后就可以使用AspectJ了,看下面的切面类

package com.cn.study.day7;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class AspectTest {
//前置通知调用的方法 通知
@Before("pointCut1()")
public void before(){ System.out.println("我是前置通知!"); }
//切点
@Pointcut("execution(* com.cn.study.day7.Test.*(..))")
public void pointCut1(){ } }

由于加了@AspectJ的类无法被自动识别,所以需要加载@Component注解,有了这两个注解之后,此类便是一个切面类了,在切面类里可以声明切点和通知,我们定义了一个pointCut1的切点,此方法的返回值必须是void,此切点对com.cn.study.day7.Test下的所有方法有效,接着使用@Before定义了一个前置通知,且使用的切点为pointCut1(),打印结果如下,

我是前置通知!
业务方法!

上面便完成了使用AspectJ的切面编程;另,在定义通知的之后也可以直接使用表达式(execution(* com.cn.study.day7.Test.*(..)))而不必引用某个切点,引用某个切点的好处是,在定义了切点之后可以复用。

综上,是两种实现AOP的配置,AOP的使用场景是在不破坏原有代码的基础上,增加新的功能,比如日志、事务控制,使用AOP可以很好地减少代码的侵入,在原有代码不变的基础上轻松实现日志、事务控制、权限控制等。这两种方式在实际开发过程当中使用的都很广泛,具体使用哪种方式可根据自己的情况而定。

有不足之处,欢迎指出!

spring入门(四)【面向切面编程】的更多相关文章

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

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

  2. Spring之AOP(面向切面编程)_入门Demo

    AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可 ...

  3. Spring AOP(面向切面编程)

    一.AOP简介 1.AOP概念:Aspect Oriented Programming 面向切面编程 2.作用:本质上来说是一种简化代码的方式 继承机制 封装方法 动态代理 …… 3.情景举例 ①数学 ...

  4. Spring中的面向切面编程(AOP)简介

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

  5. 程序员笔记|Spring IoC、面向切面编程、事务管理等Spring基本概念详解

    一.Spring IoC 1.1 重要概念 1)控制反转(Inversion of control) 控制反转是一种通过描述(在java中通过xml或者注解)并通过第三方去产生或获取特定对象的方式. ...

  6. Spring AOP:面向切面编程,AspectJ,是基于spring 的xml文件的方法

    导包等不在赘述: 建立一个接口:ArithmeticCalculator,没有实例化的方法: package com.atguigu.spring.aop.impl.panpan; public in ...

  7. Spring AOP:面向切面编程,AspectJ,是基于注解的方法

    面向切面编程的术语: 切面(Aspect): 横切关注点(跨越应用程序多个模块的功能)被模块化的特殊对象 通知(Advice): 切面必须要完成的工作 目标(Target): 被通知的对象 代理(Pr ...

  8. Spring:AOP面向切面编程

    AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. AOP是软件开发思想阶段性的产物,我们比较熟悉面向过程O ...

  9. Spring框架 AOP面向切面编程(转)

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  10. Spring的AOP面向切面编程

    什么是AOP? 1.AOP概念介绍 所谓AOP,即Aspect orientied program,就是面向方面(切面)的编程. 功能: 让关注点代码与业务代码分离! 关注点: 重复代码就叫做关注点: ...

随机推荐

  1. ABP(现代ASP.NET样板开发框架)主题线下交流会(上海)开始报名了!

    点这里进入ABP系列文章总目录 ABP主题线下交流会(上海)开始报名了 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称.它是采用最佳实践和流行技术 ...

  2. 过年7天乐,学nodejs 也快乐

    自从上次接触nodejs 已经好长时间了,但是年底公司太忙了 ,没时间看, 上次文章在ubuntu上安装nodejs[开启实时web时代] http://www.cnblogs.com/qqlovin ...

  3. WCF 安全性 之 Windows

    案例下载 http://download.csdn.net/detail/woxpp/4113172 服务端配置代码 <system.serviceModel> <services& ...

  4. PHP的静态和接口

    静态普通成员普通成员属于对象//静态成员//静态成员属于类//static 关键字 变成静态成员/*class ren {    public $name;    public static $zho ...

  5. .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库

    批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...

  6. NULL的陷阱:Merge

    NULL表示unknown,不确定值,所以任何值(包括null值)和NULL值比较都是不可知的,在on子句,where子句,Merge或case的when子句中,任何值和null比较的结果都是fals ...

  7. OpenCASCADE Performance Test

    OpenCASCADE Performance Test eryar@163.com Abstract. Use the Draw Test Harness to test the performan ...

  8. 深入理解脚本化CSS系列第三篇——脚本化CSS类

    前面的话 在实际工作中,我们使用javascript操作CSS样式时,如果要改变大量样式,会使用脚本化CSS类的技术,本文将详细介绍脚本化CSS类 style 我们在改变元素的少部分样式时,一般会直接 ...

  9. android图片透明度跟缩放大小动画事件

    概序 : 动画事件写在xml中,然后用AnimationUtils去加载动画事件,再监听动画结束事件,隐藏imageview. 1. player_double_click_animation.xml ...

  10. 将Excel文件转换为Html

    将Excel文件转换为HTML 背景 我的工作有时会涉及到财务数据的处理.我们大家都知道,Excel文件在处理数据中很流行并且被广泛使用.Excel让我们可以将存储在里面的数据进行数学计算.我在工作中 ...