AspectJ

前几天学了AspectJ,今天来做做学习笔记。

1、定义:

  AspectJ是一个基于java语言的AOP框架,它提供了强大的AOP功能。Spring2.0后,Spring AOP引入对AspectJ的支持,并允许直接使用AspectJ进行编程,而Spring自身的AOP API也尽量与AspectJ保持一致。使用AspctJ实现AOP有两种方式:一种是基于XML的生命是AspectJ,另一种是基于注解的声明式AspectJ

2、实现方式:

   第一种是基于XML声明式的AspectJ,代码较多(记得要导入jar包哦!)。

 结构图:

 

   首先,我们先创建一个接口,里面包含添加用户和删除用户的两个方法。

package com.itheima.jdk;

public interface UserDao {
 public void addUser();
 public void deleteUser();
}
   然后创建一个类实现这个接口
package com.itheima.jdk;

import org.springframework.stereotype.Repository;
@Repository("userDao")
public class UserDaoImpl implements UserDao {
	@Override
	public void addUser() {
		// TODO Auto-generated method stub
		System.out.println("添加用户");
	}
	@Override
	public void deleteUser() {
		// TODO Auto-generated method stub
		System.out.println("删除用户");
	}
}

   接着,我们先创建一个名为MyAspect的类,里面模拟了5种通知的方法

package com.itheima.aspectj.xml;

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

public class MyAspect {
	//前置通知
   public void myBefore(JoinPoint joinPoint)
   {   
	   System.out.print("基于XML声明式的AspectJ\n"+"author:Black_YeJing\n");
	   System.out.println("");
	   System.out.println("前置通知:模拟执行权限检查...,");
	   System.out.println("目标类是:"+joinPoint.getTarget());
	   System.out.println(",被植入增强处理的目标方法为:"+joinPoint.getSignature().getName());
   }
   //后置通知
   public void myAfterReturning(JoinPoint joinPoint)
   {
	   System.out.println("后置通知:模拟记录日志....,");
	   System.out.println("被植入增强处理的目标方法为:"+joinPoint.getSignature().getName());
   }
   /**
    * 环绕通知
    * ProceedingJoinPoint是JoinPoint子借口,表示可以执行目标方法
    * 1、必须是Object类型的返回值
    * 2、必须接受一个参数,类型为ProcessdingJoinPoint
    * 3、必须throws Throwable
    */
   public Object myAround(ProceedingJoinPoint proceedingJoinPoint)throws Throwable
   {
	   //开始
	   System.out.println("环绕开始:执行目标方法之前,模拟开启事务");
	   //执行当前目标方法
	   Object obj=proceedingJoinPoint.proceed();
	   //结束
	   System.out.println("环绕结束:执行目标方法之后,模拟关闭事务....");
	return obj;
   }
   //异常通知
   public void myAfterThrowing(JoinPoint joinPoint,Throwable e)
   {
	   System.out.println("异常通知:"+"出错了"+e.getMessage());
   }
   //最终通知
   public void myAfter()
   {
	   System.out.println("最终通知:模拟方法结束后的释放资源");
   }
   
}

   最后写一个测试类TestXmlAspectj.java

package com.itheima.aspectj.xml;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.itheima.*;
import com.itheima.jdk.UserDao;
public class TestXmlAspectj {
  public static void main(String[] args) {
	String xmlPath="com/itheima/aspectj/xml/applicationContext.xml";
	ApplicationContext context=new ClassPathXmlApplicationContext(xmlPath);
	UserDao userDao=(UserDao)context.getBean("userDao");
	userDao.addUser();
	userDao.deleteUser();
}
}
   运行结果:

         图(3-1)

 总结:从图(3-1)可以看出,使用基于XML的声明式AspectJ已经实现了AOP开发

        ps:下一篇将介绍AspectJ的第二种开发模式:基于注解的声明式开发。

<think>好的,用户想了解AspectJ的使用教程或官方文档。首先,我需要整理现有的引用信息,看看有哪些可用的资源。根据引用内容,用户可能对在Android或Spring中使用AspectJ感兴趣,或者如何引入依赖。 首先,引用[1]提到在Android中直接引入AspectJ的方式,引用[2]和[3]讨论了Spring AOP与AspectJ的结合,引用[4]给出了添加依赖的示例。用户可能需要基础教程和官方文档的指引。 我应该分步骤回答,先介绍AspectJ的基本概念,再讲解使用方式,包括依赖配置、切面编和编译配置。然后提供官方文档链接和相关教程资源。同时,根据引用内容,需要区分在Spring和Android中的不同使用方法,避免混淆。 需要确保回答结构清晰,符合用户要求的系统级指令,比如正确使用LaTeX格式,不过这里可能用不上数学公式。但要注意中文回答,生成相关问题,并正确添加引用标识。最后,生成的相关问题应该围绕AspectJ的应用场景、依赖注入、与Spring AOP的区别等,帮助用户深入理解。</think>### AspectJ 使用教程及官方文档指引 #### 一、AspectJ 简介 AspectJ一个面向切面编程(AOP)的扩展工具,通过增强 Java 语法(如注解、切入点表达式等)实现代码的横向关注点分离。它支持编译时编织(CTW)和加载时编织(LTW),适用于日志、事务、权限控制等场景[^2][^3]。 --- #### 二、AspectJ 使用步骤 ##### 1. 添加依赖 在 Maven 项目中引入 AspectJ 核心依赖: ```xml <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.6</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.5</version> </dependency> ``` 引用自依赖配置示例[^4]。 ##### 2. 编切面类 使用 `@Aspect` 注解定义切面,结合 `@Pointcut` 和 `@Around` 等注解实现逻辑: ```java @Aspect public class LoggingAspect { @Pointcut("execution(* com.example.service.*.*(..))") public void serviceMethods() {} @Around("serviceMethods()") public Object logMethod(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("方法执行前: " + joinPoint.getSignature()); Object result = joinPoint.proceed(); System.out.println("方法执行后"); return result; } } ``` ##### 3. 配置编织方式 - **编译时编织**:通过 AspectJ 编译器(`ajc`)在编译阶段织入切面。 - **加载时编织**:在 JVM 启动时添加参数 `-javaagent:aspectjweaver.jar` 实现动态织入。 --- #### 三、AspectJSpring 与 Android 中的使用 1. **Spring 集成** Spring AOP 默认使用动态代理,而 AspectJ 提供更强大的功能(如非 Spring 管理对象的注入)。需在配置中启用 `@EnableAspectJAutoProxy`。 2. **Android 应用** 通过 Gradle 插件(如 `aspectj-tools`)配置编译时编织,直接引入 AspectJ 依赖并定义切面逻辑[^1]。 --- #### 四、官方文档与资源 1. **AspectJ 官方文档** 访问 [AspectJ 官网](https://www.eclipse.org/aspectj/) 获取完整语法和示例。 2. **教程推荐** - [AspectJ 编程指南](https://www.eclipse.org/aspectj/doc/released/progguide/index.html) - [SpringAspectJ 整合文档](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop-using-aspectj) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值