本文共 2953 字,大约阅读时间需要 9 分钟。
一、采用配置方式使用AOP
1、在net.zjs.spring包里创建lesson05.aop_xml子包
2、在aop_xml子包里创建杀龙任务类 - SlayDragonQuest
3、在aop_xml子包里创建勇敢骑士类 - BraveKnight
4、在aop_xml子包里创建游吟诗人类 - Minstrel
5、在pom文件里添加AOP相关依赖
- 注意:添加依赖后,一定要点击按钮更新
6、创建Spring配置文件
(1) 在resources里创建aop_xml目录,在里面创建spring-config.xml配置文件
(2) 编写组件扫描
(3) 在AOP配置里面定义切面
(4) 定义切点
- 什么是切点? 在使用Spring框架配置AOP时,不管是通过XML配置文件还是注解方式,都需要定义pointcut(切点)。
(5) 切点表达式
定义切点表达式expression=“execution(* net.hw.spring.lesson05…*.embarkOnQuest(…))”
(6)切换函数
execution()是最常用的切点函数,整个表达式可以分为五个部分。
- execution():表达式主体。
- 第一个*号:表示返回类型,*号表示所有的类型。
- 包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,net.hw.spring包、子孙包下所有类的方法。
- 第二个*号:表示类名,*号表示所有的类。
- *(…):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。
(7)声明前置通知
(8) 声明后置通知
7、创建测试类 —— TestKnight
- 在test/java里创建net.zjs.spring.lesson05.aop_xml包,在包里创建TestKnight
8、运行测试方法testBraveKnight(),查看结果
- 将spring-config.xml中的删除即可
- 再次运行,查看结果
9、在lesson05.aop_xml子包中增加救美任务类与救美骑士类
(1)救美骑士类
(2)救美任务类
10、在测试类里增加测试方法 - testDamselRescuingKnight()
11、运行测试方法——testDamselRescuingKnight()
二、采用注解方式使用AOP
1、在net.hw.spring包里创建lesson05.aop_annotation子包
2、将aop_xml子包中SlayDragonQuest(杀龙任务类)拷贝到aop_annotantion子包中
3、 将aop_xml子包中BraveKnight(勇敢骑士类)拷贝到aop_annotantion子包中
4、在aop_annotation子包里创建注解接口 - Action
- 此接口是要完成配置文件的作用
(1)拦截目标——方法
- @Target({ElementType.TYPE}) 注解
- ElementType 这个枚举类型的常量提供了一个简单的分类:注解可能出现在Java程序中的语法位置(这些常量与元注解类型(@Target)一起指定在何处写入注解的合法位置)
(2)保持策略——运行时
- @Retention({RetentionPolicy.Runtime}) 注解
- RetentionPolicy这个枚举类型的常量描述保留注解的各种策略,它们与元注解(@Retention)一起指定注释要保留多长时间
(3)注解文档化
- @Documented注解
- Documented注解表明这个注解是由 javadoc记录的,在默认情况下也有类似的记录工具。 如果一个类型声明被注解了文档化,它的注解成为公共API的一部分。
5、创建游吟诗人切面类(MinstrelAspect)
- 取代spring-config.xml中的AOP配置
6、在aop_annotation子包里创建Spring配置类 - AopConfig
7、创建骑士测试类
(1)在lesson05子包中创建aop_annotation以及TestKnight测试类
(2)运行骑士测试类
- 出现找不到Mike这个名字的错误
- 子包aop_annotation中的勇敢骑士类包导入错误,删掉即可
- 再次运行骑士测试类
三、课堂练习
1、增加救美任务类
2、增加救美骑士类
3、在测试类里增加测试方法 - testDamselRescuingKnight()
4、运行测试类,查看测试结果
四、实现注解式拦截
1、修改勇敢骑士类,给embarkOnQuest()添加自定义注解Action,并设置name属性
- name可随意取
2、修改游吟诗人( MinstrelAspect)
- 注:定义切点的方式发生改变
3、运行TestKnight类中的testBraveKnight测试方法,查看结果
4、修改救美骑士类,给embarkOnQuest()添加自定义注解Action
5、运行测试方法testDamselRescuingKnight(),查看效果
五、课后作业
任务:输出骑士完成任务的耗时
1、在aop_annnotation子包中创建耗时切面类 (ElapseAspect)
2、运行测试类,查看效果
-
System.currentTimeMillis()计算方式
在开发过程中,通常很多人都习惯使用new Date()来获取当前时间。new Date()所做的事情其实就是调用了System.currentTimeMillis()。如果仅仅是需要或者毫秒数,那么完全可以使用System.currentTimeMillis()去代替new Date(),效率上会高一点。如果需要在同一个方法里面多次使用new Date(),通常性能就是这样一点一点地消耗掉,这里其实可以声明一个引用。 -
使用方法
//获得系统的时间,单位为毫秒,转换为妙 long totalMilliSeconds = System.currentTimeMillis(); long totalSeconds = totalMilliSeconds / 1000; //求出现在的秒 long currentSecond = totalSeconds % 60; //求出现在的分 long totalMinutes = totalSeconds / 60; long currentMinute = totalMinutes % 60; //求出现在的小时 long totalHour = totalMinutes / 60; long currentHour = totalHour % 24; //显示时间 System.out.println("总毫秒为: " + totalMilliSeconds); System.out.println(currentHour + ":" + currentMinute + ":" + currentSecond + " GMT");
转载地址:http://kntki.baihongyu.com/