一、 AOP概念
- AOP:【动态代理】指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式;
- 1、导入aop模块;Spring AOP:(spring-aspects)
- 2、定义一个业务逻辑类(MathCalculator)
- 3、定义一个日志切面类(LogAspects):
- 4、给切面类的目标方法标注何时何地运行(通知注解);
- 5、将切面类和业务逻辑类(目标方法所在类)都加入到容器中;
- 6、必须告诉Spring哪个类是切面类(给切面类上加一个注解:@Aspect)
- 7、给配置类中加 @EnableAspectJAutoProxy 【开启基于注解的aop模式】
1、以下所有操作都针对该目录结构
2、创建一个maven项目(创建maven项目过程省略),pom.xml文件引入如下依赖:
org.springframework
spring-context
5.2.0.RELEASE
org.springframework
spring-aspects
4.3.12.RELEASE
junit
junit
4.12
test
3、定义一个业务逻辑类(MathCalculator)
package com.rf.aop;
/**
* 计算器类
* */
public class MathCalculator {
//除法方法
public int division(int i,int j){
System.out.println("执行了计算器的除法方法");
return i/j;
}
}
4、定义一个日志切面类(LogAspects),并且给切面类的目标方法标注何时何地运行(通知注解)
package com.rf.aop;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
/**
* 切面类
* @Aspect: 告诉Spring当前类是一个切面类
*
*/
@Aspect
public class LogAspects {
//抽取公共的切入点表达式
@Pointcut("execution(public int com.rf.aop.MathCalculator.*(..))")
public void pointCut(){};
//@Before在目标方法之前切入;切入点表达式(指定在哪个方法切入)
//@Before("public int com.rf.aop.MathCalculator.*(..)") *表示任意方法;..表示任意参数
//@Before("public int com.rf.aop.MathCalculator.division(int, int)") division表示指定的方法;int, int表示指定的参数
@Before("pointCut()")
public void logStart(){
System.out.println("计算器的除法方法执行之前调用。。。。");
}
//@After在目标方法之后切入(无论方法正常执行还是异常执行);切入点表达式(指定在哪个方法切入)
@After("pointCut()")
public void logEnd(){
System.out.println("计算器的除法方法执行之后调用。。。。");
}
@AfterReturning("pointCut()")
public void logReturn(){
System.out.println("计算器的除法方法执行带有返回值时调用。。。。");
}
@AfterThrowing("pointCut()")
public void logException(){
System.out.println("计算器的除法方法执行抛出异常时调用。。。。");
}
}
5、将切面类和业务逻辑类(目标方法所在类)都加入到容器中,并且给配置类中加 @EnableAspectJAutoProxy 【开启基于注解的aop模式】
package com.rf.aop;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@EnableAspectJAutoProxy
@Configuration
public class MainConfigAop {
//将业务逻辑类加入到容器中
@Bean
public MathCalculator mathCalculator(){
return new MathCalculator();
}
//将切面类加入到容器中
@Bean
public LogAspects logAspects(){
return new LogAspects();
}
}
6、编写测试类
package com.rf.test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.rf.aop.MainConfigAop;
import com.rf.aop.MathCalculator;
import com.rf.config.MyConfigOfAutowired;
import com.rf.service.BookService;
public class TestAop {
@org.junit.Test
public void test(){
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfigAop.class);
System.out.println("ioc容器创建完成了。。。。");
MathCalculator mathCalculator = ctx.getBean(MathCalculator.class);
mathCalculator.division(1, 2);
//关闭容器执行销毁方法
ctx.close();
}
}
7、运行测试类,效果如下: