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