【Spring基础】Spring中的AOP框架

什么是AOP

OOP(面向对象编程)提供“从上到下”的关系,而AOP(面向方面编程)提供一种“横切”的方式,也可以说是“从左到右”。
简单来说就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

实例

可能光是说AOP的定义,大家都不太能理解。
举个例子,比如日志功能,实现这个功能的代码可能是很多类所需要的功能之一,但是如果我们在每一个类里都重复添加实现日志功能的代码,将会有很多重复代码。
上代码(代码参考https://blog.csdn.net/JinXYan/article/details/89302126

/**
 * @description: 业务类
 */
public class Calculator {

    public int add(int i, int j) {
        System.out.println("加法");
        return i + j;
    }

    public int sub(int i, int j) {
        System.out.println("减法");
        return i - j;
    }

    public int mul(int i, int j) {
        System.out.println("乘法");
        return i * j;
    }

    public int div(int i, int j) {
        System.out.println("除法");
        return i / j;
    }
}

通过切入点,把业务类Calculator“横向”切开,这样很好的把业务类和日志类解耦。

/**
 * @description: 日志切面类,
 */
@Aspect
public class LogAspects {
    //切入点
    @Pointcut("execution(public int Calculator.*(..))")
    public void pointCut(){};

    //代表在目标方法执行前切入, 并指定在哪个方法前切入
    @Before("pointCut()")
    public void logStart(){
        System.out.println("@Before");
    }
    //代表在目标方法运行结束之后 ,不管有没有异常
    @After("pointCut()")
    public void logEnd(){
        System.out.println("@After");
    }
    //代表在目标方法正常返回值后运行
    @AfterReturning("pointCut()")
    public void logReturn(){
        System.out.println("@AfterReturning");
    }
    //代表在目标方法出现异常后运行
    @AfterThrowing("pointCut()")
    public void logException(){
        System.out.println("@AfterThrowing");
    }
    //动态代理,手动执行joinPoint.procced方法(程序执行过程中明确的点,一般指方法的调用)
    //简单的来说就是,在目标方法执行之前是前置通知,在目标方法执行之后是后置通知
    @Around("pointCut()")
    public Object Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        System.out.println("@Around:执行目标方法之前...");
        Object obj = proceedingJoinPoint.proceed();
        System.out.println("@Around:执行目标方法之后...");
        return obj;
    }

}
/**
 * @description: 配置类
 */
@Configuration
@EnableAspectJAutoProxy
public class Config {
    @Bean
    public Calculator calculator(){
        return new Calculator();
    }

    @Bean
    public LogAspects logAspects(){
        return new LogAspects();
    }
}

测试一下

public class test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(Config.class);
        Calculator c = app.getBean(Calculator.class);
        c.add(2, 3);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值