SpringAop-1.AspectJ起步

本文通过具体示例介绍如何使用AspectJ实现面向切面编程(AOP)。包括AspectJ的基本语法、切面、切点、通知等概念及应用。通过Hello和World类及权限验证切面展示如何不修改原有代码就能增加新功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.aspectJ编译运行的命令与java类似:(cmd可运行)

  aspectJ文件已.aj或.java保存均可

         java                        |                 aspectJ

编译      javac -d . Xxx.java(*.java)           |            ajc -d .  Xxx.aj(Xxx.java)           
运行                                              java package.Xxx


2.aspectJ示例

两个方法类:(Hello.java World.java)

package codeEETest;
public class Hello
{
	// 定义一个简单方法,模拟应用中的业务逻辑方法
	public void foo()
	{
		System.out.println("执行Hello组件的foo()方法");
	}
	// 定义一个addUser()方法,模拟应用中的添加用户的方法
	public int addUser(String name , String pass)
	{
		System.out.println("执行Hello组件的addUser添加用户:" + name);
		return 20;
	}
}
package codeEETest;
public class World
{
	// 定义一个简单方法,模拟应用中的业务逻辑方法
	public void bar()
	{
		System.out.println("执行World组件的bar()方法");
	}
}

切面(AuthAspect.aj)

package codeEETest;
public aspect AuthAspect
{
	// 指定在执行...包中任意类的、任意方法之前执行下面代码块
	// 第一个星号表示返回值不限;第二个星号表示类名不限;
	// 第三个星号表示方法名不限;圆括号中..代表任意个数、类型不限的形参
	before(): execution(* codeEETest.*.*(..))
	{
		System.out.println("模拟进行权限检查...");
	}
}

测试:

package codeEETest;
public class AspectJTest
{
	public static void main(String[] args)      //方法1
	{
		Hello hello = new Hello();
		hello.foo();                        //方法2
		hello.addUser("孙悟空" , "7788");
		World world = new World();
		world.bar();                        //方法3
	}
}
说明:上边的切面表达式表示执行该包下的任意方法都会先执行权限检查。

模拟进行权限检查...                //mian方法前的检查
模拟进行权限检查...                //foo方法前
执行Hello组件的foo()方法
模拟进行权限检查...                //addUser方法前
执行Hello组件的addUser添加用户:孙悟空
模拟进行权限检查...                //bar方法前
执行World组件的bar()方法

3.AspectJ的说明

编写AspectJ类,注意关键字为aspect(MyAspectJDemo.aj,其中aj为AspectJ的后缀),含义与class相同,即定义一个AspectJ的类

/**
 * Created by zejian on 2017/2/15.
 * Blog : http://blog.youkuaiyun.com/javazejian [原文地址,请尊重原创]
 * 切面类
 */
public aspect MyAspectJDemo {
    /**
     * 定义切点,日志记录切点
     */
    pointcut recordLog():call(* HelloWord.sayHello(..));

    /**
     * 定义切点,权限验证(实际开发中日志和权限一般会放在不同的切面中,这里仅为方便演示)
     */
    pointcut authCheck():call(* HelloWord.sayHello(..));

    /**
     * 定义前置通知!
     */
    before():authCheck(){
        System.out.println("sayHello方法执行前验证权限");
    }

    /**
     * 定义后置通知
     */
    after():recordLog(){
        System.out.println("sayHello方法执行后记录日志");
    }
}

    AspectJ是一个java实现的AOP框架,它能够对java代码进行AOP编译(一般在编译期进行),让java代码具有AspectJ的AOP功能(当然需要特殊的编译器),可以这样说AspectJ是目前实现AOP框架中最成熟,功能最丰富的语言,更幸运的是,AspectJ与java程序完全兼容,几乎是无缝关联,因此对于有java编程基础的工程师,上手和使用都非常容易。

    在案例中,我们使用aspect关键字定义了一个类,这个类就是一个切面,它可以是单独的日志切面(功能),也可以是权限切面或者其他,在切面内部使用了pointcut定义了两个切点,一个用于权限验证,一个用于日志记录,而所谓的切点就是那些需要应用切面的方法,如需要在sayHello方法执行前后进行权限验证和日志记录,那么就需要捕捉该方法,而pointcut就是定义这些需要捕捉的方法(常常是不止一个方法的),这些方法也称为目标方法,最后还定义了两个通知(advise,增强处理),通知就是那些需要在目标方法前后执行的函数,如before()即前置通知在目标方法之前执行,即在sayHello()方法执行前进行权限验证,另一个是after()即后置通知,在sayHello()之后执行,如进行日志记录。到这里也就可以确定,切面就是切点通知的组合体,组成一个单独的结构供后续使用。


AOP的作用:

    开发者无需修改源代码,又可以为组件的方法添加新的功能。

   http://blog.youkuaiyun.com/javazejian/article/details/56267036点击打开链接


AOP术语:

(1)切面 (Aspect):组织多个Advise

(2)连接点 (Joinpoint):方法的调用或异常的抛出,Spring AOP中总是方法的调用

(3)增强处理/通知 (Advise):见下文。

(4)切入点 (Pointcut):可以插入增强处理的连接点。即当连接点被添加增强处理,连接点就变成了切入点。

         切入点表达式是AOP核心。Spring模式使用AspectJ风格的表达式。


(5)目标对象:被增强处理的对象。

(6)AOP代理:代理就是目标对象的加强。Spring AOP代理可以是JDK动态代理,也可以是cglib代理。AspectJ是静态AOP代理(.class文件会被改掉)。

(7)织入(weaving):将增强处理添加到目标对象中。织入的两种方式:编译时增强(如:AspectJ)和运行时增强(纯javaAOP,如Spring AOP)。


AOP代理就是由AOP框架动态生成一个对象,该对象作为目标对象使用,包含了目标对象的全部方法。AOP方法在特定的切入点添加增强处理,并回调目标方法的对象。


AOP代理的方法:

AOP框架织入的增强处理---->回调目标对象的方法---->AOP框架织入的增强处理


术语详解:

(1)Pointcut,定义切点,后面跟着函数名称,最后编写匹配表达式,此时函数一般使用call()或者execution()进行匹配,这里我们统一使用call()

pointcut recordLog():call(* HelloWord.sayHello(..));
(2) Advise 有5种类型分别如下:

  • before 目标方法执行前执行,前置通知
  • after 目标方法执行后执行,后置通知
  • after returning 目标方法返回时执行 ,后置返回通知
  • after throwing 目标方法抛出异常时执行 异常通知
  • around 在目标函数执行中执行,可控制目标函数是否执行,环绕通知
 after():recordLog(){
     System.out.println("sayHello方法执行后记录日志");
 }


资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值