用配置文件和完全注解方式理解Spring中AOP

Aop概述

AOP 是一种编程范式,旨在通过允许分离横切关注点来增加模块化。
它通过在不修改代码本身的情况下向现有代码添加额外的行为来实现这一点。
相反,我们可以分别声明新代码和新行为。Spring 的AOP 框架帮助我们实现这些横切关注点。

Maven依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.1</version>
</parent>
 
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
</dependencies>

AOP 概念和术语

让我们简要回顾一下 AOP 特有的概念和术语:
在这里插入图片描述

简单来说

连接点: 指的是被增强类中的所有方法(假如被增强类中有100个方法,这些方法都称为连接点)
切点 : 指的是增强类中被增强的方法(假如有100个方法,我只对Add()方法增强,那么只有这个Add()方法能称为切点)
切面 : 指的是增强类作用于被增强类的那个方法这个动作
通知 : 指的是以什么方式进行增强(前置通知,后置通知,环绕通知,异常通知,最终通知)

直接上代码(示例)

方式一:XML配置

1.被增强类

package com.company.Aop.xml;

public class Sun {
    public void Add(){
        System.out.println("I AM SUN");
    }
}

2.增强类

package com.company.Aop.xml;

public class SunProxy {
    public void before(){
        System.out.println("I AM SUN BEFORE!!");
    }
}

3.XML配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
        <bean id="sun" class="com.company.Aop.xml.Sun"></bean>
        <bean id="sunProxy" class="com.company.Aop.xml.SunProxy"></bean>
        <aop:config>
<!--            配置切点-->
            <aop:pointcut id="sunmin" expression="execution(* com.company.Aop.xml.Sun.Add())"></aop:pointcut>
<!--            配置切面-->
            <aop:aspect id="sunminproxy" ref="sunProxy">
                <aop:before method="before" pointcut-ref="sunmin"></aop:before>
            </aop:aspect>
        </aop:config>
</beans>

4.测试类

@Test
    public void SunMinProxy(){
         ApplicationContext context = new ClassPathXmlApplicationContext("com/company/beanAop.xml");
        Sun sun = context.getBean("sun", Sun.class);
        sun.Add();
    }

5.运行情况

I AM SUN BEFORE!!
I AM SUN

方式二:完全注解

1.被增强类

package com.company.Aop.xml;

import org.springframework.stereotype.Component;

@Component
public class Min {
    public void Add(){
        System.out.println("I AM SUN");
    }
}


2.增强类

package com.company.Aop.xml;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

@Component
@Aspect
@EnableAspectJAutoProxy
public class MinProxy {
    @Pointcut( value = "execution(* com.company.Aop.xml.Min.Add())")
    public void SunMin(){

    }
    @Before(value = "SunMin()")
    public void before(){
        System.out.println("I AM SUN BEFORE!!");
    }
}


3.配置类

@Configuration
@ComponentScan(basePackages = {"com.company.Aop.xml"})
public class Config {
}

4.测试类

    @Test
    public void SunMinAnnotation(){
        ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        Min min = context.getBean("min", Min.class);
        min.Add();
    }

5.运行情况

I AM SUN BEFORE!!
I AM SUN
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小藕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值