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知识库 -> springAop开发测试demo -> 正文阅读

[Java知识库]springAop开发测试demo


前言

springAop+aspectJ可以实现:
1 配置文件开发
2 注解开发

一、pom文件

  1. spring context 内部包含aop相关
  2. aspectjweaver 使用到内部的注解
  3. 剩下的主要用于测试使用
<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.0.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.8.4</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.0.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

二、配置文件形式

在这里插入图片描述

2.1 target 目标对象

package com.mytest.aop;

public class Target implements TargetInterface {
    @Override
    public void method() {
        System.out.println("method running");
    }
}

2.2 Advice 增强对象

package com.mytest.aop.impl;

public class Advice {
    public void preAdv(){
        System.out.println("前置增强。。。");
    }
    public void postAdv(){
        System.out.println("后置增强。。。");
    }
}

2.3 target 目标函数接口

package com.mytest.aop;

public interface TargetInterface {
    public void method();
}

2.4 applicationContext.xml

要配置切面

  1. 目标对象
  2. 增强对象
  3. 将增强对象作为切面,配置切点和通知

该配置:给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: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/aop http://www.springframework.org/schema/aop/spring-aop.xsd
                            ">
<!--    配置切面 = 切点+通知-->
<!--    配置 包含切点的目标对象-->
    <bean id="target" class="com.mytest.aop.Target"></bean>
<!--    配置 包含通知的增强对象-->
    <bean id="advice" class="com.mytest.aop.impl.Advice"></bean>
<!--    配置切面-->
    <aop:config>
        <aop:aspect ref="advice">
<!--            配置具体方法 切点+通知-->
<!--            <aop:before method="preAdv" pointcut="execution(public void com.mytest.aop.Target.method())"/>-->
            <aop:before method="preAdv" pointcut="execution(* com.mytest.aop.*.*(..))"/>
        </aop:aspect>
    </aop:config>
</beans>

2.4.1 切点表达式的写法

语法

pointcut="execution([修饰符] 返回值类型 包名.类名.方法名(参数))"
  • 访问修饰符可以省略
  • 返回值类型、包名、类名、方法名可以使用星号* 代表任意
  • 包名与类名之间一个点 . 代表当前包下的类,两个点 … 表示当前包及其子包下的类
  • 参数列表可以使用两个点 … 表示任意个数,任意类型的参数列表

所以

execution(* com.mytest.aop.*.*(..))

表示任意返回值类型,在com.mytest.aop包下的任意方法及其子类,都要进行增强。

2.4.2 通知的类型

语法

<aop:通知类型 method=“切面方法” pointcut=“切点表达式"></aop:通知类型>

类型如下

名称标签说明
前置通知aop:before指定增强的方法在切点方法前执行
后置通知aop:after-returning指定增强的方法在切点方法后执行
环绕通知aop:around指定增强的方法在切点方法前和后都执行
异常抛出通知aop:throwing指定增强的方法在出现异常时执行
最终通知aop:after无论增强方式执行是否有异常都会执行

2.5 aop测试

package com.mytest.aop.test;

import com.mytest.aop.TargetInterface;
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 TestAop {
    @Autowired
    private TargetInterface target;

    @Test
    public void testTarget(){
        target.method();
    }
}

三、注解形式

3.1 target 目标对象

增加了@Component(“target”)

package com.mytest.anno;

import org.springframework.stereotype.Component;

@Component("target")
public class Target implements TargetInterface {
    @Override
    public void method() {
        System.out.println("method running");
    }
}

3.2 Advice增强对象

使用到
@Aspect 表明是一个切面类
@Before 内写切点的表达式

package com.mytest.anno.impl;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Component("annoAdvice")
@Aspect
public class Advice {
    @Before("execution(* com.mytest.anno.*.*(..))")
    public void preAdv(){
        System.out.println("前置增强。。。");
    }

    public void postAdv(){
        System.out.println("后置增强。。。");
    }
}

3.3 target 目标对象接口

package com.mytest.anno;

public interface TargetInterface {
    public void method();
}

3.4 applicationContext-anno.xml

一定要开启自动代理

<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--    组件扫描-->
    <context:component-scan base-package="com.mytest.anno"></context:component-scan>
<!--    自动代理-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

3.5 anno测试

package com.mytest.aop.test;


import com.mytest.anno.TargetInterface;
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-anno.xml")
public class TestAnno {
    @Autowired
    private TargetInterface target;

    @Test
    public void testTarget(){
        target.method();
    }
}

该处使用的url网络请求的数据。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:16:56  更:2022-02-26 11:17: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/24 11:53:46-

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