springAOP--学习和理解--用注解方式完成面向切面编程--异常后通知

版权声明:本文为博主原创文章,经博主允许,可自由共享,尽量不要用于商业用途。 https://blog.csdn.net/matrixbbs/article/details/89085967

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.4.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.zfh</groupId>
	<artifactId>springAOP-4</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springAOP-4</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		
		<!-- AOP依赖 start -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
        </dependency>
        
        <!-- AspectJ start-->
        <dependency>
          <groupId>org.aspectj</groupId>
          <!-- runtime包 -->
          <artifactId>aspectjrt</artifactId>
          <version>1.6.11</version>
        </dependency>
        <dependency>
          <groupId>org.aspectj</groupId>
          <!-- 织入包 -->
          <artifactId>aspectjweaver</artifactId>
          <version>1.6.11</version>
        </dependency>
        <!-- 用于动态代理,基于类的代理 -->
        <dependency>
          <groupId>cglib</groupId>
          <artifactId>cglib</artifactId>
          <version>2.1</version>
        </dependency>
        <!-- AspectJ end-->
        
        <!-- AOP依赖 end -->
		
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

2 核心业务及实现

package com.fhzheng.demo.concert;

/**
 * 核心业务定义
 * @author fhzheng
 *
 */
public interface Performance {

	void perform() throws Exception;
}

package com.fhzheng.demo.concert;

/**
 * 核心业务实现
 * @author fhzheng
 *
 */
public class Concert implements Performance{

	@Override
	public void perform() throws Exception {

//		System.out.println("音乐会进行中...");
		System.out.println("会场起火...音乐会取消.");
		throw new Exception("场地失控");
	}

}

3 切面关注点

package com.fhzheng.demo.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;

/**
 * 切面定义,即业务周边增强
 * @author fhzheng
 *
 */
@Aspect
public class Audience {

	@Pointcut("execution(* com.fhzheng.demo.concert.Performance.*(..))")
	public void perform() {}
	
	@Before("perform()")
	public void checkIn() {
		System.out.println("观众需检票入场。。。");
	}
	
	@Before("perform()")
	public void takeSeats() {
		System.out.println("观众入座。。。");
	}
	
	@AfterReturning("perform()")
	public void applause() {
		System.out.println("表演精彩,观众欢呼...");
	}
	
	@AfterThrowing("perform()")
	public void demandRefund() {
		System.out.println("表演出差错,观众退款...");
	}
}

4 java配置文件

package com.fhzheng.demo.concert;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {

	/**
	 * 声明核心业务实现bean,交给容器
	 * @return
	 */
	@Bean
	public Concert concert() {
		return new Concert();
	}
	
	/**
	 * 声明切面业务实现bean,交给容器
	 * @return
	 */
	@Bean
	public Audience audience() {
		return new Audience();
	}
}

5 测试部分的代码

	@Test
	public void aopTest() {
		AnnotationConfigApplicationContext context =
				new AnnotationConfigApplicationContext(AppConfig.class);
		Performance concert = context.getBean(Performance.class);
		try {
			concert.perform();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

6 测试结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/matrixbbs/article/details/89085967