收集了几个常用的方面:
NoCallsIntoTestFromOutside 禁止从产品包到测试包的引用
public abstract aspect NoCallsIntoTestFromOutside {
//引用带有test的包的所有可能操作
pointcut referToTestPackage():
call(* *..test..*.*(..)) || call(*..test..*.new(..))
|| get(* *..test..*.*) || set(* *..test..*.*)
|| get(*..test..* *) || set(*..test..* *)
|| (staticinitialization(!*..test..*)
&& staticinitialization(*..test..*+))
|| call(* *(*..test..*, ..))
|| call(* *(*, *..test..*, ..))
|| call(* *(*, *, *..test..*))
|| call(* *(.., *..test..*))
|| execution(* *(*..test..*, ..))
|| execution(* *(*, *..test..*, ..))
|| execution(* *(*, *, *..test..*, ..))
|| execution(* *(.., *..test..*))
;
// getcode scary-tests END
abstract protected pointcut withinTypes();
pointcut fromWithinNonTest(): within(!*..test..*);
declare error: withinTypes() && referToTestPackage()
&& fromWithinNonTest(): "production code referring to test code";
}
UtilityClassEnforced 禁止构造实用工具类
public aspect UtilityClassEnforced {
declare error :
//定义非private 的构造器
execution(!private (@UtilityClass *).new(..))
//调用new 初始化方法
|| call((@UtilityClass *).new(..))
//执行工具类的任何方法
|| execution((@UtilityClass *) *(..))
: "no instances of utility classes";
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface UtilityClass {
}
NoSystemOut 禁止使用 System.err 或 System.out
public abstract aspect NoSystemOut {
abstract protected pointcut withinTypes;
//读取System.out对象
declare error: withinTypes() && get(PrintStream System.out) : "no System.out";
//读取System.err对象
declare error: withinTypes() && get(PrintStream System.err) : "no System.err";
//读取FileDescriptor.err
declare error: withinTypes() && get(PrintStream FileDescriptor.err) : "no FileDescriptor.err";
//读取FileDescriptor.out
declare error: withinTypes() && get(PrintStream FileDescriptor.out) : "no FileDescriptor.out";
//执行Throwable.printStackTrace()方法
declare error: withinTypes() && call(void Throwable.printStackTrace()) : "no System.err";
}
GetterSetter 禁止在除初始化或 getter 方法以外进行字段读取操作,禁止在初始化或 setter 方法以外进行字段写操作
public abstract aspect GetterSetter {
abstract protected pointcut withinTypes();
//所有的sets 非public fields
pointcut sets() : set(!public * *);
//所有的gets 非public fields
pointcut gets() : get(!public * *);
declare error : withinTypes() && gets() &&
//在get*方法或者构造器以外地方使用
!(withincode(!void get*()) || withincode(new(..)))
: "non-public field-get outside constructor or getter method";
declare error : withinTypes() && sets() &&
!(withincode(void set*(*)) || withincode(new(..)))
: "non-public field-set outside constructor or setter method";
}
NoNullParameters 在公共方法传递空参数时抛出异常
public abstract aspect NoNullParameters {
abstract protected pointcut withinTypes();
pointcut publicParameters() :
//执行public 构造器或者public 方法
(execution(public new(*,..)) || execution(public * *(*,..)))
//除了执行非Object的参数,如原类型,int,long
&& !(execution(* *(!Object+)) || execution(*.new(!Object+)));
//如果参数为null,则抛出例外
before() : withinTypes() && publicParameters() {
Object[] args = thisJoinPoint.getArgs();
for (int i = 0; i < args.length; i++) {
if (null == args[i]) {
JoinPoint.StaticPart sp = thisJoinPointStaticPart;
String name = AJReflect.getParameterName(sp, i);
throw new IllegalArgumentException("null " + name);
}
}
}
}
分享到:
相关推荐
在学习AspectJ时,有几个关键概念是必须掌握的: 1. **切面(Aspect)**:切面是AspectJ的核心,它封装了系统中的一个关注点,例如数据验证、事务管理等。切面由通知(advice)、切点(pointcut)和引入...
主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...
总结,Spring结合AspectJ实现AOP的前置通知,能够帮助我们优雅地处理横切关注点,提高代码的可读性和可维护性。通过配置AOP,定义切面,设置前置通知,并使用合适的切入点表达式,我们可以实现对特定方法执行前的...
AspectJ是Java平台上的一个开源AOP框架,提供了丰富的语法来定义切面。本教程将探讨如何在Spring中结合AspectJ实现AOP,包括基于XML配置和基于注解的方式。 **一、AOP基本概念** AOP的核心概念有切面(Aspect)、...
在Spring中,我们可以使用AspectJ来实现AOP,AspectJ是一个强大的AOP框架,它可以与Spring无缝集成,提供更细粒度的控制。 首先,让我们了解一下AOP中的通知类型: 1. **前置通知**(Before Advice):在目标方法...
本篇文章将深入探讨如何利用Spring的@AspectJ注解来实现AOP,这是一个入门级别的例子,旨在帮助开发者理解并掌握这一关键特性。 首先,我们要明白什么是AOP。面向切面编程是一种编程范式,它允许程序员定义“切面”...
如果你使用的是编译时织入,你需要使用AspectJ的maven或gradle插件来编译代码;如果是运行时织入,则不需要额外配置,只需确保Spring加载了切面类。 5. **测试事务控制**:编写单元测试或者集成测试来验证事务的...
AspectJ是一种广泛使用的Java语言的面向切面编程(AOP)扩展。它允许开发者将关注点模块化,使得系统中的交叉切面(如日志、...对于大型复杂项目,AspectJ是一个强大的工具,帮助实现关注点的分离,从而优化软件架构。
6. **编织增强(Advising Enhancements)**:AspectJ允许在已有的类和接口上添加方法、字段和初始化代码,实现对已有代码的无侵入式增强。 7. **集成其他Java框架**:AspectJ可以与Spring框架无缝集成,进一步简化...
AspectJ是一个独立的AOP框架,它提供了一种静态类型的、基于Java的语言扩展,允许开发者定义切面、通知(advises)和连接点(join points)。它不仅支持Spring框架,还可以独立于Spring使用。 1. **切面(Aspects)...
例如,日志记录可以作为一个切面来实现,而不是在每个需要记录日志的方法中添加重复的代码。 【源码】在学习和理解AspectJ的过程中,查看其源码能够帮助我们深入理解其工作原理。AspectJ的源码通常包含了对AOP概念...
在AspectJ中,可以声明的连接点包括方法调用、方法执行、构造器调用、构造器执行、字段获取、字段设置、初始化代码块、静态初始化代码块和异常处理器代码块等。 Pointcut是AspectJ中用于捕获一组特定连接点的表达式...
在Spring AOP框架中,AspectJ被广泛用于实现更精细粒度的切面逻辑,提供比Spring默认的基于代理的AOP更为强大的功能。 首先,我们要理解什么是面向切面编程。传统的面向对象编程(OOP)将代码组织为类和方法,而切...
总之,`aspectj-1.6.9.jar` 是一个关键的组件,它使得Java开发者能够利用AspectJ框架实现面向切面编程,提高代码的可读性和可维护性。在项目中引入这个库,可以有效地管理和组织应用程序中的横切关注点,提升整体...
- **用方面进行代码跟踪**:通过具体案例展示了如何使用AspectJ来进行代码跟踪。 **3.5 用于产品的方面** - **Bean方面**:展示了如何使用AspectJ来增强Bean的行为。 - **Subject-Observer协议**:通过案例展示了...
AspectJ 作为静态AOP框架,提供了一种高效且声明式的切面编程方式,它允许在编译时将切面逻辑织入代码,增强了代码的可维护性和复用性。通过理解切点、通知、织入等概念,开发者可以更有效地实现横切关注点的分离,...
标题"AspectJ面向切面的例子"指的是通过AspectJ实现的一个实际项目,这个例子是一个名为"Spacewar"的小游戏。在"Spacewar"游戏中,我们可以看到AspectJ如何被用来处理游戏中的各种横切关注点,比如游戏状态记录、...
总之,"Spring框架(6)AspectJ实现AOP共7页.pdf.zip"这份资料详细介绍了如何在Spring中使用AspectJ进行AOP编程,内容涵盖了切面、切点、通知、织入等多个关键概念,对于理解和实践Spring AOP具有很高的参考价值。...
AspectJ 是一个强大的Java语言的面向切面编程实现。它允许开发者在不修改源代码的情况下,通过切面(Aspect)来表达横切关注点,如日志、事务管理、性能监控等。AspectJ 提供了静态和动态两种织入方式,静态织入在...