Spring学习(5)AOP概述和关键术语

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SDDDLLL/article/details/86614759

AOP是面向切面编程的意思。比如说我们在bean的某一个方法前后添加一些自己的方法,进行处理,这就是切面编程,把自己的方法嵌入到bean方法的前后。

举一个例子。

我们有一个系统类:

public class SystemService {
	
	public static void doLog() {
		System.out.println("执行日志代码");
	}

	public static void doTx() {
		System.out.println("执行事务代码");
	}

}

然后我们就可以在自己的bean中去使用这些系统类中的方法:

public class SomeServiceImpl implements ISomeService {
	
	//主业务逻辑
	public void doFirst() {
        //交叉业务逻辑代码
		SystemService.doTx();
		System.out.println("doFirst");
        //交叉业务逻辑代码
		SystemService.doLog();
	}	
	//主业务逻辑
	public void doSecond() {
		SystemService.doTx();
		System.out.println("doSecond");
		SystemService.doLog();
	}

}

我们发现这种实现方式有一个弊端,如果我们的bean还要继承自其他的类怎么办呢?(java不支持多继承)。现在有一种解决办法,我们把这些交叉业务逻辑代码放在配置文件中,我们的bean需要用的时候把这些交叉业务逻辑代码拿过来用即可。

在这里需要用到的技术那就是动态代理。这是因为在动态代理中我们可以在一个方法的前后进行操作。

package com.fdd.test;

public class MyTest {
	
	public static void main(String[] args) {
		final ISomeService target = new SomeServiceImpl();
		ISomeService service=(ISomeService) Proxy.newProxyInstance(
				target.getClass().getClassLoader(), 
				target.getClass().getInterfaces(),
				//织入
				new InvocationHandler() {
					
					public Object invoke(Object proxy, Method method, Object[] args)
							throws Throwable {
						//这个方法就是切面
						SystemService.doTx();
						//这个方法是主业务逻辑,也就是下面执行的doFirst和doSecond
						Object result=method.invoke(target, args);
						//这个方法就是切面
						SystemService.doLog();
						System.out.println("==========");
						return result;
					}
				});
		service.doFirst();
		service.doSecond();
	}

}

此时我们的bean就没有交叉业务逻辑的代码了:

public class SomeServiceImpl implements ISomeService {

	public void doFirst() {
		System.out.println("doFirst");
	}

	public void doSecond() {
		System.out.println("doSecond");
	}

}

以上我们认识了AOP是什么。接下来正式的看一看AOP

一、简介

从上面的代码看到,AOP底层其实是采用了动态代理的方式去实现的。这采用了两种代理:JDK的动态代理与CGIB的动态代理。

比如,我们的银行业务转账,我们在真正转账的前后需要做大量的工作,比如说转账之前我们需要权限控制、日志加载、加载事务。在转账之后我们需要结束事务。这些代码量如果在我们的主业务逻辑之间,就会极大地增加代码。影响代码的可读性和程序的性能。

1、切面

切面指的是交叉业务逻辑,在上面的例子中,事务处理、日志处理就是切面。

2、织入

织入是指将交叉业务逻辑代码插入到主业务逻辑前后

3、连接点

连接点指的是交叉业务逻辑中的每一个方法

4、切入点

切入点值得是具体需要增强的主业务逻辑之间的方法

5、目标对象

需要增强的bean

6、通知

通知是切面的一种实现,可以完成简单的织入功能。

7、顾问

顾问是切面的另外一种实现方式,能够以更加复杂的方式植入到目标对象中,他其实就是把通知包装成更加复杂的装配器

二、环境搭建

1、导入jar

再导入spring的时候,使用了七个jar包。包括四个spring的jar包,还有三个与日至相关的包。我们现在在原来的基础之上再添加两个jar包。这两个jar包网上搜名字就有。

这个两个jar包是AOP联盟的规范jar包。剩下两个就是AOP的jar包

2、使用bean的约束

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd">

猜你喜欢

转载自blog.csdn.net/SDDDLLL/article/details/86614759