spring-aop (一)

AOP中文翻译为面向切面编程,所谓面向切面,就是根据功能不同,将程序不同模块插到主程序中。

典型的例子就是日志记录,传统的方法是使用一个日志类,每次要写日志时就调用它。AOP的方法就是编写一个日志切面,每次要写日志时就都由切面去完成。

spring-aop中有关概念:

Join Point:切入点,就是你需要插入切面的地方

Pointcut:切点,这里可以定义你的Join Point,也就是你需要拦截哪些方法。spring只支持对方法的拦截。在spring中,pointcut的定义必须是public void开始的函数,可以有参数,也可以定义一些具体的方法内容,但一般都是空函数。

advice:消息,就是对应于pointcut的消息。spring中advice通常有before,after,afterthrowing,around等

before:在拦截方法前使用;

after:在拦截的方法完成后使用;

afterthrowing:在抛出异常时使用;

around:按照spring官方文档的说明,around的执行存在一定的不确定性,它会在拦截方法的前中后阶段视情况择机执行一次,因而对于不明确的情况下最好不要使用around

下面是一个aop的例子:

普通类

package aoptest;

import org.springframework.stereotype.Component;

@Component
public class Common {
	public String execute(String username,String password){
		System.out.println("this is Common.execute"+username +" "+password);
		return username+" "+password;
	}
}

切面:

package aoptest;

import java.util.Date;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class Check {
	
	public static final String EDP = "execution(* Common.execute(..))";
	
	@Pointcut(EDP)
	public void anyMethod(){}
	
	@Around("anyMethod() && args(user,password)")
	public void checkValidity(ProceedingJoinPoint pjp,String user,String password) throws Throwable{
		System.out.println(" check validity");
		System.out.println("It's time : "+new Date());
		user = "Jessica";
		password = "890314";
		pjp.proceed(new Object[]{user,password});
	}
	
	@Around("anyMethod()")
	public Object addLog(ProceedingJoinPoint j)throws Throwable{
		System.out.println("----in addLog method----");
		System.out.println("===checkSecurity==="+j.getSignature().getName());
		
		System.out.println("===change the return arg values===");
		Object object = j.proceed();
		object = "Jessica 1989-03-14";
		return object;
	}
}

main方法:

其中main类要使用如下annotation

@Configuration
@EnableAspectJAutoProxy
@ComponentScan({"aoptest","otherAspect"})
ApplicationContext ctx = SpringApplication.run(Client.class,args);
		Common com = (Common) ctx.getBean("common");
		System.out.println("this is the main class");
		System.out.println(com.execute("Yue Lei", "*123456*"));

有关各个annotation的常用情况,下章讲解

你可能感兴趣的:(java,spring,AOP,面向切面编程,spring-aop)