欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring AOP面向切面编程

程序员文章站 2022-06-04 22:23:50
...

在开始AOP编程之前,先下载eclipse插件:https://blog.csdn.net/u010513756/article/details/51804190
安装插件可能需要很久,需要耐心等待。

使用AspectJ实现AOP:
AspectJ是Java语言的一个AOP实现,其包含两个部分:定义AOP编程中的语法规范和工具如编译器、调试工具等,即使不用Spring框架,也可以直接使用AspectJ进行AOP编程:
案例分析:
1.创建Hello程序:

public class Hello {
	public void deleteUser(Integer id){
		System.out.println("执行Hello组件的deleteUser删除用户:"+id);
	}
	public int addUser(String name,String password){
		System.out.println("执行组件的addUser添加用户:"+name);
		return 1;
	}
}

2.创建Aspect类:

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

3.创建测试类:

public class AspectJTest {
	public static void main(String[] args){
		Hello hello=new Hello();
		hello.addUser("孙悟空", "7788");
	}
}

运行代码,输出:

模拟进行全新检查
模拟进行全新检查
执行组件的addUser添加用户:孙悟空

因为测试代码处理spring包下,在执行main方法之前会调用切面程序,所以会输出两次,AuthAspect 是在执行方法前执行,若在执行方法后执行可使用下面代码:

public aspect AuthAspect {
	//定义一个Pointcut,名为logPointcut,可实现复用
	pointcut logPointcut() :execution(* spring.*.*(..));
	after(): logPointcut(){
		System.out.println("模拟记录日志");
	}
}

测试代码不变,执行程序将输出:

执行组件的addUser添加用户:孙悟空
模拟记录日志
模拟记录日志

若需要在执行方法前启动事务,方法执行完毕后关闭事务,可用下面代码:

public aspect AuthAspect {
	Object around():call(* spring.*.*(..)){
		System.out.println("模拟开启事务...");
		//回调原来的目标方法
		Object object=proceed();
		System.out.println("模拟结束事务...");
		return object;
	}
}

执行测试程序输出:

模拟开启事务...
执行组件的addUser添加用户:孙悟空
模拟结束事务...

Object object=proceed();表示回调原来的目标方法,这样位于proceed()代码之前得代码就会被添加到目标方法之前,位于proceed()之后的代码就会被添加到目标方法之后,使用反编译插件查看Hello.class文件,可以看到该文件增加了许多内容,因此AspectJ被称为编译时增强的AOP框架,AOP实现可分为两类:静态AOP实现(编译时更改class文件)和动态AOP实现(在内存中以JDK动态代理或cglib动态生成AOP代理类,以Spring AOP为代表)。

AOP的基本概念:
AOP框架并不与特定的代码耦合,AOP框架能处理程序执行中特定的切入点(Pointcut),而不与某个具体类耦合,其有两大特征:各步骤之间有良好的隔离性和源代码无关性。
下面介绍下面向切面编程的一些术语:
1.增强处理(Advice):AOP框架在特定的切入点执行的增强处理,,处理由around、before、after等类型
2.连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或异常的抛出,在Spring AOP中,连接点总是方法的调用
3.切入点(Pointcut):可以插入增强处理的连接点,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变成了切入点
4.切面(Aspect):切面用于组织多个Advice,Advice放在切面中定义
5.引入:将方法或字段添加到处理的类中
6.目标对象:被AOP框架进行增强处理的对象
7.AOP代理:AOP框架创建的对象,
8.织入(Weaving):将增强处理添加到目标对象中

Spring的AOP支持:
Spring中的AOP代理由Spring的IoC容器负责生成、管理,依赖关系也由IoC容器负责管理。因此AOP代理可以直接使用容器中的其他Bean实例作为目标,这种关系可由IoC容器的依赖注入提供,Spring默认使用Java动态代理创建AOP代理,从而可以为任何借口实例创建代理。Spring也可以使用cglib代理,在需要代理类而不是代理接口的时候,Spring会自动切换为使用cglib代理。Spring AOP使用纯Java实现,不需要特定的编译工具,Spring AOP也不需要控制类装载器层次,因此在Java Web应用服务器中运行良好。如果需要把对成员变量的访问和更新也作为增强处理的连接点,可以考虑使用AspectJ。