Spring的AOP-AspectJ注解方式

目录

Spring的AOP-AspectJ注解方式

1.创建类,在类里面定义方法

2.创建增强类

3.进行通知的配置

(1)在Spring 配置文件中,开启直接扫描

(2)使用注解创建User 和 UserProxy 对象

(3)在增强类上面添加注解@Aspect

(4)在Spring 配置文件中开启生成代理对象

4.配置不同类型的通知

(1)在增强类的里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置

5.测试:

         全部进行测试:

         测试结果:

观察:

7.如果有多个增强类同时对一个方法进行增强,可以设置增强类的优先级

(1)在增强类上面添加注解@Order(数字类型值)

  结果:


Spring的AOP-AspectJ注解方式

(需要看上一章把xjar包都导入才可以执行以下)

1.创建类,在类里面定义方法

新建一个aop_annotation包

在aop_annotation包内新建一个User类

User类代码如下:

package com.lbj.spring5.aop_annotation;public class User {public void add(){System.out.println("add。。。");}
}

 

2.创建增强类

package com.lbj.spring5.aop_annotation;//增强的类
public class UserProxy {//前置通知public void before(){System.out.println("before");}
}

 

3.进行通知的配置

(1)在Spring 配置文件中,开启直接扫描

bean2.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: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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><!--开启注解扫描/开启组件扫描--><context:component-scan base-package="com.lbj.spring5.aop_annotation"></context:component-scan>
</beans>

 

(2)使用注解创建User 和 UserProxy 对象

一个是被增强的User类

一个是增强的UserProxy类

 

(3)在增强类上面添加注解@Aspect

 

(4)在Spring 配置文件中开启生成代理对象

 

 

4.配置不同类型的通知

(1)在增强类的里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置

package com.lbj.spring5.aop_annotation;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;//增强的类
@Component
@Aspect   //生成代理对象
public class UserProxy {//前置通知//@Before注解表示作为前置通知@Before(value = "execution(* com.lbj.spring5.aop_annotation.User.add(..))")public void before(){System.out.println("before");}
}

 

5.测试:

注意事项:当我们使用了maven搭建项目的时候,bean1.xml文件需要到resources文件里面才能被使用

测试代码:

package com.lbj.spring5.test;import com.lbj.spring5.aop_annotation.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestAop {@Testpublic void testAopAnnotation(){//加载配置文件ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");//得到对象,引入依赖User user = context.getBean("user", User.class);//调用对象的方法user.add();}
}

测试结果: 

 

全部进行测试:

package com.lbj.spring5.aop_annotation;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;//增强的类
@Component
@Aspect   //生成代理对象
public class UserProxy {//前置通知//@Before注解表示作为前置通知@Before(value = "execution(* com.lbj.spring5.aop_annotation.User.add(..))")public void before(){System.out.println("before...");}//最终通知@After(value = "execution(* com.lbj.spring5.aop_annotation.User.add(..))")public void after(){System.out.println("after...");}//后置通知、返回通知@AfterReturning(value = "execution(* com.lbj.spring5.aop_annotation.User.add(..))")public void afterReturning(){System.out.println("afterReturning...");}//异常通知@AfterThrowing(value = "execution(* com.lbj.spring5.aop_annotation.User.add(..))")public void afterThrowing(){System.out.println("afterThrowing...");}//环绕通知@Around(value = "execution(* com.lbj.spring5.aop_annotation.User.add(..))")public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{System.out.println("beforeAround...");//被增强的方法执行proceedingJoinPoint.proceed();System.out.println("afterAround...");}
}

测试类:

package com.lbj.spring5.test;import com.lbj.spring5.aop_annotation.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** Created by 14811 on 2020/12/23.*/
public class TestAop {@Testpublic void testAopAnnotation(){//加载配置文件ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");//得到对象,引入依赖User user = context.getBean("user", User.class);//调用对象的方法user.add();}
}

 

测试结果:

 

 

手动测试异常类:

明显10/0 是异常的

package com.lbj.spring5.aop_annotation;import org.springframework.stereotype.Component;//被增强的类
@Component
public class User {public void add(){int i=10/0;System.out.println("add...");}
}

测试结果:

 

观察:

after不管有没有异常都会执行

afterReturning 只要出现异常就不会执行

 

6.相同的切入点抽取

作用是:把一些重复写的写成公共部分

 

进行方法调用即可

 

 

7.如果有多个增强类同时对一个方法进行增强,可以设置增强类的优先级

(1)在增强类上面添加注解@Order(数字类型值)

数字类型值:越小,优先等级越高

对比: 

 

结果:

 

 

8.完全注解开发:

(1)创建配置类,不需要创建xml配置文件

@Configuration

@ComponentScan(basePackages={''包路径''})

@EnableAspectJAutoProsy(proxyTargetClass=true)

public class ConfigAop{

}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501125.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python turtle绘制柱状图_python绘制图形(Turtle模块)

用python的Turtle模块可以绘制很多精美的图形&#xff0c;下面简单介绍一下使用方法。 需要用到的工具有python&#xff0c;python 的安装这里就不再细说。自行搜索。 from turtle import * #引入turtle模块 color(red, yellow) #设置绘制的颜色和填充颜色 # 海龟设置 hideturt…

laravel商品图片怎么展示_如何使用Laravel图片处理包intervention-image

下面由Laravel教程栏目给大家介绍如何使用Laravel图片处理包intervention-image&#xff0c;希望对需要的朋友有所帮助&#xff01;最近偶然发现了Laravel可用的图片处理包intervention-image。文档地址&#xff1a;http://image.intervention.io安装起来也很简单。composer re…

JdbcTemplate(概念和准备)

目录 1.什么是jdbcTemplate 2.使用前准备工作&#xff1a; &#xff08;1&#xff09;引入相关jar包 &#xff08;2&#xff09;在spring 配置文件配置数据库连接池​ &#xff08;3&#xff09;配置jdbcTemplate 对象&#xff0c;注入 DataSource &#xff08;4&#xf…

python shape函数_Python中的多态及抽象类

本书同名免费MOOC《Python编程基础及应用》在哔哩哔哩(B站)热播&#xff0c;作者带着你学。版权声明&#xff1a;本文内容引用自作者的图书《Python编程基础及应用》(高等教育出版社)。本文可以在互联网上转载传播&#xff0c;但必须包含文中的版权声明&#xff1b;本文不可以以…

idea搭建maven项目关于数据库连接jar包版本问题解决方案

SQLNonTransientConnectionException: CLIENT_PLUGIN_AUTH is required 将mysql-connector-java由5.1.34升级到了6.0.6&#xff0c;本机MySQL5.7使用没问题&#xff0c;连测试服务器MySQL5.5创建数据库连接报错 解决方案&#xff1a; 将mysql-connector-java的版本退回到5.1.34…

二叉树的递归遍历|前中后序遍历、最大深度、最大直径

二叉树的递归遍历 前序遍历 public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res new ArrayList<>();if (root null) {return res;}res.add(root.val);if (root.left ! null) {res.addAll(preorderTraversal(root.left));}if (roo…

python对象的三个属性_Python 对象属性的访问

在 Python 中&#xff0c;一切皆对象。属性访问可以理解为是从一个已有的对象中获得另一个对象的方法。对象属性的访问涉及到对象的 __dict__ 属性、描述符等概念&#xff0c;以及 __getattribute__、__getattr__ 等方法。 对象字典属性 Python 中的对象有一个 __dict__ 属性&a…

JdbcTemplate(操作数据库-添加功能)

目录 JdbcTemplate&#xff08;操作数据库-添加功能&#xff09; 1.建立数据库表&#xff1a; 2.对应数据库创建实体类&#xff1a; 3.编写service 和 dao &#xff08;1&#xff09;在 dao 层进行数据库添加操作 &#xff08;2&#xff09;具体&#xff1a;调用jdbcTemp…

python读取大文件csv_实现读取csv文件,文件里面是有限个百分数成绩(99.6、76.8等等...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 实现读取csv文件&#xff0c;文件里面是有限个百分数成绩&#xff08;99.6、76.8等等&#xff09;导出GPA 和等级代码是这样&#xff0c;但是报错了&#xff0c;在score float(sc)这行就报错了&#xff0c;下面有没有错误还不知道…

JdbcTemplate(操作数据库-修改和删除功能)

目录 JdbcTemplate&#xff08;操作数据库-删除功能&#xff09; 1.创建数据库 2.配置文件实现 3.创建实体类 4.创建dao层 5.创建service层 6.测试类 7.测试结果&#xff1a; JdbcTemplate&#xff08;操作数据库-删除功能&#xff09; 1.创建数据库 user_db数据库的t_…

单片机定时器实验两位倒计时秒表_51单片机基础与应用8天速成(三)

在讲授中断这一概念时&#xff0c;人们总是喜欢举洗衣服烧水的例子&#xff1a;话说&#xff0c;一天“你”独自在家&#xff0c;为了泡脚给自己烧上了一壶水&#xff0c;然后想着明天没有衣服穿了&#xff0c;就去阳台洗起了衣服。过了十几分钟&#xff0c;“你”在阳台洗着衣…

网线制作ppt_快速制作PPT技巧!

为什么同样的PPT&#xff0c;你花费了一天&#xff0c;我却只用了一小时&#xff1f;在我仔细观察了一些制作人员的操作后&#xff0c;总结了如下实用技巧&#xff01;01自定义访问工具栏在PPT中我们有很多的常用操作&#xff0c;例如「左对齐/右对齐」「置于底层/置于顶层」「…

JdbcTemplate(操作数据库-查询返回值)

目录 JdbcTemplate&#xff08;操作数据库-查询返回值&#xff09; 1.创建数据库 2.创建实体类 3.创建dao层 4.创建service层 5.创建测试类&#xff1a; 6.xml配置 7.测试结果&#xff1a; 8.结构示意&#xff1a; JdbcTemplate&#xff08;操作数据库-查询返回值&…

c++opencv显示中文_OpenCV安装,配置和运行

今天小崔有个项目功能想用OpenCV软件库实现一下&#xff0c;就安装了OpenCV,在这里给大家分享一下安装过程。一.什么是OpenCV OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量…

qt 当前窗口句柄_QT获取Windows系统所有窗口句柄

#include #include #pragma comment(lib,"user32.lib")/* 回调函数&#xff0c;用于捕获进程 */BOOL MyEnumProc(HWND hwnd, LPARAM param){LPWSTR lpString (LPWSTR)malloc(sizeof(WCHAR) * MAX_PATH);if (IsWindow(hwnd) &&IsWindowEnabled(hwnd) &&a…

JdbcTemplate(操作数据库-查询返回对象、查询返回集合)

JdbcTemplate&#xff08;操作数据库-查询返回对象、查询返回集合&#xff09; 1.创建数据库 数据库中有三条记录&#xff0c;数据库名为user_db&#xff0c;数据库表为t_book 2.新建实体类&#xff1a; Book类中的每一个属性对应数据库中的一条记录 package org.example.sp…

hbase 查询设置超时_hbase master挂掉-zookeeper连接超时原因

并行运行hbase删表&#xff0c;建表操作&#xff0c;多个表多个region&#xff0c;导致hbase挂掉。查看日志&#xff1a;从日志中可以看出GC时间过长导致zookeeper连接超时&#xff0c;master退出。(是master退出而不是regionserver退出是因为进行的操作是建表&#xff0c;删表…

机器学习如何计算特征的重要性_机器学习之特征工程

特征选择是特征工程中的一个子集&#xff0c;从所有的特征中&#xff0c;选择有意义的&#xff0c;对模型有帮助的特征&#xff0c;以避免将所有特征中对模型没作用的特征导入模型去训练&#xff0c;消耗不必要的计算资源。更正式地说&#xff0c;给定n个特征&#xff0c;我们搜…

白中英 计算机组成原理_计算机组成原理 第五版.立体化教材 白中英 大学教材...

目 录第1章 计算机系统概论第2章 运算方法和运算器第3章 多层次的存储器第4章 指令系统第5章 中央处理器第6章 总线系统第7章 外存与IO设备第8章 输入输出系统第9章 并行组织与结构关于我们大学生必备资源库为大学生提供网课答案、大学课后答案、软件安装、大学考试考证资源以及…

Spring事务操作-事务

目录 Spring事务操作-事务 1.什么是事务 &#xff08;1&#xff09;典型场景 2.事务的四个特性&#xff08;俗称ACID特性&#xff09; &#xff08;1&#xff09;原子性 &#xff08;2&#xff09;一致性 &#xff08;3&#xff09;隔离性 &#xff08;4&#xff09;持久性…