12Spring_AOP编程(AspectJ)_前置通知

时间:2022-09-04 10:46:36

接下里的博客会一篇一篇的讲解每一个通知。其实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&lowbar;AOP编程&lpar;AspectJ&rpar;&lowbar;环绕通知

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

  2. 16Spring&lowbar;AOP编程&lpar;AspectJ&rpar;&lowbar;最终通知

  3. 13Spring&lowbar;AOP编程&lpar;AspectJ&rpar;&lowbar;后置通知

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

  4. 15Spring&lowbar;AOP编程&lpar;AspectJ&rpar;&lowbar;抛出通知

  5. 11Spring&lowbar;AOP编程&lpar;AspectJ&rpar;&lowbar;概述

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

  6. 19Spring&lowbar;AOP编程&lpar;AspectJ&rpar;&lowbar;使用&commat;Pointcut注解来定义切点

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

  7. aop编程之前置通知

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

  8. 18Spring&lowbar;AOP编程&lpar;AspectJ&rpar;&lowbar;AspectJ的各种通知总结

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

  9. 17Spring&lowbar;AOP编程&lpar;AspectJ&rpar;&lowbar;AspectJ的注解编程

    前面的各种Aop编程,都是基于XML的,这篇文章讲的是把XML方式改为注解方式来做. Spring注解开发和xml开发所需要的包是一样的,所以只要把xml开发方式的包复制到以注解为开发方式的包的项目下 ...

随机推荐

  1. sql 通过表名获取所有列名

    因为要做数据迁移,也就是业务数据库的数据要迁移到历史数据库,这两个数据库理论上表结构是一样的,但因为时间原因,可能业务库升级了表结构,但历史库没有升级,且加字段的顺序不一样,导致 insert int ...

  2. finally块中的代码一定会执行吗?

    在Sun Tutorial中有这样一句话:The finally block always executes when the try block exits. This ensures that t ...

  3. JavaScript入门基础

    JavaScript基本语法 1.运算符 运算符就是完成操作的一系列符号,它有七类: 赋值运算符(=,+=,-=,*=,/=,%=,<<=,>>=,|=,&=).算术运 ...

  4. httpclient发起https请求以及获取https返回内容

    工作中的需要,使用Apache httpclient发起获取通过https返回的内容,试了很多网上的解决办法都不行,查阅了Apache httpclient的官方文档,最后终于找出解决方法,分享给需要 ...

  5. oracle手动启动服务

    开始-控制面板->管理工具->服务->右键属性 oracle服务设定都是手动启动的,开机时只需要启动3个服务就好了: OracleOraDb11g_home1ClrAgent Ora ...

  6. 页面跳转 url地址的写法

    跳转地址:分两类,wikipage和aspx页面: wikipage:当新建webpart,在网站里新建一个wikipage,然后将webpart添加进wikipage,这种情况下跳转页面需要添加si ...

  7. HTML表格边框的设置小技巧-表格

    对于很多初学HTML的人来说,表格<table>是最常用的标签了,但对于表格边框的控制,很多初学者却不甚其解. 一般我们用表格的时候总会给它个border属性,比如:<table b ...

  8. TypeScript装饰器(decorators)

    装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上,可以修改类的行为. 装饰器使用 @expression这种形式,expression求值后必须为一个函数,它会在运行时被 ...

  9. 小程序中使用ECharts 异步加载数据

    官网例子都是同步的,怎么引入及同步demo请移步官网 <view class="container"> <ec-canvas id="mychart-d ...

  10. windbg foreach用法

    .foreach 关键字分析一个或多个命令的输出并将该输出中每一个值作为另一个或多个命令的输入 .foreach [Options] ( Variable  { InCommands } ) { Ou ...