版权声明:本文为博主原创文章,经博主允许,可自由共享,尽量不要用于商业用途。 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();
}
}