接下里的博客会一篇一篇的讲解每一个通知。其实AOP_AspectJ的编程与传统的AOP的编程的最大的区别就是写一个Aspect 支持多个Advice和多个PointCut 。而且我们写AOP_Aspctj不需要继承任何的接口,不像传统的AOP还要继承接口。

前置通知是在运行我们被代理的方法之前先执行的。

前置通知具有如下的特点:

1.在目标方法执行前 进行增强代码。

2.AspectJ 提供Advice无需实现任何借口, 可以将很多通知代码 写入一个类 (切面类)

3.前置通知定义方法: 无返回值,可以传入参数 JoinPoint 连接点

先拿出案例,再具体讲解:

案例结构图如下:

aaarticlea/png;base64,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" alt="" />

CustomerService.java是目标类(被代理的类)。

MyAspect.java是切面类(里面可以写很多个通知)

TestAop2.java是junit的测试类。

applicationContext.xml是Spring的配置文件

第一步:我们先写目标类(要被代理的类)

package cn.itcast.spring.d_aspectj;

//目标业务类
public class CustomerService {
public void update() {
System.out.println("this is update");
} public void delete() {
System.out.println("this is delete");
} public void search() {
System.out.println("this is search");
} }

第二步:我们写切面类

package cn.itcast.spring.d_aspectj;

import org.aspectj.lang.JoinPoint;

//切面类(内部可以写很多的Advice的方法)
public class MyAspect {
//前置通知1,2 public void before1()
{
System.out.print("前置通知1"); }
//这个方法传入了参数JoinPoint,通过这个参数我们其实可以得到很多的信息,
//比如现在执行的是那个切点
public void before2( JoinPoint joinPoint)
{ System.out.print("前置通知2");
} }

第三步:写配置文件

<!-- AspectJ AOP -->
<!-- 配置目标 -->
<bean id="CustomerService" class="cn.itcast.spring.d_aspectj.CustomerService"></bean>
<!-- 配置切面类 -->
<bean id="MyAspect" class="cn.itcast.spring.d_aspectj.MyAspect"></bean>
<aop:config>
<!-- ref引用切面类 -->
<aop:aspect ref="MyAspect"> <aop:pointcut expression="execution(* cn.itcast.spring.d_aspectj.CustomerService.*(..))" id="mypointcut2"/>
<aop:before method="before1" pointcut-ref="mypointcut2" />
<aop:before method="before2" pointcut-ref="mypointcut2" />
</aop:aspect>
<!-- 解释一下上面的执行流程
<bean id="CustomerService" class="cn.itcast.spring.d_aspectj.CustomerService"></bean>
<bean id="MyAspect" class="cn.itcast.spring.d_aspectj.MyAspect"></bean>都是是创建目标的对象。没什么好说的 <aop:pointcut expression="execution(* cn.itcast.spring.d_aspectj.CustomerService.*(..))" id="mypointcut2"/>
<aop:before method="before1" pointcut-ref="mypointcut2" />
<aop:before method="before2" pointcut-ref="mypointcut2" />
是说我们先找到pointcut-ref="mypointcut2"然后根据mypointcut2找到cn.itcast.spring.d_aspectj.CustomerService.*(..),然后
当每次执行cn.itcast.spring.d_aspectj.CustomerService.*(..)这里的方法时
都是执行"MyAspect"(cn.itcast.spring.d_aspectj.MyAspect)里面的before1这个方法。
同理我们找到pointcut-ref="mypointcut2"然后根据mypointcut2找到cn.itcast.spring.d_aspectj.CustomerService.*(..),然后
当每次执行cn.itcast.spring.d_aspectj.CustomerService.*(..)这里的方法时
都是执行"MyAspect"(cn.itcast.spring.d_aspectj.MyAspect)里面的before2这个方法。 -->
</aop:config>

第四步:写JUnit测试代码:

//整合spring和junit

//指定spring配置文件位置
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class TestAop2 {
@Autowired
private CustomerService customerService;
@Test
public void testbefore()
{System.out.print(customerService.getClass().getName());
customerService.delete(); } }

最后的输出的结果是:

前置通知1

前置通知2

this is delete

由上面可知MyAspect"这个切面类里面的before1(Advice)和before2(Advice)都可以去执行不同的pointCut(切点)。这就是所谓的一个Aspect 支持多个Advice和多个PointCut。

前置通知细节:

1、 默认不能阻止目标方法执行,如果抛出异常,目标方法无法执行

2、 可以传入JoinPoint 连接点参数 , 通过该参数可以获得当前拦截对象和方法信息

最后再提醒一点:所有的所有都是基于动态代理模式,这里没有用到接口,所以这里的代理是Cglib代理。

验证一下:

在TestAop2 的代码上中写

System.out.println(customerSetvice.getClass().getName());

输出是$$EnhancerByCGLIB$$

12Spring_AOP编程(AspectJ)_前置通知的更多相关文章

  1. 14Spring_AOP编程(AspectJ)_环绕通知

    在目标方法执行前后,进行代码增强 (阻止目标方法的执行 ) 环绕通知实现任何通知效果. 案例如下: 案例结构:

  2. 16Spring_AOP编程(AspectJ)_最终通知

  3. 13Spring_AOP编程(AspectJ)_后置通知

    后置通知和前置通知差不多.最大的特点是因为后置通知是运行在目标方法之后的,所以他可以拿到目标方法的运行的结果. 给出案例: 案例结构图:

  4. 15Spring_AOP编程(AspectJ)_抛出通知

  5. 11Spring_AOP编程(AspectJ)_概述

    AspectJ 是一个框架 (第三方AOP框架 ),提供切面编程 ,编写一个Aspect 支持多个Advice和多个PointCut .对比前一种提到的传统的Aop编程,AspctJ更加的常用.Asp ...

  6. 19Spring_AOP编程(AspectJ)_使用@Pointcut注解来定义切点

    我们之前的方式是采用 @AfterReturning(value="execution(* com.guigu.shen.anotion.UserDaoImpl.*(..))",r ...

  7. Spring 10: AspectJ框架 + @Before前置通知

    AspectJ框架 概述 AspectJ是一个优秀的面向切面编程的框架,他扩展了java语言,提供了强大的切面实现 本身是java语言开发的,可以对java语言面向切面编程进行无缝扩展 AOP常见术语 ...

  8. aop编程之前置通知

    aop( Aspect-Oriented Programming)前置通知原理案例讲解 编程步骤: 定义接口 编写对象(被代理的对象即目标对象) 编写通知(前置通知即目标方法调用前调用) 在beans ...

  9. 18Spring_AOP编程(AspectJ)_AspectJ的各种通知总结

    小结: 前置通知(权限控制). 后置通知 ---- 不怎么用 环绕通知(权限控制. 性能监控. 缓存技术 ) 异常通知 (发生异常后, 记录错误日志 ) 最终通知 (释放资源 ) 环绕通知 是取代任何 ...

随机推荐

  1. 收集oracle统计信息

    优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN:列统计: --列中唯一值的数量(NDV),NULL值的数量,数据分 ...

  2. 实验12:Problem H: 整型数组运算符重载

    Home Web Board ProblemSet Standing Status Statistics   Problem H: 整型数组运算符重载 Problem H: 整型数组运算符重载 Tim ...

  3. Displaying SharePoint Lists or Libraries in other sites 显示其他站点的List

    Child objects within SharePoint, like a list in a Site, share an inherent connection with that Paren ...

  4. SharePoint Server 2010 & WorkFlow related Limits

    Today, I have come across different workflow related limits for SharePoint Server 2010. Limit Maximu ...

  5. Memcache笔记03-php操作Memcached

    通过php程序操作Memcached服务几种形式 Memcache 扩展 Memcached 扩展 Socket套接字操作 memcached-client.php(函数) 对于php扩展来说,dan ...

  6. Windows下查看端口占用

    最近在重新安装Mysql的时候,发现3306默认端口被占用了.类似的情况常常遇到,想查看到底是哪个程序把这个端口占用了. 下面是我google找到的方法,和大家分享. 1. 首先,使用netstat ...

  7. jQuery DataTables 行获取

    datatables的官方例子中似乎没有提到表格双击和获取相应行号的功能; 经过探索可以按照以下方式实现:  $("#example tbody tr").dblclick(fun ...

  8. 【转】PaxosLease算法--2PC看Paxos选主

    原文请参考[[置顶] Paxos master选举--PaxosLease算法] 众所周知,为了避免Paxos算法的活锁问题,必须选举唯一的proposor.偏偏在Paxos原论文中,作者L. Lam ...

  9. eclipse常用快捷键及调试方法(虽然现在看不懂,但是感觉以后肯定会用到,先转了)

    常用快捷键 Eclipse最全快捷键,熟悉快捷键可以帮助开发事半功倍,节省更多的时间来用于做有意义的事情. Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl ...

  10. 用PowerDesigner将SQL语句生成实体类

    1.首先打开PowerDesigner,点击左上角“File”—>"Reverse Engineer"—>"Database..." 2.选择数据库 ...