文档章节

Spring 切面 注解模式-练习Demo

竹竿先生
 竹竿先生
发布于 2017/05/07 20:19
字数 837
阅读 49
收藏 0

    最近在看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 {

	@Override
	public 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 {
	
	@Autowired
	private Performance pc;
	
	@Test
	public void test1(){
		for(int i=0;i<5;i++){
			pc.perform();
			System.out.println("-----------------------------");
		}
	}
}

测试结果:

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

 

© 著作权归作者所有

竹竿先生
粉丝 3
博文 92
码字总数 25526
作品 0
杭州
程序员
私信 提问
最最简单的spring及AOP实例

一、简单的spring实现(annotation方式) bean类 测试类: 运行结果: (xml方式) bean类 xml配置文件applicationContext.xml(放在包com.hello下) 测试类: 二、注解方式实现aop(需要导入...

wangxuwei
2017/10/24
0
0
Spring Boot 2.0 动态数据源快速启动器 1.3.0 发布

dynamic-datasource-spring-boot-starter 升级到1.3.0版本,dynamic-datasource-spring-boot-starter 是 Spring Boot 2.0 的动态数据源快速启动器。 项目及文档地址:https://gitee.com/bao......

小锅盖
2018/05/08
1K
0
SpringAOP详细配置与使用

前言:本篇为复习总结之用,主要说明了下SpringAOP的概念,包含了Spring官方给的概念结合我自己的理解,配置其中包括了xml以及annotation方式。 SpringAOP简介: 面向切面编程(Aspect Orie...

菜鸟腾飞
01/05
0
0
SpringCloud基础篇AOP之拦截优先级详解

相关文章可以查看: http://spring.hhui.top - 190301-SpringBoot基础篇AOP之基本使用姿势小结 - 190302-SpringBoot基础篇AOP之高级使用技能 前面两篇分别介绍了AOP的基本使用姿势和一些高级特...

小灰灰Blog
03/12
0
0
手写Spring基本体系IOC+AOP+MVC+事物管理等简单实现。

注:由于本工程包含的内容较多。大部分设计图、代码示例不能提供。 请移步至码云clone查看:https://gitee.com/Coodyer/Coody-Framework 本文仅介绍实现思路。 By:Coody 644556636@qq.com ...

Coody
2018/03/01
0
1

没有更多内容

加载失败,请刷新页面

加载更多

Feign输出Info级别日志

背景   spring cloud netfix组件中,feign相关的日志默认是不会输出的,需要自定义配置才能输出,并且Feign只对Debug基本的日志做出响应, 实际业务需要输出Info级别的日志,所以需要做自定...

xiaomin0322
21分钟前
3
0
面向解决问题的java编程,spring boot,mybatis generator和坑-1starter

1、start一个spring boot项目 第一课我们也不能免俗,要从starter开始,spring boot的起始项目脚手架可以从spring boot官方starter生成地址开始:https://start.spring.io/ 这张图列出了一个...

wphmoon
21分钟前
1
0
Linux虚拟化技术—CentOS7.4下KVM虚拟化一 安装配置及基本操作

Linux虚拟化技术—CentOS7.4下KVM虚拟化一 安装配置及基本操作 0行云流水00人评论61017人阅读2018-04-11 19:57:20 KVM的安装配置与基本操作 目录 第一部分 实验环境 第二部分 安装图形界面 ...

linjin200
24分钟前
1
0
php获取网站favicon.ico图标 api源码

 通常情况下,做网站的都会给自己的网站添加一个Icon,浏览器上一长排的标签页,用Icon来区分就显得更加醒目。现在想找一个没有Icon的网站并不好找,可见没有Icon的网站是多么的业余啊。"什...

xiaogg
27分钟前
1
0
双亲委派的认识

首先JVM中有三种类加载器 Bootstrap启动类加载器 Extension扩展类加载器(ExtClassLoader) System系统类加载器(AppClassLoader) 某个特定的类接到加载类的请求时候,首先将加载任务委托给...

最胖的瘦子
31分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部