6.2.1  准备环境

首先准备开发需要的jar包,请到spring-framework-3.0.5.RELEASE-dependencies.zip和spring-framework-3.0.5.RELEASE-with-docs中查找如下jar包:

org.springframework.aop-3.0.5.RELEASE.jar

com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

com.springsource.org.aopalliance-1.0.0.jar

com.springsource.net.sf.cglib-2.2.0.jar

将这些jar包添加到“Build Path”下。

6.2.2  定义目标类

1)定义目标接口:

package cn.javass.spring.chapter6.service;
public interface IHelloWorldService {  public void sayHello();
}

   2)定义目标接口实现:

package cn.javass.spring.chapter6.service.impl;
import cn.javass.spring.chapter6.service.IHelloWorldService;
public class HelloWorldService implements IHelloWorldService {  @Override  public void sayHello() {  System.out.println("============Hello World!");  }
}

  

注:在日常开发中最后将业务逻辑定义在一个专门的service包下,而实现定义在service包下的impl包中,服务接口以IXXXService形式,而服务实现就是XXXService,这就是规约设计,见名知义。当然可以使用公司内部更好的形式,只要大家都好理解就可以了。

6.2.2  定义切面支持类

有了目标类,该定义切面了,切面就是通知和切入点的组合,而切面是通过配置方式定义的,因此这定义切面前,我们需要定义切面支持类,切面支持类提供了通知实现:

package cn.javass.spring.chapter6.aop;
public class HelloWorldAspect {  //前置通知  public void beforeAdvice() {  System.out.println("===========before advice");
}
//后置最终通知  public void afterFinallyAdvice() {  System.out.println("===========after finally advice");  }
}

  

此处HelloWorldAspect类不是真正的切面实现,只是定义了通知实现的类,在此我们可以把它看作就是缺少了切入点的切面。

注:对于AOP相关类最后专门放到一个包下,如“aop”包,因为AOP是动态织入的,所以如果某个目标类被AOP拦截了并应用了通知,可能很难发现这个通知实现在哪个包里,因此推荐使用规约命名,方便以后维护人员查找相应的AOP实现。

6.2.3  在XML中进行配置

有了通知实现,那就让我们来配置切面吧:

1)首先配置AOP需要aop命名空间,配置头如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns="http://www.springframework.org/schema/beans"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:aop="http://www.springframework.org/schema/aop"  xsi:schemaLocation="  http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
</beans>

   2)配置目标类:

<bean id="helloWorldService"
class="cn.javass.spring.chapter6.service.impl.HelloWorldService"/>

    3)配置切面:

<bean id="aspect" class="cn.javass.spring.chapter6.aop.HelloWorldAspect"/>
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* cn.javass..*.*(..))"/>  <aop:aspect ref="aspect">  <aop:before pointcut-ref="pointcut" method="beforeAdvice"/>  <aop:after pointcut="execution(* cn.javass..*.*(..))" method="afterFinallyAdvice"/>  </aop:aspect>
</aop:config>

  

切面使用<aop:config>标签下的<aop:aspect>标签配置,其中“ref”用来引用切面支持类的方法。

前置通知使用<aop:aspect>标签下的<aop:before>标签来定义,pointcut-ref属性用于引用切入点Bean,而method用来引用切面通知实现类中的方法,该方法就是通知实现,即在目标类方法执行之前调用的方法。

最终通知使用<aop:aspect>标签下的<aop:after >标签来定义,切入点除了使用pointcut-ref属性来引用已经存在的切入点,也可以使用pointcut属性来定义,如pointcut="execution(* cn.javass..*.*(..))",method属性同样是指定通知实现,即在目标类方法执行之后调用的方法。

6.2.4    运行测试

测试类非常简单,调用被代理Bean跟调用普通Bean完全一样,Spring AOP将为目标对象创建AOP代理,具体测试代码如下:

package cn.javass.spring.chapter6;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.javass.spring.chapter6.service.IHelloWorldService;
import cn.javass.spring.chapter6.service.IPayService;
public class AopTest {  @Test  public void testHelloworld() {  ApplicationContext ctx =  new ClassPathXmlApplicationContext("chapter6/helloworld.xml");  IHelloWorldService helloworldService =  ctx.getBean("helloWorldService", IHelloWorldService.class);  helloworldService.sayHello();  }
}

   该测试将输出如下如下内容:

===========before advice
============Hello World!
===========after finally advice

   从输出我们可以看出:前置通知在切入点选择的连接点(方法)之前允许,而后置通知将在连接点(方法)之后执行,具体生成AOP代理及执行过程如图6-4所示。

图6-4 Spring AOP框架生成AOP代理过程

转载于:https://www.cnblogs.com/achengmu/p/8489199.html

spring3: AOP 之 6.2 AOP的HelloWorld相关推荐

  1. Spring3基于注释驱动的AOP

    51CTO正在组织十佳博客评选请 Spring3基于注释驱动的AOP 实在是郁闷刚刚编辑了一篇文章,由于字数的原因,没发布成功,好我就分开写吧,今天向大家介绍的是Spring基于注释驱动的AOP,其实 ...

  2. 动态代理——》AOP —— Spring 中的 AOP||AOP 相关术语||学习 spring 中的 AOP 要明确的事

    AOP 概述 什么是 AOP       AOP:全称是 Aspect Oriented Programming 即:面向切面编程 AOP 的作用及优势 作用: 在程序运行期间,不修改源码对已有方法进 ...

  3. Spring(四)——AOP、Spring实现AOP、Spring整合Mybatis、Spring中的事务管理

    文章目录 1. 什么是AOP 2. 使用Spring实现AOP 2.1 使用Spring的API 接口实现 2.2 自定义实现 2.3 使用注解实现 3. 整合MyBatis 3.1 MyBatis- ...

  4. Spring学习(20)--- Schema-based AOP(基于配置的AOP实现) -- 配置切入点pointcut

    pointcut(切断点)表达式: execution(public * *(..)) execution(* set*(..)) execution(* com.xyz.service.Accoun ...

  5. AOP 详解 、AOP 中通知类型 、AOP 两种实现方式(Schema-base 和 AspectJ)

    一.AOP AOP:中文名称面向切面编程 英文名称:(Aspect Oriented Programming) 正常程序执行流程都是纵向执行流程 3.1 又叫面向切面编程,在原有纵向执行流程中添加横切 ...

  6. Spring→面向切面编程AOP、相关概念、通知Advice类型、配置切面切入点通知、AOP相关API、AOP代理类ProxyFactoryBean、AOP注解@AspectJ

    面向切面编程AOP CGLib AOP相关概念 Advice类型 Spring实现AOP Spring配置切面aspect 配置切入点pointcut 配置通知advice 配置通知参数 调用新的父类 ...

  7. Spring中的AOP(二)——AOP基本概念和Spring对AOP的支持

    AOP的基本概念 AOP从运行的角度考虑程序的流程,提取业务处理过程的切面.AOP面向的是程序运行中的各个步骤,希望以更好的方式来组合业务逻辑的各个步骤.AOP框架并不与特定的代码耦合,AOP框架能处 ...

  8. 什么是AOP? AOP .Net 框架,AOP 资源

    如果说面向对象编程是关注将需求功能划分为不同的并且相对独立,封装良好的类,并让它们有着属于自己的行为,依靠继承和多态等来定义彼此的关系的话:那么面向方面编程则是希望能够将通用需求功能从不相关的类当中分 ...

  9. Java深入理解AOP(什么是AOP,AOP底层实现原理、应用)

    一.什么是AOP 1.AOP:Aspect Oriented Programming(面向切面编程),OOP是面向对象编程,AOP是在OOP基础之上的一种更高级的设计思想. 2.OOP和AOP之间也存 ...

  10. 面试官:谈谈你对IOC和AOP的理解及AOP四种实现方式

    目录 一.IOC与AOP介绍 二.实现AOP的四种方式 方式1:基于经典代理来实现 方式2:使用Spring AOP的API接口 方式3:自定义类来实现AOP 方式4:基于注解实现 一.IOC与AOP ...

最新文章

  1. Codeforces Round #180 (Div. 2) A. Snow Footprints 贪心
  2. 回《笔试常见的“阶乘”编程题,你写对了么?》
  3. WPF bitmap转bitmapimage 使用 CreateBitmapSourceFromHBitmap内存泄漏
  4. java code combat_极客战记怎么换成java_「网易官方」极客战记(codecombat)攻略-沙漠-脆弱的士气......
  5. 论文浅尝 | Improved Neural Relation Detection for KBQA
  6. php点击标题进入_重新学习php基础之-E-mail(十八)
  7. 计算机网络基本操作命令的使用,计算机网络-路由器基本命令操作实验指导书--华为...
  8. android取消内存限制吗,Android 内存限制
  9. 高通增加Adsp log( 三十)
  10. 卸载WPS后如何修复Office文档图标显示异常
  11. 手机不能打电话没有信号无服务器,手机信号故障排除方法
  12. python获取鼠标指针坐标_返回PyQtGraph中的鼠标光标坐标
  13. java即时通讯 开源_im即时通讯开源
  14. Hadoop In Action
  15. Android 获取彩信文本内容及 发送时间 发送人
  16. Retrying connect to server: 192.168.10.101/192.168.10.101:10020. Already tried 0 time(s); retry poli
  17. 使用luckysheet实现excel导入导出
  18. 重新回到Fcitx5的怀抱
  19. 你了解V神吗?先吃透这份不能更全的《以太坊攻略》再说!
  20. 国内真正永久免费的OA办公系统

热门文章

  1. ACM PKU 1251 Jungle Roads http://poj.org/problem?id=1251
  2. 网页编辑器粘贴word格式的处理
  3. JavaScript开发规范要求
  4. 面向服务架构(SOA)和企业服务总线(ESB)
  5. JSP中的坑(一):一个空格都不能少
  6. 对样式overflow的学习
  7. 关于 bind 你可能需要了解的知识点以及使用场景
  8. C# 获取Newtonsoft.Json的JObject多层节点内容
  9. C# winform+ springboot + mybatis 分页查询
  10. sql server,mysql,oracle 获取上一月时间