当前位置: 首页 > news >正文

Spring AOP的注解式开发实现

目录

  • AOP常用注解
  • 注解开发实现步骤
    • 1. 导入Maven项目依赖
    • 2. 准备一个实体类(先定义接口再实现)
    • 3. 定义切面类
    • 4. 准备配置文件
    • 5. 编写测试类
  • 注意事项

  • AOP的配置开发方式见:Spring入门之AOP(包含实例代码)。
  • 其他纯注解开发方式见:Spring实现纯注解项目开发。

AOP常用注解

注解名称
@Before前置通知
@After后置通知
@AfterThrowing异常通知
@AfterReturning最终通知
@Around环绕通知

注解开发实现步骤

1. 导入Maven项目依赖

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- 连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency><!-- mysql驱动包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.2.RELEASE</version><scope>test</scope></dependency><!--AOP联盟--><dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version></dependency><!--Spring Aspects--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.2.RELEASE</version></dependency><!--aspectj--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.3</version></dependency>
</dependencies>

2. 准备一个实体类(先定义接口再实现)

package com.qcby.service;public interface UserService {public void save();
}
package com.qcby.service.impl;import com.qcby.service.UserService;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl implements UserService {public void save() {
//        int aa = 1/0;System.out.println("业务层:Hello World!");}
}

3. 定义切面类

package com.qcby.util;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Aspect
@Component
public class MyAspect {//自定义切面类 = 切入点(表达式) + 通知(增强代码)//通知@Before("execution(* com.qcby.*.*.*ServiceImpl.save*(..))")public void log1() {System.out.println("我是前置增强方法!");}@After("execution(* com.qcby.*.*.*ServiceImpl.save*(..))")public void log2() {System.out.println("我是后置增强方法!");}@AfterThrowing("execution(* com.qcby.*.*.*ServiceImpl.save*(..))")public void log3() {System.out.println("我是异常增强方法!");}@AfterReturning("execution(* com.qcby.*.*.*ServiceImpl.save*(..))")public void log4() {System.out.println("我是最终增强方法!");}//开启环绕通知//需要传入一个参数 spring提供的一个接口 ProceedingJoinPoint//这个接口中有个proceed方法,作用是让目标对象的方法调用@Around("execution(* com.qcby.*.*.*ServiceImpl.save*(..))")public void aroundLog(ProceedingJoinPoint point) {try {log1();point.proceed(); //目标对象方法手动调用log4(); //失败就不会调用的最终方法} catch (Throwable e) {log3();e.printStackTrace();} finally {log2(); //无论成功与否都会调用的后置方法}}
}

4. 准备配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"><!--    注解开发方式--><!--    开启注解扫描--><context:component-scan base-package="com.qcby"/>
<!--    开启自动代理--><aop:aspectj-autoproxy/>
</beans>

5. 编写测试类

import com.qcby.service.UserService;
import com.qcby.util.SpringConfig;
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;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class UserServiceTest {@Autowiredprivate UserService userService;@Testpublic void run() {userService.save();}
}

注意事项

  1. 使用注解式开发还需要在spring的配置文件中开启自动代理:<aop:aspectj-autoproxy/>
  2. AOP纯注解式开发需要在配置类中多加一个注解@EnableAspectJAutoProxy开启自动代理

http://www.mrgr.cn/news/21540.html

相关文章:

  • 商城系统的数据库
  • Node.js入门与生态全解析:包管理与构建工具详解
  • 程序中的零值比较
  • Qt线程使用
  • 使用 @NotEmpty、@NotBlank、@NotNull 注解进行参数校验
  • log4j靶场,反弹shell
  • 828华为云征文|基于Flexus云服务器X实例的应用场景-部署动态域名神器lucky
  • Openharmony 图片自适应全屏显示
  • 人工智能数据基础之线性代数入门-学习篇
  • 自我提升社团成立啦,欢迎各位同学加入~
  • 电脑驱动作用详解
  • 基于SSM+Vue+MySQL的可视化高校公寓管理系统
  • CTF 竞赛密码学方向学习路径规划
  • 心脑血管科张景龙医生:心功能不全,全面解析心脏健康的隐忧
  • 图像分割分析效果2
  • HMI设计:嵌入式设备和电脑的差异化,工控领域首选。
  • 算法设计与分析(乘船问题
  • 结构化开发方法的三种基本控制结构
  • SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI
  • 多机编队—(2)Ubuntu安装Eigen OSQP OSQP-EIGEN求解器