Spring--AOP中的几个名词

AOP面向切面编程,是一种编程思想,并不是Spring专有,Spring是封装代理模式完成,之前的博客中也写到了关于AOP的文章,Filter和代理,请见《以此之长,补彼之短----AOP(Filter)》和《以此之长,补彼之短----AOP(代理模式)》。这篇主要介绍SpringAOP的几个概念和一般用法,不再具体细说每个名词的来源,从用法中读者应该就会体会到。下面用三峡大坝作为例子,通俗的来理解几个生涩的名词。

场景:为了合理利用长江丰富水资源,要在长江流域修建一个大坝,并且要在大坝上建立一个汛期报警系统,防止水位过高带来的安全隐患。

切入点(Pointcut:修大坝首先要定位在何地修建,三峡水流湍急,成为首选之地,在AOP中有个专业的名词叫切入点,这个例子中,三峡就是切入点。在程序中,切入点一般是一个或多个符合某种规则的方法,用正则表达式来表示,如:expression= "execution(* add*(..))Pointcut是用来订阅连接点的。

有了修建的地址,接下来就要建造大坝了,那这个大坝就是Spring中所说的切面:

切面(Aspect:三峡大坝中拦水的大坝,可以把它想象成一个没有具体实现的框架。在程序中,切面是我们想要插入的模块,可以理解成一层,或者一个类,也可以是一个应用(类比较好理解)。切面是一个模块化的过程,善于发现合理的切面是我们在应用AOP最重要的一部分。

通知(Advice:有了大坝这个框架后(可以理解成一个类),就该实现他了,汛期报警系统是大坝配套设施的其中之一(可以理解成类中的一个方法)。Advice是横向关注点的具体实现者。该汛期报警系统由如下几种报警类型:

A.前置通知(Beforeadvice):在水位还未到达警戒线时汛期报警系统发出通知(执行方法)。调用目标对象方法之前执行。

B.后置通知(Afterreturning advice):水位已超过警戒线通知(执行方法)。调用目标对象方法之后执行。

C.异常通知(Afterthrowing advice):出现地震等异常情况时发出通知。目标对象方法出错后执行。

D.最终通知(After(finally)advice):发生异常情况,或水位到了警戒线,都会发出通知。目标对象方法出错或者执行完成后执行。

E.环绕通知(AroundAdvice):在水位未到达或已超过警戒线时都会发出通知。目标对象方法执行前和执行后都会执行通知。

连接点(Joinpoint:这个概念比较晦涩,它指的是方法调用,指符合切入点具体的方法调用称为连接点。比如在addUser()方法前添加事务管理(用AOP技术),那么把addUser()的调用称之为连接点。

目标对象(TargetObject:这里指长江。程序中是被通知对象。

织入(Weaving:大坝修在三峡的过程称之为织入,进一步看就是把Advice用到Joinpoint上。织入就是把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象。

AOP代理(AOPProxy:在SpringAOP中有目标的概念,有些AOP是没有目标的,他会把代理这类采用一种编译器,把代理上所有的控制行为全部放到目标上,相当于采用编译器直接把要控制的东西全部编译到一个类里,就没有了目标的概念。Spring是有单独的概念的,在运行时来调用目标,这就是代理的功能。

引入(Introduction):动态的为某个类增加或减少方法。

思前想后,还是把这张图贴上来吧(此图来自视频教程),请大家参照下图和上面概念对号入座:

               

上面这些名词解释,其实配上另一篇文章《 Spring中的事务处理(下)》的“一.用<tx/>标签来定义事务方式”部分配置内容,看起来更加的生动一些。。(更新于2015年5月15日)

下面是一个简单的小实例(实例来自网络,已测试):

本人使用Maven管理Jar包,下面是用到的Jar截图,请自行下载:


1.首先定义一个普通类:

package com.tgb.spring;

/**
 * 普通类
 * @author yuanfubiao
 *
 */
public class Common {

	public void execute(String username,String password){
		System.out.println("--------------普通类----------------");
	}
}

2.定义切面类:

package com.tgb.spring;

import org.aspectj.lang.JoinPoint;

/**
 * 切面类,用于合法性校验和日志添加
 * @author yuanfubiao
 *
 */
public class Check {

	public void checkValidity(){
		System.out.println("----------验证合法性------------");
	}
	
	public void addLog(JoinPoint jp){
		System.out.println("----------添加日志---------------");
		
		Object[] objArgs = jp.getArgs();
		
		for(Object o : objArgs){
			System.out.println(o);
		}
		
		//获得方法名
		System.out.println("**checkSecurity**" + jp.getSignature().getName());
	}
}

3.配置applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
	
	<bean id="common" class="com.tgb.spring.Common"/>
	
	<bean id="check" class="com.tgb.spring.Check"/>
	
	<aop:config>
		<aop:aspect id="myAop" ref="check">
			<aop:pointcut expression="execution(* com.tgb.spring.*.*(..))" id="target"/>
			<aop:before method="checkValidity" pointcut-ref="target"/>
			<aop:after method="addLog" pointcut-ref="target"/>
		</aop:aspect>
	</aop:config>
</beans>

注意上面配置execution(* com.tgb.spring.*.*(..))中,第一个*号后面有一个空格!!!

4.定义一个测试类Client:

package com.tgb.spring;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Client {

	public static void main(String[] args){
		BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
		Common c = (Common)factory.getBean("common");
		c.execute("username", "password");
	}
}

运行结果:

----------验证合法性------------
   --------------普通类----------------
   ----------添加日志---------------
   username
   password
   **checkSecurity**execute

以上就是一个完整的SpringAOP小实例。

  • 12
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
Spring BootAOP(面向切面编程)是一种强大的技术,可以在不修改原始代码的情况下增强应用程序的功能。它是一种编程范式,可以将横切关注点(例如日志记录、事务管理、安全性等)从应用程序的主逻辑分离出来。 以下是在Spring Boot使用AOP的入门步骤: 1. 添加依赖 您需要在pom.xml文件添加以下依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 2. 创建一个切面类 您需要创建一个切面类来定义要应用于应用程序的横切关注点。切面类应该使用@Aspect注解进行注释,并且应该包含一个或多个使用@Before、@After、@Around等注解进行注释的通知方法。 例如,以下是一个简单的切面类: ```java @Aspect @Component public class MyAspect { @Before("execution(* com.example.demo.MyService.*(..))") public void beforeAdvice() { System.out.println("Before advice called."); } @After("execution(* com.example.demo.MyService.*(..))") public void afterAdvice() { System.out.println("After advice called."); } } ``` 在上面的示例,@Before和@After注释用于定义在执行MyService类的任何方法之前和之后要执行的通知方法。 3. 将切面类注册到Spring Boot应用程序 您需要将切面类注册到Spring Boot应用程序,以便它可以在应用程序执行期间应用于横切关注点。您可以使用@Configuration注解或@ComponentScan注解来注册切面类。 例如,以下是使用@Configuration注解注册切面类的示例: ```java @Configuration @EnableAspectJAutoProxy public class AppConfig { @Bean public MyAspect myAspect() { return new MyAspect(); } } ``` 在上面的示例,@EnableAspectJAutoProxy注解用于启用Spring Boot的自动代理功能,以便Spring Boot可以在运行时创建代理对象。@Bean注解用于将MyAspect类注册为Spring Boot应用程序的bean。 4. 测试切面 一旦您已经注册了切面类并启用了自动代理功能,您可以测试切面是否按预期工作。您可以创建一个MyService类来模拟应用程序的主逻辑,并在其调用一个或多个方法。 例如,以下是一个简单的MyService类: ```java @Service public class MyService { public void doSomething() { System.out.println("Doing something."); } } ``` 在上面的示例,MyService类具有一个名为doSomething()的方法,用于模拟应用程序的主逻辑。 您可以创建一个Spring Boot测试类来测试切面是否按预期工作。例如,以下是一个简单的测试类: ```java @RunWith(SpringRunner.class) @SpringBootTest public class MyServiceTest { @Autowired private MyService myService; @Test public void testDoSomething() { myService.doSomething(); } } ``` 在上面的示例,@Autowired注解用于将MyService类注入到测试类。在testDoSomething()方法,您可以调用MyService类的doSomething()方法,以便切面可以应用于该方法。 如果一切正常,您应该在控制台上看到以下输出: ``` Before advice called. Doing something. After advice called. ``` 这表明切面已成功应用于doSomething()方法,并且切面定义的通知方法已成功调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值