接下里的博客会一篇一篇的讲解每一个通知。其实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$$

最新文章

  1. 窥探Swift之新添数据类型元组与可选值
  2. javascript实例备忘
  3. 博客开篇:随笔《从windows到linux的转变》。
  4. ie兼容问题整理
  5. unity, 顶点对齐
  6. 21.C#序列过虑、排序、let子句和连接(十一章11.3-11.5)
  7. 批处理 Mysql Findstr
  8. 1228.1——计算器(未使用MVC设计模式)
  9. session临时文件存储路径
  10. 转:web_custom_request应用示例
  11. SSM-Spring-01:Spring的概念+入门案例
  12. DaishaPocedureOfMine(代码)
  13. java入门--学习地址
  14. Linux下C语言执行shell命令
  15. report源码分析——宏的执行
  16. 测试驱动android
  17. Lua游戏开发参考资料收集
  18. hadoop multipleoutputs
  19. C# XML对象序列化、反序列化
  20. Linux内核代码

热门文章

  1. iptables基本操作
  2. Java从零开始学四十二(DOM解析XML)
  3. CollectionView 简用
  4. HTML列表元素
  5. 常用的JSTL函数
  6. [eclipse]改项目名称后tomcat连接问题解决方法
  7. BIEE从底层表结构向上更新
  8. Effective Java 75 Consider using a custom serialized form
  9. 软件测试作业1--描述Error
  10. JDK6与JDK7中String类subString()方法的区别