Spring框架特性之AOP(面向切面编程)

什么是AOP?

AOP叫做面向切面编程,是一种编程思想
传统的OOP编程大多是纵向编程,我们需要修改原有业务逻辑就只能去修改源码。
AOP编程可以在我们纵向编程的基础上,织入新的逻辑而不影响原有代码。

AOP编程怎么用?

首先我们要引入aspect包

  <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.5</version>
    </dependency>

这里我们用看电影这一事件进行实例,我们设定原有的逻辑如下

在这里插入图片描述

现在我们需要织入一些新的逻辑而不更改原有逻辑的代码,这里我们就要用到AOP面向切面编程了。如下图所示我们在原有的逻辑中打开一个切口横向去织入我们新的逻辑。

在这里插入图片描述

接下来我们用代码来解析一下以下过程:
首先我们来创建一个Movie类写入这些逻辑

package aop;

public class Movie
{
    public void buyTicket()
    {
        System.out.println("买票..");
    }
    public  void checkTicket()
    {
        System.out.println("检票");
    }
    public void watchMovie()
    {
        System.out.println("看电影..");
    }
    public void goHome()
    {
        System.out.println("回家..");
    }
}

接下来我们创建一个MovieAspect的切面类,在里面声明切入点以及写下我们需要织入的逻辑:

package aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

@Aspect //申明这是一个切面类
public class MovieAspect
{
    //声明一个切入点

    @Pointcut(value = "execution(public void aop.Movie.watchMovie())")
    public void pointCut()
    {}
    @Before(value = "pointCut()")//切入点前置增强
    public void beforeLogic()
    { System.out.println("买水。。");}
    @After(value = "pointCut()")//切入点后置增强
    public void afterLogic()
    { System.out.println("上厕所....");}
}

接下来我们来创建一个配置类来对以上两个类进行配置:

package aop;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration//声明这是一个配置类
@EnableAspectJAutoProxy //打开切面的自动代理
public class SpringConfigAOP
{
    @Bean
    public Movie getMovie()
    {
        return new Movie();
    }
    @Bean
    public MovieAspect getAspect()
    {
        return new MovieAspect();
    }
}

最后我们来测试以下我们的结果:

package aop;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

@Component

public class RunTest
{
    public static void main(String[] args)
    {
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfigAOP.class);
        Movie himom = context.getBean(Movie.class);
        himom.buyTicket();
        himom.checkTicket();
        himom.watchMovie();
        himom.goHome();
    }
}

在这里插入图片描述

结果如图所示,我们成功地运用了AOP编程织入了新的逻辑而没有改变原来逻辑的代码,下面是AOP编程的一些比较重要的注解:

@before //切入点前置增强
@Pointcut //切入点
@enableaspectproxy //打开切面的自动代理
@afterthrowing //后置异常  如果切入点异常可以进行补偿
@afterreturning //后置正常
@aroud //环绕增强 (前后都会去进行增强)

OOP主题业务流程,专注于业务逻辑的组织,增强类的全局统一的逻辑,交由AOP去实现。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值