`
jinnianshilongnian
  • 浏览: 21479564 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2413741
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3004942
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5637072
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:259310
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1595770
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:249843
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5854700
Group-logo
跟我学Nginx+Lua开...
浏览量:700595
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:783619
社区版块
存档分类
最新评论

【第六章】 AOP 之 6.2 AOP的HelloWorld ——跟我学spring3

阅读更多

 

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)定义目标接口:

 

java代码:
  1. package cn.javass.spring.chapter6.service;  
  2. public interface IHelloWorldService {  
  3.     public void sayHello();  
  4. }  

 

       2)定义目标接口实现:

 

java代码:
  1. package cn.javass.spring.chapter6.service.impl;  
  2. import cn.javass.spring.chapter6.service.IHelloWorldService;  
  3. public class HelloWorldService implements IHelloWorldService {  
  4.     @Override  
  5.     public void sayHello() {  
  6.         System.out.println("============Hello World!");  
  7.     }  
  8. }  
  9.    

 

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

 

6.2.2  定义切面支持类

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

 

java代码:
  1. package cn.javass.spring.chapter6.aop;  
  2. public class HelloWorldAspect {  
  3.        //前置通知  
  4.     public void beforeAdvice() {  
  5.         System.out.println("===========before advice");  
  6. }  
  7. //后置最终通知  
  8.     public void afterFinallyAdvice() {  
  9.         System.out.println("===========after finally advice");  
  10.     }  
  11. }  

 

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

 

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

 

6.2.3  在XML中进行配置

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

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

 

java代码:
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans  xmlns="http://www.springframework.org/schema/beans"  
  3.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.         xmlns:aop="http://www.springframework.org/schema/aop"  
  5.         xsi:schemaLocation="  
  6.            http://www.springframework.org/schema/beans  
  7.            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  8.            http://www.springframework.org/schema/aop  
  9.            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">  
  10. </beans>  
  11.    

 

 

       2)配置目标类:

 

java代码:
  1. <bean id="helloWorldService"  
  2. class="cn.javass.spring.chapter6.service.impl.HelloWorldService"/>  
  3.    

 

       3)配置切面:

 

java代码:
  1. <bean id="aspect" class="cn.javass.spring.chapter6.aop.HelloWorldAspect"/>  
  2. <aop:config>  
  3. <aop:pointcut id="pointcut" expression="execution(* cn.javass..*.*(..))"/>  
  4.     <aop:aspect ref="aspect">  
  5.         <aop:before pointcut-ref="pointcut" method="beforeAdvice"/>  
  6.         <aop:after pointcut="execution(* cn.javass..*.*(..))" method="afterFinallyAdvice"/>  
  7.     </aop:aspect>  
  8. </aop:config>  

 

       切入点使用<aop:config>标签下的<aop:pointcut>配置,expression属性用于定义切入点模式,默认是AspectJ语法,“execution(* cn.javass..*.*(..))”表示匹配cn.javass包及子包下的任何方法执行。

 

切面使用<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代理,具体测试代码如下:

 

java代码:
  1. package cn.javass.spring.chapter6;  
  2. import org.junit.Test;  
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5. import cn.javass.spring.chapter6.service.IHelloWorldService;  
  6. import cn.javass.spring.chapter6.service.IPayService;  
  7. public class AopTest {  
  8.     @Test  
  9.     public void testHelloworld() {  
  10.         ApplicationContext ctx =  new ClassPathXmlApplicationContext("chapter6/helloworld.xml");  
  11.         IHelloWorldService helloworldService =  
  12.         ctx.getBean("helloWorldService", IHelloWorldService.class);  
  13.         helloworldService.sayHello();  
  14.     }  
  15. }  
  16.    

 

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

 

java代码:
  1. ===========before advice  
  2. ============Hello World!  
  3. ===========after finally advice  

 

 

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

 

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

 

 

原创内容 转自请注明出处【http://sishuok.com/forum/blogPost/list/2467.html


 

分享到:
评论
2 楼 jinnianshilongnian 2012-04-06  
kimifdw 写道
在XML的配置中有点问题,需要引入aopalliance.jar包,对初学者来说,一开始配置会有问题

谢谢 ,估计我说的不明白,此处我使用了 spring-dependecies.zip里的 com.springsource.org.aopalliance-1.0.0.jar
1 楼 kimifdw 2012-04-06  
在XML的配置中有点问题,需要引入aopalliance.jar包,对初学者来说,一开始配置会有问题

相关推荐

    跟开涛学Spring

    1.19 【第六章】 AOP 之 6.2 AOP的HelloWorld ——跟我学spring3 . . . . . . . . . . . . . . . . . . . . . . . . .208 http://jinnianshilongnian.iteye.com 第 2 / 366 页 1.20 【第六章】 AOP 之 6.3 基于...

    Android课程设计 小吃APP.zip

    Android课程设计 小吃APP.zip

    数据库课程设计。纯java源码的关系数据库.zip

    数据库课程设计。纯java源码的关系数据库

    基于JAVA的企业销售管理系统.zip

    基于JAVA的企业销售管理系统设计实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 基于JAVA的企业销售管理系统设计实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 基于JAVA的企业销售管理系统设计实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 基于JAVA的企业销售管理系统设计实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。

    VB002学生成绩管理系统毕业课程设计项目+论文+开题报告

    编号:67 课题研究的主要内容及拟解决的问题。 1•有关学籍等信息的输入,包括输入学生基本信息、所在班级、所学课程和成绩等。 2•学生信息的查询,包括查询学生基本信息、所在班级、已学课程和成绩等。 3•学生信息的修改。 4•班级信息管理的输入,包括输入班级设置、年级信息等。 5•班级信息管理的修改。 6•班级管理信息的查询。 7•学校基本课程信息的输入。 8•基本课程信息的修改。 9•学生课程的设置和修改。 10•学生成绩信息的输入。 11•学生成绩信息的修改。 12•学生成绩信息的查询。 13•学生成绩信息的统计。 针对一般学生管理系统的需求,通过对学生学习过程的内容和数据流程 分析,设计如下面所示的数据项和数据结构: •学生基本信息:包括的数据项有:学生学号、学生姓名、性别、出生日期、班号、联系电话、入学日期、家庭地址、注备等。 •班级信息:包括的数据项有:班号、所在年级等。 •课程基本信息:包括的数据项有:课程号、课程名称、课程类别等。 •课程设置信息:包括的数据项有:年级信息、所学课程等。 •学生成绩信息:包括的数据项有:考试编号、所在班号、学

    1560-基于51单片机的温度报警(PT100,MAX7219,ADC0832,恒流源)proteus,原理图、流程图、物料清单

    1560-基于51单片机的温度报警(PT100,MAX7219,ADC0832,恒流源)proteus,原理图、流程图、物料清单、仿真图、源代码 资料介绍: 基于51单片机的温度报警(PT100,MAX7219,ADC0832,恒流源) 1、传感器pt100测温,adc0832转换结果 2、使用max7219驱动数码管 3、具有上下限报警功能 4、传感器采用恒流源驱动,不是常规的接法 有哪些资料: 1、仿真工程文件 2、源代码工程文件 3、原理图工程文件 4、功能介绍 5、元件清单

    浙江工业大学「面向对象Java程序设计」课程设计.zip

    浙江工业大学「面向对象Java程序设计」课程设计.zip

    重庆理工大学在广东2021-2024各专业最低录取分数及位次表.pdf

    全国各大学在广东省2021~2024年各专业最低录取分数及位次

    中国农业大学在北京2021-2024各专业最低录取分数及位次表.pdf

    全国各大学2021-2024在北京各专业录取分数及最低位次

    1564-基于51单片机的温度报警(上下限,数码管,DS18B20)proteus,原理图、流程图、物料清单、仿真图、源代码

    1564-基于51单片机的温度报警(上下限,数码管,DS18B20)proteus,原理图、流程图、物料清单、仿真图、源代码 资料介绍: 温度报警器 1、通过DS18B20测量当前温度 2、数码管显示温度值 3、设置上下限,温度过限蜂鸣器响 有哪些资料: 1、仿真工程文件 2、源代码工程文件 3、原理图工程文件 4、功能介绍 5、元件清单

    5G网络优化:基于随机森林用户画像建模的精确大数据营销支撑创新.docx

    基于随机森林用户画像建模的精确大数据营销支撑创新 摘要:近阶段,运营商传统的外呼营销方法主要根据用户当月流量和已有套餐信息判断用户是否为高潜质用户,对潜在人群按营销单元进行铺开的大范围营销,如终端更换、套餐升级、换卡等。通过这种粗放的划定流量和套餐门限来衡量用户是否为高潜质用户,效率性和准确率一直是困扰的问题,大规模粗放式的外呼不仅浪费公司宝贵的人力成本,加大了无谓的工作量,频繁的无差别外呼更会引起用户的反感情绪,不适合温和营销。 随着用户分析建模定位研究的深入和实践中的不断优化提高,在电信行业用户无线大数据预测中引入大数据挖掘分析技术。通过对数据捞取后的一系列数据清洗,基于pandas,对特征之间及特征与目标变量之间的相关性进行分析,将60维模型降维。基于相关性分析,筛选相关性大的特征作为模型的特征,共梳理出相关性最大的19建模权重维度。引入随机森林建立高潜质用户模型,而后逐步优化模型。根据前端营销需求,分场景定位针对营销目标进行支撑,形成用户-门店-常住地址的外呼清单,助力前端精准营销,温和营销。 经创新支撑,南京全网三季度同比一季度流量增长3倍,九月四处支撑营销单元总流量同比6月

    Java课程设计-学生成绩管理系统-Swing+MySQL.zip

    Java课程设计-学生成绩管理系统-Swing+MySQL.zip

    辽宁大学在广东2021-2024各专业最低录取分数及位次表.pdf

    全国各大学在广东省2021~2024年各专业最低录取分数及位次

    QCustomPlot源码及封装

    童叟无欺

    Arbitrage Theory in Continuous Time

    The purpose of this book is to present arbitrage theory and its applications to pricing problems for financial derivatives. It is intended as a textbook for graduate and advanced undergraduate students in finance, economics, mathematics, and statistics and I also hope that it will be useful for practitioners.

    开源的六足机器人源码及设计文件

    包括源码,以及3D打印文件。

    APS课程设计后端部分.zip

    APS课程设计后端部分

    华南师范大学在广东2021-2024各专业最低录取分数及位次表.pdf

    全国各大学在广东省2021~2024年各专业最低录取分数及位次

    python 3.12.6版本下载

    Python 3.12.6 是 Python 编程语言的最新版本之一,提供了众多改进和新特性,使编程体验更加高效和稳定。无论你是开发者还是数据科学家,安装 Python 3.12.6 都是提升工作效率的关键步骤。本文将为你详细介绍 Python 3.12.6 的安装过程,并展示其主要功能和改进。

Global site tag (gtag.js) - Google Analytics