系列文章目录
1、什么是AOP
SpringAOP可以在方法的之前和之后实现增强,Sprignbean生命周期中有初始化前执行和初始化之后执行,和这个AOP思想一样但是不是使用的AOP
2、SpringAop有哪些应用场景
日志
事务
安全控制等等。
3、为什么使用AOP
AOP可以解决我们正在程序上的冗余问题
4、AOP原理
前置通知
后置通知
环绕通知
运行通知
异常通知
5、 实例
包结构
1、引入pom
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
2、LogAOP
@Component
@Aspect//定义切面类
@EnableAspectJAutoProxy //开启AOP]
public class LogAOP {
@Pointcut("execution(* com.spring.aop.service..*.*(..))")
public void logAop() {
}
//前置通知
/**
* 方法执行前进行通知
*/
@Before("logAop()")
public void before() {
System.out.println("【前置通知】");
}
//后置通知
/**
* 方法体执行完通知
*/
@After("logAop()")
public void after() {
System.out.println("【后置通知】");
}
//运行通知
/**
* 运行通知和后置通知区别:
* 后置执行完了再去进行运行通知
* 当程序运行时有异常是不会去执行运行通知但是会执行后置通知
*/
@AfterReturning("logAop()")
public void AfterReturning() {
System.out.println("【运行通知】");
}
//异常通知
/**
* 出现异常了就会进行通知
*/
@AfterThrowing("logAop()")
public void AfterThrowing() {
System.out.println("【异常通知】");
}
//环绕通知
@Around("logAop()")
public void Around(ProceedingJoinPoint joinPoint) {
try {
System.out.println("【环绕通知】");//在方法之前执行
joinPoint.proceed();
System.out.println("【环绕通知】");//在方法之后执行
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
3、TestService
@Component
public class TestService {
public String testMethod() {
System.out.println("【testMethod】");
return null;
}
}
4、MyConfig
@Configuration
@ComponentScan(basePackages = {"com.spring.aop.aop","com.spring.aop.service"})
public class MyConfig {
}
5、测试类
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
TestService testService = annotationConfigApplicationContext.getBean("testService", TestService.class);
testService.testMethod();
}
}
6、结果
【环绕通知】
【前置通知】
【testMethod】
【环绕通知】
【后置通知】
【运行通知】