一、spring AOP的应用场景
1、spring AOP s是什么? (what)
AOP 面向切面编程,其通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。其核心使用了java的动态代理来实现的,一定程度上做到了业务和系统级别服务的解耦
2、spring AOP 可以用来做什么 ()
日志记录,性能统计,安全控制,事务处理,异常处理等通用服务 可以通过AOP横切进入业务逻辑,这样做在实际的开发中将功能性业务和一些非功能的通用服务分离,解耦,需求变更的时候,如果是通用服务逻辑变更,只需要开发日志等通用服务模块的开发人员进行更改(通用服务代码不会和业务代码耦合在一起),业务上的需求变更只需更改业务逻辑即可。
二、spring AOP的相关术语
1、 AOP中的相关术语
- Aspect,切面,一个关注点的模块。包含有具体实现的切面类。
- JoinPoint, 连接点,程序执行中的某个点,某个位置。
- PointCut,切点,切面匹配连接点的点,一般与切点表达式相关,就是切面如何切点。 例子中,@PointCut注解就是切点表达式,匹配对应的连接点后连接点即变为了切点。
- Advice,通知,指在切面的某个特定的连接点上执行的动作。 例子中,before()与after()方法中的代码。
- TargetObject,目标对象,指被切入的对象。 例子中,从ctx中取出的testBean则是目标对象。
- Weave,织入,将Advice作用在JoinPoint的过程。
2、spring AOP的五种通知
- @Before,前置通知,执行方法前执行
- @AfterReturn,返回通知,正常返回方法后执行
- @After,后置通知,方法最终结束后执行,相当于finaly
- @Around,环绕通知,围绕整个方法
- @AfterThrowing,异常通知,抛出异常后执行
三、spring AOP的相关demo
使用两种形式实现Spring的AOP 第一个是使用切入点表达式,第二种使用注解的形式,个人喜欢使用注解的形式因为注解灵活且便于理解
1、使用切入点表达式来实现
1.1、切面类aspect
/**
* 切面打印服务层日志信息
*/
@Aspect
@Component
public class LogInfoAspect {
private static final Logger logger = LoggerFactory.getLogger(LogInfoAspect.class);
//定义一个切入点表达式
@Pointcut("execution(* com.xiu.sb.aopTest.service.*.*(..))")
public void logInfo() {
}
//在进入切点业务代码未执行之前执行
@Before("logInfo()")
public void logBefore(JoinPoint pjp){
MethodSignature methodSignature = ( MethodSignature) pjp.getSignature();
String methodName = methodSignature.getMethod().getName();
String className = pjp.getTarget().getClass().getName();
Object[] argsInfo = p