详解在Spring中如何使用AspectJ来实现AOP

作者:deniro 时间:2021-10-23 02:06:06 

AspectJ 是通过注解来描述切点与增强的。

1 开发环境要求

因为要使用注解,所以请确保使用的 Java5.0 及以上版本。

引入 AspectJ 相关类库:


<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>${aopalliance.version}</version>
</dependency>

2 编程方式

@Aspect//标识切面


public class PreRentAspect {
/**
 * 增强逻辑
 */
@Before("execution(* rent(..))")//定义切点与增强类型
public void beforeRent() {
 System.out.println("开始执行租赁动作");
}
}

这个切面只是一个普通的 POJO,只不过加了 @Aspect 注解。

@Before("execution(* rent(..))") 中的 @Before 表示增强类型是前置增强,它的内容是 @AspectJ 切点表达式,这里表示的是在目标类的 rent() 方法上织入增强, rent() 可以包含任意入参和任意的返回值。

带  @Aspect 的类,通过注解与代码,将切点、增强类型和增强的横切逻辑整合到了一起,是不是很方便呀O(∩_∩)O哈哈~

单元测试:


AspectJProxyFactory factory = new AspectJProxyFactory();

//设置目标类
factory.setTarget(new User());

//添加切面类
factory.addAspect(PreRentAspect.class);

User proxy = factory.getProxy();
String userId = "001";
proxy.rent(userId);
proxy.back(userId);

输出结果:

--开始执行租赁动作--
User:租赁【充电宝】
User:归还【充电宝】

3 配置方式


<!-- 目标类-->
<bean id="user" class="net.deniro.spring4.aspectj.User"/>

<!-- 切面类-->
<bean class="net.deniro.spring4.aspectj.PreRentAspect"/>

<!-- 自动创建代理-->
<bean
 class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/>

单元测试:


ApplicationContext context = new ClassPathXmlApplicationContext(spring.xml");
User user = (User) context.getBean("user");
String userId = "001";
user.rent(userId);
user.back(userId);

输出结果与编程方式完全相同。

也可以基于 Schema 的 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-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

<!--aspectj 驱动器 -->
<aop:aspectj-autoproxy/>

<!-- 目标类-->
<bean id="user" class="net.deniro.spring4.aspectj.User"/>

<!-- 切面类-->
<bean class="net.deniro.spring4.aspectj.PreRentAspect"/>
</beans>

这样的配置更加简洁。其实在 <aop:aspectj-atuoproxy/> 内部已经采用了自动代理模式啦 O(∩_∩)O哈哈~

<aop:aspectj-atuoproxy/> proxy-target-class 属性,默认为 false ,表示使用 JDK * 技术织入增强;此值为 true 则表示使用 CGLib * 技术织入增强 。 如果目标类没有声明接口,那么即使  proxy-target-class 设置为 false,也会自动使用 CGLib * 织入增强的哟O(∩_∩)O哈哈~

基于 Java5.0+ 的项目,建议使用 AspectJ 来配置切点与增强,因为这样更简洁、也更直接。

来源:https://www.jianshu.com/p/abf28c0a15b0

标签:Spring,AspectJ,AOP
0
投稿

猜你喜欢

  • java实现简单的俄罗斯方块

    2021-08-02 18:13:11
  • Java中的functor实现

    2023-11-26 08:30:50
  • c# 防火墙添加/删除 特定端口的示例

    2023-12-22 21:56:41
  • springboot 返回json格式数据时间格式配置方式

    2023-12-17 23:27:10
  • C#泛型概念的简介与泛型的使用

    2023-10-12 05:13:02
  • java实现用户自动登录

    2023-11-10 14:38:59
  • Java Swing组件文件选择器JFileChooser简单用法示例

    2021-09-23 21:00:34
  • Java基础入门总结之序列化和反序列化

    2023-02-19 03:29:10
  • Android+SQLite数据库实现的生词记事本功能实例

    2023-06-18 10:41:35
  • Java实现接月饼小游戏的示例代码

    2022-08-16 03:26:06
  • Java编程实现轨迹压缩之Douglas-Peucker算法详细代码

    2023-11-29 15:25:47
  • MyBatis自定义类型转换器实现加解密

    2023-09-10 20:18:00
  • Android深入浅出之Binder机制

    2021-07-06 01:47:21
  • C#操作INI文件的辅助类IniHelper

    2022-04-18 07:55:34
  • C#实现将DataTable内容输出到Excel表格的方法

    2023-05-01 15:20:38
  • Java微信公众平台开发(14) 微信web开发者工具使用

    2023-01-30 19:21:34
  • 如何将默认的maven仓库改为阿里的maven仓库

    2022-09-30 14:16:31
  • Android原生视频播放VideoView的使用

    2022-10-13 08:33:07
  • c#使用filesystemwatcher监视文件系统的变化

    2022-08-06 15:28:43
  • Android实现点击某个按钮指定位置弹出布局

    2023-04-10 16:09:59
  • asp之家 软件编程 m.aspxhome.com