IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring-06 Xml和注解方式配置Aop -> 正文阅读

[Java知识库]Spring-06 Xml和注解方式配置Aop

基本环境准备

导入依赖

<!-- https://mvnrepository.com/artifact/aspectj/aspectjrt -->
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjrt</artifactId>
  <version>1.9.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.9.6</version>
</dependency>

添加xml 新约束

在 spring 核心配置文件中添加 aop 约束

<?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:p="http://www.springframework.org/schema/p"
	   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">
	
</beans>

Spring的 五种通知类型

通知类型标签标签
前置通知aop:before目标方法执行前增强
后置通知aop:after目标方法执行后增强
环绕通知aop:around目标方法执行前后都增强
返回通知aop:after-returning目标方法成功执行之后调用
异常通知aop:after-throwing在目标方法抛出异常后调用

XML 方式配置AOP

根据五种通知类型 配置增强类

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

public class SelectAdvice {

    public void before(JoinPoint joinPoint){
        System.out.println("前置");
        System.out.println("目标类是: "+ joinPoint.getTarget());
        System.out.println("被织入的目标类方法为: "+ joinPoint.getSignature().getName());
    }

    public void afterReturning(){
        System.out.println("后置(方法不出现异常时调用! )");
    }

    public void around(ProceedingJoinPoint pjp) {
        System.out.println("环绕前置");
        try {
            // ProceedingJoinPoint 是joinpoint 的子接口, 用于执行目标方法, 确定在环绕通知中的位置
            pjp.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println("环绕后置");
    }

    public void exception(){
        System.out.println("异常通知");
    }

    public void after(){
        System.out.println("最终通知(类似于异常处理机制中的 finally)");
    }

}

xml配置

<!--配置目标类-->
<bean id="select" class="cn.Select"/>
<!--配置增强类(切面类)-->
<bean id="selectAdvice" class="cn.SelectAdvice"/>

<!-- 配置SpringAOP 增强 -->
<aop:config>
<!--     要对 哪些方法进行增强  -->
    <aop:pointcut id="abc" expression="execution(* cn..*.*(..))"/>
    <aop:pointcut id="def" expression="execution(* cn..*.update*(..))"/>
<!--    增强类的方法, 都对应那种增强方式    -->
    <aop:aspect ref="selectAdvice">
        <aop:before method="before" pointcut-ref="abc"/>
        <aop:after-returning method="afterReturning" pointcut-ref="abc"/>
        <aop:around method="around" pointcut-ref="abc"/>
        <aop:after-throwing method="exception" pointcut-ref="abc"/>
        <aop:after method="after" pointcut-ref="abc"/>
    </aop:aspect>
</aop:config>

测试

public static void main(String[] args) {
    ClassPathXmlApplicationContext app =
            new ClassPathXmlApplicationContext("classpath:application_context.xml");
    Select select =
            (Select)app.getBean("select");
    select.select();

}

基于注解方式配置 AOP

核心配置文件扫描目标类和增强类所在包

<!-- 使用注解配置 bean  -->
<context:component-scan base-package="cn.aop"/>
<!-- 加载 aop 的 注解 -->
<aop:aspectj-autoproxy/>

目标类添加注解

@Component

增强类配置(切面)

切入点表达式

// 声明增强类
@Aspect
@Component

@Pointcut("execution(* cn..*.select(..))")
    private void abc(){
    }

    @Pointcut("execution(* cn..*.update(..))")
    private void def(){
    }

其他注解

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class SelectAdvice {
    @Pointcut("execution(* cn..*.select(..))")
    private void abc(){
    }

    @Pointcut("execution(* cn..*.update(..))")
    private void def(){
    }

    @Before("abc()")
    public void before(JoinPoint joinPoint){
        System.out.println("前置");
        System.out.println("目标类是: "+ joinPoint.getTarget());
        System.out.println("被织入的目标类方法为: "+ joinPoint.getSignature().getName());
    }

    @AfterReturning("abc()")
    public void afterReturning(){
        System.out.println("后置(方法不出现异常时调用! )");
    }

    @Around("abc()")
    public void around(ProceedingJoinPoint pjp) {
        System.out.println("环绕前置");
        try {
            // ProceedingJoinPoint 是joinpoint 的子接口, 用于执行目标方法, 确定在环绕通知中的位置
            pjp.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println("环绕后置");
    }

    @AfterThrowing("abc()")
    public void exception(){
        System.out.println("异常通知");
    }
    @After("abc()")
    public void after(){
        System.out.println("最终通知(类似于异常处理机制中的 finally)");
    }

}

测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ={"classpath:application_context.xml"})
public class Test1 {

    @Autowired
    Select select;

    @Test
    public void aopTest(){
        select.add();
    }

}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-15 01:51:23  更:2022-09-15 01:52:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:12:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码