接下里的博客会一篇一篇的讲解每一个通知。其实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. DevExpress中透明玻璃效果

    Aero玻璃效果 下图左是DevExpress无玻璃效果,图右是Windows自带玻璃效果. Windows Aero 是从 Windows Vista 开始使用的新型用户界面,透明玻璃感让用户一眼贯 ...

  2. ArcGIS 10 SP5中文版(ArcGIS10补丁5中文版)

    下载地址:百度网盘下载地址:http://pan.baidu.com/s/1o7qPGhk 来自:http://zhihu.esrichina.com.cn/?/sort_type-new__day- ...

  3. Android项目实战(十六):QQ空间实现(一)—— 展示说说中的评论内容并有相应点击事件

    大家都玩QQ空间客户端,对于每一个说说,我们都可以评论,那么,对于某一条评论: 白雪公主 回复 小矮人 : 你们好啊~ 我们来分析一下: .QQ空间允许我们 点击 回复人和被回复人的名字就可以进入对于 ...

  4. iOS打包ipa select a method for export几个选项的意思

    他们的意思分别为:Save for iOS App Store Deployment保存到本地 准备上传App Store 或者在越狱的iOS设备上使用,需要提供发布证书
Save for Ad Ho ...

  5. Java基础之子类父类属性覆盖

    当java的子类和父类具有相同名字的属性时,到底java是怎么处理的. 先看代码: package com.joyfulmath.study.field; public class Person { ...

  6. 解决 RHEL 7/ CentOS 7/Fedora 出现Unit iptables.service failed to load

    一直用CentOS 6 习惯了,一下没适应过来.防火墙配置后执行service iptables save 出现”Failed to restart iptables.service: Unit ip ...

  7. Effective Java 20 Prefer class hierarchies to tagged classes

    Disadvantage of tagged classes 1. Verbose (each instance has unnecessary irrelevant fields). 2. Erro ...

  8. C语言指针学习(续)

    五.数组和指针的关系 int array[10] = {0,1,2,3,4,5,6,7,8,9},value; ... ... value = array[0];//也可以写成 value = *ar ...

  9. ms sql server 在abator生成的 insert 无法获取插入 id 的原因

    <insert id="abatorgenerated_insert" parameterClass="net.xxxxxl.dataobject.Users&qu ...

  10. MONGODB(三)——Java操作Mongo

    相比于java调用MySqlApI来操作数据库,调用Mongo要简洁容易的多.通过一个简单的样例,很容易地就可以上手 一.导入Jar包 添加Monog支持Java的jar包,这里使用的是2.9.3 & ...