Spring5框架—— AspectJ
目录
一、操作术语
二、AspectJ(准备工作)
1.什么是 AspectJ
2.基于AspectJ 实现AOP操作
3.切入点表达式
三、AOP操作(AspectJ注解)
四、AOP操作(AspectJ配置文件)
一、操作术语
1、连接点
类里面哪些方法可以被增强,这些方法称为连接点
2、切入点
实际被真正增强的方法,称为切入点
3、通知(增强)
(1)实际增强的逻辑部分称为通知(增强)
(2)通知有多钟类型
前置通知
后置通知
环绕通知
异常通知
最终通知
4.切面
将通知应用到切入点的过程。
二、AspectJ(准备工作)
Spring框架中一般基于 AspectJ 实现AOP相关操作
1.什么是 AspectJ
* AspectJ 并不是Spring组成部分,是独立的AOP框架,一般将 AspectJ 和 Spring 框架一起使用,进行AOP操作
2.基于AspectJ 实现AOP操作
(1)基于xml配置文件实现
(2)基于注解方式实现(实际使用)
3.在项目中引入AOP相关依赖
3.切入点表达式
(1)切入点表达式作用:知道对哪个类里面的哪个方法进行增强
(2)语法结构:
execution([权限修饰词] [返回类型] [类全路径] [方法名称] ([参数列表]))
举例1:对 com.xx.dao.BookDao类中的add()方法进行增强
execution(*com.xx.dao.BookDao.add()(..))
举例2:对com.xx.dao.BookDao类中的所有方法进行增强
execution(*com.xx.dao.BookDao.*(..))
举例3: 对com.xx.dao包中的所有类,类里的所有方法进行增强
execution(*com.xx.dao.*.*(..))
注: * :可以是public、private,为了为方便则用 * 代替(表示什么类型都可以)
..:表示参数列表
三、AOP操作(AspectJ注解)
1.创建类,在类中定义方法
package com.xx.AOP;public class User {public void add(){System.out.println("add.....");}
}
2.创建增强类(编写增强逻辑)
package com.xx.AOP;//增强的类
public class UserProxy {//前置通知(在User.add()方法执行前执行此方法)public void before(){System.out.println("before.......");}
}
3.进行通知配置
(1)在Spring配置文件中,开启注解的扫描 (可以通过配置类—完全注解开发,也可以通过配置文件,此处使用配置文件)
<?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.xx.AOP"></context:component-scan></beans>
(2)使用注解,创建User和UserProxy
(3)在增强类上面添加@Aspect
(4)在Spring配置文件中开启代理对象
4. 配置不同类型的通知
(1)在增强类中,在作为通知的方法上添加通知类型的注解,并使用切入点表达式来配置内容
测试:
package com.xx.Test;import com.xx.AOP.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestAop {@Testpublic void testAop(){ApplicationContext context =new ClassPathXmlApplicationContext("AOP.xml");User user = context.getBean("user", User.class);user.add();}
}/*
before.......
add.....
*/
注:其他类型通知注解
后置通知:@After
异常通知:@AfterThrowing(当增强方法的过程中有异常才执行)
最终通知:@AfterReturning
环绕通知:@Around
注:环绕通知中必须传入ProceedingJoinPoint对象,调用其proceed()方法来手动执行切入点,否则什么也不执行
5.公共切入点抽取
6. 有多个增强类对同一个方法进行增强,设置增强类的优先级
比如再创建一个类对User.add()方法进行增强
package com.xx.AOP;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;@Component
@Aspectpublic class PersonProxy {@Before(value = "execution(* com.xx.AOP.User.add())")public void Before(){System.out.println("PersonProxy.before.......");}
}
(1)在增强类的上面添加注解 @Order(数字类型值),数字类型值越小,则优先级越高
则测试结果为:
四、AOP操作(AspectJ配置文件)
1.创建两个类,增强类和被增强类,创建方法
2.在Spring配置文件中创建两个类对象
3.在Spring配置文件中配置切入点
<?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.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><!--创建对象--><bean id="book" class="com.xx.AOPxml.Book"></bean><bean id="bookProxy" class="com.xx.AOPxml.BookProxy"></bean><!--配置AOP的增强--><aop:config><!--配置切入点--><!--id:切入点名称expression:切入点表达式(需要被增强的方法的类型及路径)--><aop:pointcut id="point" expression="execution(* com.xx.AOPxml.Book.buy(..))"/><!--配置切面--><aop:aspect ref="bookProxy"><!--配置作用在具体的方法上--><!--即 将增强类中的 method 以哪种通知类型 体现在哪个 切入点(pointcut-ref)上--><aop:before method="before" pointcut-ref="point"></aop:before></aop:aspect></aop:config>
</beans>
测试:
public void testAOPxml(){ApplicationContext context = new ClassPathXmlApplicationContext("AopXml.xml");Book book = context.getBean("book", Book.class);book.buy();
}
结果:
注:也可以创建配置类使用完全注解方式来实现增强功能,不需要创建xml文件
Spring5框架—— AspectJ相关推荐
- Spring5 框架
Spring5 框架 一.Spring概述 Spring是轻量级的开源的JavaEE框架. Spring可以解决企业应用开发的复杂性. Spring有两个核心部分:IOC和AOP. IOC:控制反转, ...
- 001 spring5框架:java类工程,IOC:实体类表示表关系,AOP,JdbcTemplate模板,事务操作,Spring5 框架新功能:日志,为空注解,函数式风格,juint,Webflux
1. Spring5 框架(Spring5 Framework)介绍 1.1 概念 1.Spring 是轻量级的开源的 JavaEE 框架 2.Spring 可以解决企业应用开发的复杂性 3.Spri ...
- Spring5框架学习
Spring5框架学习 备注:视频来源于尚硅谷 - Spring 5 框架最新版教程(idea版):https://www.bilibili.com/video/BV1Vf4y127N5 Spring ...
- Java总结:Spring5框架(1)
Spring5框架(1) 一:什么是Spring? Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用 ...
- Spring5 框架新功能(Webflux)
目录 1.SpringWebflux 介绍 2.响应式编程(Java 实现) 3.响应式编程(Reactor 实现) 1.SpringWebflux 介绍 (1)SpringWebflux 是 Spr ...
- Spring5框架-IOC容器
Spring5框架 Spring包下载快照 一.Spring简绍 1什么是Spring 1.Spring是轻量级的开源的JAVAEE框架,可以解决企业应用开发的复杂性 2.Spring有两个核心的部分 ...
- Java系列技术之Spring5框架-钟洪发-专题视频课程
Java系列技术之Spring5框架-33人已学习 课程介绍 Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个 ...
- Spring5 框架概述 、IOC 容器
一.Spring5 框架概述 介绍 Spring 是轻量级的开源的 JavaEE 框架 Spring 可以解决企业应用开发的复杂性 Spring 有两个核心部分:IOC 和 Aop (1)IOC:控制 ...
- Spring5框架(上) IOC
Spring5框架 IOC 前言 Spring框架概述 IOC容器 底层原理 Bean管理XML方式(创建对象和set注入属性) 注入集合类型属性1 IOC操作Bean管理 Bean管理(工厂Bean ...
最新文章
- Tesseract-OCR 3.04简单使用举例(读入图像输出识别结果)
- Flink1.4.0连接Kafka0.10.2时遇到的问题
- linux socket 时间,Socket编程获取服务器时间
- python爬取贴吧所有帖子-Python爬虫实例(一)爬取百度贴吧帖子中的图片
- mybaits二十一:2缓存介绍
- CCAI 2017 中国人工智能大会 6.4 折抢票倒计时!
- 万字长文教你看懂java G1垃圾回收日志
- 使用halcon将一个圆上的点拟合成圆形并且求出圆心
- Object.prototype 原型和原型链
- 谷歌(Google)是怎样对待离世的Google员工的?
- 月入过万的副业你要不要?不需要编程知识,不限男女,不限学历
- java读写mysql数据库_Java读写MySQL数据库小实例
- IntelliJ IDEA 2018 汉化补丁
- 圣杯布局——针对前端小白篇
- linux php5.3安装教程,Linux下安装MySql+Apache2+PHP5.3.1教程_PHP教程
- 2022: Python下载安装教程
- 预加重、去加重和均衡
- hdu6287 口算训练
- R329开发板系列教程之二|实机运行aipu程序
- 深井冰!沙雕码农脑洞大,盘点Github上那些不忍直视奇葩脑回路的沙雕项目!
热门文章
- php 反射 thinkphp,PHP反射(ReflectionClass、ReflectionMethod)在ThinkPHP框架的控制器调度模块中的应用...
- Android Studio的Logcat/Run/Terminal/Build等窗口没有了怎么调出
- 接口返回统一数据格式
- 微软对联软件遭质疑 网友称恶搞中国文化
- 最全的Matlab经典教程免费下载学习
- 网站设计的思考(藏)
- C/C++黑洞陷阱(Kaprekar问题)
- 讲真话、求真知、做真我——Facebook COO桑德伯格2012哈佛商学院毕业演讲
- 小王子(LCA的运用)
- 豌豆淘谈护肤:豌豆淘讲解肤质分类,不了解肤质谈何护肤?