AOP

Spring核心知识

Spring是一个开源框架,是一个轻量级的Java开发框架。

其目的是用于简化企业级应用程序开发。

主要用来管理javabean生命周期的轻量级容器。

框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。

Spring的核心有两部分构成,控制反转(IoC)和面向切面(AOP)。

ps:有一个类,如果想调用里面的方法(非静态方法),一般需要创建类的对象,然后再用对象调用方法来实现。在Spring中创建对象的过程中,不需要在代码里实现,只要交给Spring来进行配置实现。

SpringAOP原理

AOP: Aspect Oriented Programming 面向切面编程

利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

  • 关注点:重复代码就叫做关注点
  • 切面:关注点形成的类,就叫切面(类)
  • 切入点:执行目标对象方法,动态植入切面代码

AOP底层实现原理

代理设计模式 :通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。

代理的分类:

AOP编程使用

注解版本实现AOP

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>	开启事物注解权限
@Aspect	指定一个类为切面类       
@Pointcut("execution(* com.service.UserService.add(..))")	指定切入点表达式
@Before("pointCut_()")	前置通知: 目标方法之前执行
@After("pointCut_()")	后置通知:目标方法之后执行(始终执行)
@AfterReturning("pointCut_()")	返回后通知: 执行方法结束前执行(异常不执行)
@AfterThrowing("pointCut_()")	异常通知:  出现异常时候执行
@Around("pointCut_()")	环绕通知: 环绕目标方法执行


@Component
@Aspect
public class AopLog {

    // 前置通知
    @Before("execution(* com.service.UserService.add(..))")
    public void begin() {
        System.out.println("前置通知");
    }

    // 后置通知
    @After("execution(* com.service.UserService.add(..))")
    public void commit() {
        System.out.println("后置通知");
    }

    // 运行通知
    @AfterReturning("execution(* com.service.UserService.add(..))")
    public void returning() {
        System.out.println("运行通知");
    }

    // 异常通知
    @AfterThrowing("execution(* com.service.UserService.add(..))")
    public void afterThrowing() {
        System.out.println("异常通知");
    }

    // 环绕通知
    @Around("execution(* com.service.UserService.add(..))")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕通知开始");
        proceedingJoinPoint.proceed();
        System.out.println("环绕通知结束");
    }
}