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

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

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

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

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

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

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

案例结构图如下:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQ4AAAB4CAIAAACM34uaAAARhklEQVR4nO1dW2wU1xk+PFR5qdSHVMpj1FQlIahSbeyknRKSpmmDmqpUpYBNYoU00ojEimKaC+HiENuLYzlAp80FCAkxuWDHbBsayIBFHcoDwgRCCkkAMVpsgzHe9e6y2F5712vn9GFmZ87MnJmdvczOWfv/9D/MnP3POf/Mnm/nnJn59kcYAAA4API6AACgNMAoVdYsvM3L7iWBQ5wgeRmCJQobm8izcqAsn3OMMTtUOdpYdmz9T1V7fdnt5O7RxrKiRsPy1wZU8QisUOXY2vnS0d3XTu65dnLPmX2v7a6rInePrZ3vUVySwCFeZKERd+AxVRg+MyYUgypHjx5taWnJ4PPC3ddO7knePBI5u/fC4e2766rI3aMv3F2EOGkAqrgKhs+MCa5Tpbu7e/78+XPnzrV3O7Lm7msn90TO7o2c3Xuha4dMFXX3yBprqoQ6OuqfOh3KGIjIIwWcICljROCJEgLKN6hVSXsYGpE9Fahfub7M3AjVTe1V8083SJRzgqSNLqtDUFvgBIHKBCIkysFbxpdNzLRzZSwUdGeGeda4SxWZJ1VVVRmpcuiZu87se+3C4e0XunacaGtct+QBcvfQM3fZ1r56+o2H36x/+M361gDdQeSNQ0LkdV+3eRSTQ8GqEUng0/sirzRH+cppo8DCDel602IwEsfyELRqSkUjE0gHyiHlcGi0mMmrlVqNdgLVFmczVVSeVFdX21NlzcLbXl92++66KtnWLXlg3ZIHcuky1NFR/3DXt6ZyyjTD8F06oIrFXMX0Qyv/cJKu1FGQ0U3d1ZcbriqGQzAEaY45o0Neh5be1V+3lDqUvoAqep5kpArG+F9P/oRcx8tUubXpWzRnK5qz9dYm8/Ankemq4hJVyF9t4zctDzP5Q5tRYOPmKVVyPDSCKuZmgSpUtLS0zCXQ3Nxs7//xqh8blvUYY5UkaM5Wy5qO1irkrEMUjGMqPc7UaYz1BEzXCNGGJHDqLEUwTpUMA0LpguqmnzyZY8hEFasJWBYzNGxoO+Oh0WI2TPPMhfK3AFTJHh89dodhWa9+hH646/vPnsm3A20yYT3OKFRJ19MGnHFRq0wweJ68/FAW5tri1XSLgBwsvHmFnBVVdEFpy3pyPWZYWlutVRwdmlXM9LsCphNoODNAFQd4v/oOch2vUsXB7GvGwIXB4vq94MLFDFRxiONN5W3VP1Lt9WW3ex1R8VGoZzgO7m8ZYVyGOw6jYAOc+Yf1zFDFAPUdMDRnK7ptj7fBFAsFGnbEzMf9sVeImBWeMn1JwcxSBQBgDUAVAMARgCoAgCMAVQAARwCqAACOAFQBAByh5KnyaevPqOZ1XICZhpKnyictZcnJKYN98+lTwBYjcn7Ix/7TwaKg5Knif7XcTJVL3Ru/dcQW4ik1u0/AqMKp7AFUyQ8sUuX48eNjY2MOnTuaF0wkp2Q70R+56y9v1Qr/6ev526Xujd98uvrjzQssaxLKKHk3m+FQtDeWDC8Cs0voGQ8WqbJ3796Ojo5wOOzE+cOmivhEKj6RGk+kVKrEE6nxRCqeSH3kq7Cop3tLPHsUiyomKQ3AKzBKlVAotGvXroGBgYzO7zVWjo6nRsdTI+MaVUbjqdF4anQ81dZYSa9mJ2kyS3MzyuXJ1w3JtxU5QVRqktpAC625RPSaVtJbUtq+Is9zuhf0TW+5m6tTpfDUc0Iep25ypu1Q38AvcTBKFYxxOBwWBOHSpUv2zu9sqoyNpmKjk7ExjSqxscnYaOrGWOqdTffQq2VFlQxyef0LvDp9efoDeRwalVpUAbperY6pbxM6qKi5pB30onzTPw2YGzQfK01wb+6I6lb6YJcqGOPr1683NDREo1Eb5+3194ZHJiM3J8MjSZkqjvrI7qpiqyk3NqV+RH5A26YK0C2mdsrPNBlOhorpXsyEp6qIKQ3SzgldcE/pf+ZdV9ilSiQScXJV+ceGnwdvJIM3ksGYRhUHonybP5WgTMDUfYqmnEIV9VKSiSqUEGxWQemfaGcVZS9tsWNPFZsVkf66ZRbc0zqy0uWXMBilyvDwsMO1yra1vxiMJk70R55uO/5023GZKk5E+UZduXwHjJh7O5XLmydg2gLGlip0Abrpx5m8See8olzA8bxOSGylcac1aJZPUwX35o6s3EocjFLF+R2wlhd/eXU4caI/suiv7fJCRf0osyifthpXZw5O5fJWDWWmCnWaQr+WGacyDioaByp9dW61Xqf+0wBdcG9ihJVbaYNFqmT1XGXzcwv7g4n+UOLQuYFD5wb6Qwm5fDaJ8l3GDJpE5QMWqZIVGtYs7B2auDyU6B2a6B1K9A5NeB3RTAM8rJdR8lTZVHffhmcXbaxbtLFu0Ya6RRvrFsnls0mU7xpKRPVeHJQ8VQCA4gCoAgA4AlAFAHAEoAoA4AhAFQDAEYAqAIAjlDxVQFsPKA5KniqzSFsPzwI9RclTJVdtPfmaMAlCZGJft/jP5YAqnoJFqhRFWy8JHOI4oxpX/xKkdVWOc/m1KHjvijmwSJWiaOslgUO8YH6L1yaRFekkibyrQxmowhwYpYrr2vr0WNSJmuQdpUg/3dHJYinCLNM77ITS3fgeFVXFbsg6R5MjgsbdUzBKFey2tl4dd5qoiSgxqRi1awhVuWUhvi9MQndK2azWuHsFdqmCXdXW6/WMHJkumEIGGlOMVLK5BGA9M3XQdU0Jz7Js1mrcvQK7VHFZW2/UhgsWVwv9vwKZRroT8T3ZHVXFni1VZrfG3SswShX3tfVGcTztb4FoqnHjPz0o/xvkckJ30Lh7D0ap4r62Xvczq9vR/8aTywjzhJ9cKZiV6YVL6A4ad+/BIlWY0tbb/++PNVyY8cAkylOwSJWs4K62PvfRWfhxDQ/rvUXJU8U9bb1+BZMtCkoV0LgzgJKnCgBQHABVAABHAKoAAI4AVAEAHAGoAgA4AlAFAHCEkqcKaOsBxUHJU2VWaOvh6SMDKHmq5KatN78hnN/zvUK8jmjzujxQhQGwSJUi5a3HmBSiZANqfqw81fZy0jB68wAWwCJViqKtl1EYqhRabS9BsnoGwShV3NfWyzAPb4rwXT8zMietp6vtLbLe2WjuraMCVT0DYJQq2HVtvQzDoKQJ3y1085RkpkY1MTWZvZXmnh6EqUNQ1XsGdqmC3dXWy9BThZ6+PYNunq62t0xmbyEkJkMwD2xQ1TMAdqnisrZehokqlmsEK928hdreMpm9HVUsLwCgqmcAjFKlCHnrMca0CZhJ+G6ftN5KbW+ZzN5Kc0+7HwyqepbAKFWKlLeevoA2zlpsktYL1mp7u2W9WXNvvDipDAFVPStgkSpMaesLjZzmQzCJYgAsUiUrlFre+lxGPTysZwElT5VSy1ufJVVAVc8MSp4qAEBxAFQBABwBqAIAOIJnVJma/q77XOSNQ/0+fwCspO2NQ/3d5yJT0995NZaKA8+ocvB06LMz4YFoaiSBwUraBqKpz86ED54OeTWWigPPqNK6/3IkPh0Zx+E47tyydPOq8vZXqsNxDFZyFhnHkfh06/7LXo2l4sAzqvj8gZsJPDyGW6sWSO8/3XfguYaass4tSw8K95E2PIbB2LebCezzB7waS8WBl1SJTeB3n6/+/KWq7tYnG2rKBj55ZvOqcoNE/qBwX3AUu2xiDeLbR3HwrFCBuKazOTWST90SNuXUxSaAKq7B5w/cmMAv/PHe95780+qFdw51LTnwxCOdW5aaJfL/3rZoaAS7aWIN4veO4KGvhArENX6VUyP51B0Ra9SXv54QXT5YV07dDaCKe/D5A9Fx3LL8F6sX3tnTcP9by3+zeuGdieRUIjk1kUwlklMTySlVIv/PLfcPjmDXTHwM8R/mUlFquAc95s+vdz+PENGIn69okdwPoxCRE6cuOg5UcQ0+fyASxwMx/NKvb928qrxzy9J4IhVPpOYtrq1t2BmfmKpt2DlvcW08MTWemOp47VcDMeyaiY8i/oNcKkqv3IMe3Zdn13m2kFsY+UeuO3WROFDFNfj8geEx3H9DsQ9aHhwdT42OTzbv2Ddvce3IeGre4trmHftk3fwHLQ+qnkY7IyxIT15WdsqF0qZKtLJTXOm0XFyJ+DalKb7thlqoYEGzROtIc0CVwjGLukhXyG1q5nVtdvKoUjhGPzSHjejDoEV+rJlTW2hbhdAq3lQF09xEpbtO5cBXduL+Tn386VM3PAZUcQ0+fyA4inujir27+aHYWCo2loqNTcokmbe4NjY2KZfs3vyQ6qk36eXHhf/K2508Qvx7cmElSm87KRer5Y0vhXKtBJU3S046qu7EvTZ1db0g9LiYduZe/hL3dvKoMt2szrJphAwjKlYrhbry9x5H5c0S0R1ZRTOTm1iNkLItk0TrWnfqgqNAFdfg8weGRnEgrNj2xt9GRiZlk3lirqI6G+xznybHejeMA2GpvhJVd6gO6q5VuVgtV/xCKJc3OnhUKXyeVUeWdcleuPov1EKu/gvLjrJrhAyjw6hfLvdJgbBcESFdXfJUqGZwI7ujbiunbgio4h58/sDgTXxpWLG/v7I4FEvKJl9VsEkirzprdlIoQ6jMJ6W3+XeG8aVhaUMlWtGhuqm7VuXiCrmi2kIHjyqFI1l1ZFlX2lDJbTgp9yJvWBUSll0jRBjmyBUTVyCEdHXJU2HlRnZH3VZO3eBNoIpr8PkDAzF8MajYlvrfXY8mr0eT8iXlejSBTRJ51Vmzdh5VCF1BfDGIu5o4hPi3g/hiUFpfgVCNeNFpubhC3ugRyrQStKJd7kVc3yTZdKS46euWNUmmCMUViFvfI7cpra9QtruaOKSV44vtfFmTlGUjRBi6yPHbNXJI+O0aVNYkdTVx6XYMkSttmtzI7qjbyqkbiAFVXIPPH7gaw+eDir26/pGBcGIgkpDvgA2Ek1qIaYm86kyYtK5CmWmU1fBliN+ZLlxeo+nXdxLOtHJxubzdI5SphT1Cmc6N2hE+3MQhhFCFcJisGxSXEytyopBb16NGom7j8+3ErKlGPJ99I1oYusjR8nZ8Poh31qQ/ko+iRjRFzq3robqR3VG3lVN3FajiHnz+wJUo/ua6Yo0v/b4/lOgfnrgynLgynLgSUnS/pERedc5k0toKtOwj5+Vg+dqVKFDFNfj8gb4oPjeo2Msv/qEvONEbnOhLm7mK6pzJpBcr0J8/dF4Olq/1AVXcg88f6I3is4OKbXh+icGU+AiJvOqcyRRKOC4Hy9d6gSruYduBvotDU18P4v9do5sZVp5g3trXg/ji0NS2A31FH0RFhWdUOXRmeP+piBSatni2CFYyJoWm95+KfPYlSLvcQTI1feBUqHX/Zc/1rmB5Wuv+ywdOhZKpaa/GUnEAf0MBADgCUAUAcASgCgDgCEAVAMARmKAKQuh7t9xibwhRQy1crlLM8N9oMxvYbAIrVPnBUx325hZVjAmumByRzAY2mzDLqaIknGdyGEJSFbbAClWcgFY1L6qo+eaBKoCMYIUqufqQVKEmlCPLOUHQZ9s2pJu3zLtNT3GnlGs5hc2922Sp1wrJtI3pNjlVb6kkRKUdpi5xOOXAAYUEQ1RRLx3U60kmqljliSfzmtIT72akCi3NvL486yz1op6yRPpgI80Mm7SKcPkpChiiSk5IU8UqT7yhnJbh3cFVxbyrL882S70pgzcl7TyVKvSKcimTs8gZBIaoYriqYEfp522oYphdpd05QSInLOSkqZBUsc1ST18eOaOKJSPkgwLCuAWGqEIpz5x+3noCRiwhaBMwXRPGq4p2c9Yuzbxh4ZFNlnpdunuRp7ZpNQEzVZQEQTRVARQaDFHFfFVRPrVLP+9gWU/kcNct64km7KlCSTNPGZTZZKnXRWW4VYCNLoZlPW0JT71vACgsGKIK/aPCpp+3vzGceQKWLeBnfuaAFaoY3mHJY6FvgCRwFvepaK6mj4EqAAVMUMUGBUg/T8xYLHlimR4eqAJQwDpVAABGAFQBABwBqAIAOAJQBQBwBKAKAOAI/wcyOJTP+etNKAAAAABJRU5ErkJggg==" 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. 使用NPOI将多张图片导入execl

    protected void btn_Export_Click(object sender, EventArgs e) { List<BNXX_SJXJ_XJSJ> list = View ...

  2. Python: PDB命令

    1. where(w) 找出当前代码运行位置 2. list(l) 显示当前代码的部分上下文 3. list <line number> 显示指定行的上下文 4. list <lin ...

  3. Android Studio 项目代码全部消失--出现原因及解决方法

    出现原因,自己把项目地址父层目录文件名修改了,导致原来打开的项目位置不对,代码全部消失.这样就只要关闭项目,打开一下你修改路径下的项目即可.因为原来的项目还在原来的路径下寻找,但是原来的路径发生了改变

  4. HDFS简单入门

    本文地址:http://www.cnblogs.com/archimedes/p/hadoop-simple.html,转载请注明源地址. 欢迎关注我的个人博客:www.wuyudong.com, 更 ...

  5. CAS实现单点登入(sso)经典教程

    本教程我已按照步骤实现,不过要深入了解单点登入还需要进一步的学习,掌握其中的精髓. 一.简介 1.cas是有耶鲁大学研发的单点登录服务器 2.本教材所用环境 Tomcat7.2 JDK6 CAS Se ...

  6. AOP这些应用场景(交叉业务)

    1.统计某个方法的性能,可以在每个业务方法执行前后 记录方法执行的当前时间,执行后的时间-执行前的时间= 方法执行时间.  这样就可以在开发过程中(项目未交付给客户前)统计程序的性能. 2.安全 ,权 ...

  7. 《第一行代码——Android》

    <第一行代码——Android> 基本信息 作者: 郭霖 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115362865 上架时间:2014-7-14 出版日期:2014 ...

  8. jQuery DataTables 行获取

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

  9. 方程ax2+bx+c=0;一元二次方程。求根

    <body>方程ax2+bx+c=0;一元二次方程.求根请输入a:<input type="number" id="a"/><br ...

  10. 机器学习六--K-means聚类算法

    机器学习六--K-means聚类算法 想想常见的分类算法有决策树.Logistic回归.SVM.贝叶斯等.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别 ...