2019独角兽企业重金招聘Python工程师标准>>>

最近在看spring in action 4,为了巩固切面知识,参考了书上的知识写了这个Demo.留着以后复习

业务场景是观众观看演出:

将演出视为一个切点.那么观众就是一个切面.演出开始前观众需要将手机调整为静音并就坐,演出如果顺利结束观众会鼓掌喝彩,演出如果出现了问题,观众就会要求退票.

在程序中来思考的话也就是:

指定在演出这个方法执行前必须先执行观众的手机调整静音和就坐方法.

如果演出方法顺利执行完成了.就执行观众的鼓掌喝彩方法,

如果演出方法抛出了异常,就需要执行观众的退票方法

1.首先创建一个切点

package concert;/*** 切点* @author CCC**/
public interface Performance {public void perform();
}

2.创建表演的实现类

package concert;import java.util.Random;import org.springframework.stereotype.Component;@Component
public class BiaoYan implements Performance {@Overridepublic void perform() {Random ran = new Random();int i = ran.nextInt(2);int j = ran.nextInt(3);System.out.println("表演开始啦!!!");if(j == 0){System.out.println("今天的表演是-白雪公主与七矮人");}else if(j == 1){System.out.println("今天的表演是-白毛女");}else{System.out.println("今天的表演是-孟姜女哭长城");}if(i == 0){System.out.println("表演完美结束");}else if(i == 1){System.out.println("表演出现问题");throw new RuntimeException();}}
}

3.创建切面

package concert;import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;/*** 观看演出的切面* @author CCC**/
@Aspect // 表示该类将作为一个切面
@Component
public class Audience {/*抽取出一个切点用来重用* * 定义一个切点,此处的切点意味着* 不关心该方法的返回值,也不指定传入的参数,* 只要调用该方法之前都会拦截并执行本切面中的方法* * ** 表示不关心返回值类型* concert.Performance 切点方法所属的类* perform 切点* (..) 使用任意参数*/@Pointcut("execution(** concert.Performance.perform(..))")public void performance(){}/*** 表演开始前要将手机调成静音-切点方法执行前*/@Before("performance()") // 指向上面定义的切点
//  @Before("execution(** concert.Performance.perform(..))") // 也可以直接重新定义切点方法public void silenceCellPhones(){System.out.println("手机静音!");}@Before("performance()")public void takeSeats(){System.out.println("观众就坐!");}/*** 表演结束后-切点方法执行结束后*/@AfterReturning("performance()")public void applause(){System.out.println("鼓掌,喝彩!");}/*** 表演失败-切点方法抛出异常*/@AfterThrowing("performance()")public void demanRefund(){System.out.println("要求退票!");}
}

4.创建配置类来启用切点和切面,并让spring 来自动装配bean

package concert;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;/*** 切面配置类 - 启用AspectJ 注解的自动代理* @author CCC**/
@Configuration // 表示为配置类Bean
@EnableAspectJAutoProxy // 启用 AspectJ自动代理
@ComponentScan // 启用自动扫描 默认为同一个包下的类
public class ConcertConfig {
}

5.最后创建一个测试类来测试

package concert;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;//运行时自动创建 Spring 的应用上下文
@RunWith(SpringJUnit4ClassRunner.class)
//指定在 CDPlayerConfig 中加载配置
@ContextConfiguration(classes = ConcertConfig.class)
public class ConertTest {@Autowiredprivate Performance pc;@Testpublic void test1(){for(int i=0;i<5;i++){pc.perform();System.out.println("-----------------------------");}}
}

测试结果:

手机静音!
观众就坐!
表演开始啦!!!
今天的表演是-孟姜女哭长城
表演完美结束
鼓掌,喝彩!
-----------------------------
手机静音!
观众就坐!
表演开始啦!!!
今天的表演是-白毛女
表演出现问题
要求退票!

转载于:https://my.oschina.net/MrBamboo/blog/894394

Spring 切面 注解模式-练习Demo相关推荐

  1. spring切面注解失效

    在项目中使用切面注解做数据脱敏时,导出的数据也需要脱敏处理,遇到了在一个类里面调用本类的方法切面失效,解决方法如下: 切面注解: package com.t3.ts.driver.resume.asp ...

  2. 实践:使用Spring 原生注解来快速实现 策略模式 + 工厂模式

    作者:Richard_Yi juejin.im/post/5db0e910518825648f2ef355 前言 这阵子在做项目组重构的工作,工作中的一部分就是就目前代码库中与企业交互的逻辑抽离出来, ...

  3. Spring —— 基于注解的Aop在同一类下产生嵌套时切面不生效问题产生原因及解决

    一.背景介绍 由于程序中大量方法需要监控执行耗时,因此写了基于注解的Aop类来减少重复代码,主要作用是通过环绕通知在方法执行前后进行耗时计算,最后输出到日志/监控. 相关代码如下: // 注解 @Re ...

  4. java springMVC demo 事例 注解模式 例子 完整事例

                                          关于SpringMVC注解模式的个人小结梳理 现在一直在用springMVC+ibatis+oracle的框架进行开发  但 ...

  5. java spring框架 注解_史上最全的java spring注解

    史上最全的java spring注解,没有之一 注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好.不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就 ...

  6. Spring Boot 注解大全,一键收藏了!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 Sp ...

  7. Java 必须掌握的 12 种 Spring 常用注解

    转载自  Java 必须掌握的 12 种 Spring 常用注解 1.声明bean的注解 @Component 组件,没有明确的角色 @Service 在业务逻辑层使用(service层) @Repo ...

  8. Spring中注解大全

    Spring中注解大全 @Controller 标识一个该类是Spring MVC controller 处理器,用来创建处理http请求的对象 @Controller public class Te ...

  9. (转)Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义

    1.从Spring2.0以后的版本中,Spring也引入了基于注解(Annotation)方式的配置,注解(Annotation)是JDK1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以 ...

  10. Spring源码深度解析(郝佳)-Spring 常用注解使用及源码解析

      我们在看Spring Boot源码时,经常会看到一些配置类中使用了注解,本身配置类的逻辑就比较复杂了,再加上一些注解在里面,让我们阅读源码更加难解释了,因此,这篇博客主要对配置类上的一些注解的使用 ...

最新文章

  1. feifeicms 4.0 几处任意文件删除
  2. docker对aufs触发的bug
  3. LCD RGB 控制技术讲解 — 时钟篇(上)
  4. 成为进阶Linux大佬的第一步
  5. openwrt系统安装到云服务器异常,OpenWrt路由器系统下服务OpenClash 安装教程及其折腾踩坑记录...
  6. 一道关于Promise应用的面试题
  7. 【python 2】python 进阶
  8. leetcode 557. Reverse Words in a String III 、151. Reverse Words in a String
  9. python中cmd如何切换盘_redis 中如何切换db
  10. python-opencv学习第二章
  11. 【elasticsearch】elasticsearch 升级
  12. JAVA SSH框架的配置(myeclipse(9)+tomcat(6.0.35)+struts(2.2.3)+Spring(3.0)+Hibernate(3.0))
  13. LINUX下载编译nasm
  14. python代码转java工具_Python代码转为java代码?
  15. 如何解决控件附件上传时超大附件无法上传的问题
  16. Linux程序设计(Linux shell编程五)
  17. 20200726 T3 树高【ETT(dfs序splay)维护同色边连通块】
  18. App Indexing
  19. 短视频app源码开发,音视频合成的实现
  20. word常见问题_2 添加不同的页码

热门文章

  1. lamp php的ssl,ssh支持
  2. Mac上设置图片或视频的默认打开软件的方法
  3. 如何查看Mac电池损耗?
  4. Android自定义控件封装之自定义属性的实现
  5. 使用selenium搭建网站自动化测试框架及selenium简介
  6. 电商项目面试题 及mysql面试题 太难没啥用
  7. 洛谷3004 [USACO10DEC]宝箱Treasure Chest
  8. C# XmlReader
  9. UNIX环境高级编程之第7章:进程环境
  10. 在桌面养只捣蛋鹅,让 Desktop Goose 陪你一起用Mac