文章目录
- 前言
- 环境搭建
- 前置业务类编写
- 一、注解实现AOP
- 1.编写注解实现的增强类
- 2.在Spring配置文件中,注册bean,并增加支持注解的配置
- 3.测试
- 二、配置文件实现AOP
- 1.编写自定义增强类
- 2.Spring配置文件中,注册bean,配置增强
- 2.测试
- 总结
前言
AOP(Aspect Oriented Programming)称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待。
环境搭建
1、pom.xml 配置AOP依赖
<!-- AOP 依赖--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version></dependency>
2、Spring配置文件的命名空间中加入aop头文件
<beans xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
前置业务类编写
1、Admin的service
package com.ex.service;public interface IAdminService {public void saveAdmin(String name);
}
package com.ex.service.impl;@Service
public class adminServiceImpl implements IAdminService {@Overridepublic void saveAdmin(String name) {System.out.println("save admin method");}
}
2、user的service
package com.ex.service;public interface IUserService {public void selectUser(int id);
}
package com.ex.service.impl;@Service
public class userServiceImpl implements IUserService {@Overridepublic void selectUser(int id) {System.out.println("user select method");}
}
一、注解实现AOP
1.编写注解实现的增强类
@Component
@Aspect
public class LogAdvice {// springaop自动的5种aop这里全部列出// *返回类型,包名,*类名,*方法名,(..)任何参数@Before("execution(* com.ex.service.impl.*.*(..))")public void before(){System.out.println("---------方法执行前before()---------");}@After("execution(* com.ex.service.impl.*.*(..))")public void after(){System.out.println("---------方法执行后after()---------");}@AfterReturning("execution(* com.ex.service.impl.*.*(..))")public void afterReturning(){System.out.println("---------方法返回后afterReturning()---------");}@Around("execution(* com.ex.service.impl.*.*(..))")public void around(ProceedingJoinPoint jp) throws Throwable {System.out.println("-------环绕前-------");System.out.println("签名(拿到方法名):"+jp.getSignature());//执行目标方法proceedObject proceed = jp.proceed();System.out.println("-------环绕后------");System.out.println(proceed);}@AfterThrowing("execution(* com.xinzhi.service.impl.*.*(..))")public void afterThrow() {System.out.println("--------------有异常发生-----------------" + new Date());}
}
2.在Spring配置文件中,注册bean,并增加支持注解的配置
<!-- 扫包:如果使用了注解,需要在开始之前去扫包--><context:component-scan base-package="com.ex"/><!-- aop 注解实现 配置 --><aop:aspectj-autoproxy/>
3.测试
@Testpublic void testAop(){userService.selectUser(1);System.out.println("--------------------------------");adminService.saveAdmin("aa");}
结果
-------环绕前-------
签名(拿到方法名):void com.ex.service.IUserService.selectUser(int)
---------方法执行前before()---------
user select method
-------环绕后------
null
---------方法执行后after()---------
---------方法返回后afterReturning()---------
--------------------------------
-------环绕前-------
签名(拿到方法名):void com.ex.service.IAdminService.saveAdmin(String)
---------方法执行前before()---------
save admin method
-------环绕后------
null
---------方法执行后after()---------
---------方法返回后afterReturning()---------
二、配置文件实现AOP
1.编写自定义增强类
public class MyAOP {public void before(){System.out.println("---------执行方法前打印日志--------------自定义");}public void after(){System.out.println("---------执行方法后打印日志--------------自定义");}
}
2.Spring配置文件中,注册bean,配置增强
<!--注册bean--> <bean id="myAop" class="com.xinzhi.aop.MyAop"/><!--aop的配置--><aop:config><!-- ref 自定义切面类 --><aop:aspect ref="myAOP"><!-- 切入点配置 --><aop:pointcut id="pointcut1" expression="execution(* com.ex.service.impl.adminServiceImpl.*(..))"/><aop:pointcut id="pointcut2" expression="execution(* com.ex.service.impl.userServiceImpl.*(..))"/><!-- 织入 --><aop:before pointcut-ref="pointcut1" method="before"/><aop:after pointcut-ref="pointcut2" method="after"/></aop:aspect></aop:config>
2.测试
@Testpublic void testAop2(){userService.selectUser(1);System.out.println("--------------------------------");adminService.saveAdmin("aa");}
结果
user select method
---------执行方法后打印日志--------------自定义
--------------------------------
---------执行方法前打印日志--------------自定义
save admin method
总结
AOP就是对指定的一批的方法在其执行过程中进行一个统一的处理,将大量重复性的工作抽离了出来,省事!