SpringAOP切⾯实例讲解及应⽤场景(通俗易懂)AOP切⾯的实践
⼀、下⾯是⼀个在spring mvc中关于切⾯如何使⽤的例⼦,可以指直观的理解切⾯到底有什么作⽤1、引⽤ AspectJ jar 包依赖
<!-- aspectjrt -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.2</version>
</dependency>
2、创建两个新的包
urse.c03
urse.c03
3、创建⼀个业务类 UserXML
package urse.c03;
public class UserXML {
private int id=20190101;
private String name ="AspectJXML 测试⽤户";
private String sex;
private String email;
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getSex(){
return sex;
}
public void setSex(String sex){
this.sex = sex;
}
public String getEmail(){
return email;
}
public void setEmail(String email){
}
public String toString(){
StringBuffer stringBuffer=new StringBuffer();
stringBuffer.append("id=");
stringBuffer.append(id);
stringBuffer.append("\n");
stringBuffer.append("name=");
stringBuffer.append(name);
String();
}
public void saveUser(){
System.out.println("保存⽤户信息...");
}
public void queryUser(){
System.out.println("查看⽤户信息...");
System.out.String());
}}
4、创建⼀个 AOP 切⾯类 UserXMLAspectJ package urse.c03;
//定义代理通知类(切⾯类)
public class UserXMLAspectJ {
public void aspectMethod1(){
System.out.println("在切点之前,执⾏ aspectMethod1 ⽅法..."); }
public void aspectMethod2(){
System.out.println("在切点之后,执⾏ aspectMethod2 ⽅法..."); }}
5、创建配置类 l
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:aop="/schema/aop"
xsi:schemaLocation="/schema/beans
/schema/beans/spring-beans.xsd
/schema/aop
/schema/aop/spring-aop.xsd">
<!--1.定义业务 bean(⽬标类)-->
<bean id="userxml"class="urse.c03.UserXML"/>
<!--2.定义代理类(切⾯类)-->
<bean id="myAspectJ"class="urse.c03.UserXMLAspectJ"/>
<!--3.定义 aspectj-->
<aop:config>
<aop:aspect id="userAspect" ref="myAspectJ">
<!--3.1定义切点-->
<aop:pointcut id="userQueryUser"
expression="execution(* urse.c03.UserXML.queryUser(..))"/>
<!--3.2定义通知-->
<!--aop:before 配置了切点之前执⾏ aspectMethod1 ⽅法-->
<aop:before pointcut-ref="userQueryUser" method="aspectMethod1"/>
<!--aop:after-returning 配置了切点之后执⾏ aspectMethod2 ⽅法-->
<aop:after-returning pointcut-ref="userQueryUser" method="aspectMethod2"/>
</aop:aspect>
</aop:config>
</beans>
6、新建⼀个测试类 AspecJXMLTest
package urse.c03;
import urse.c03.UserXML;
import t.ApplicationContext;
import t.support.ClassPathXmlApplicationContext;
public class AspecJXMLTest {
public static void main(String[] args){
ApplicationContext ctx =
new ClassPathXmlApplicationContext("l");
UserXML user =(UserXML) Bean("userxml");
//执⾏业务⽅法,该⽅法配置为 AOP 切点
//当执⾏时,将会在这个⽅法之前和之后执⾏切⾯类(UserXMLAspectJ)的⽅法
user.queryUser();
}}
7、运⾏测试类
运⾏结果:
在切点之前,执⾏ aspectMethod1 ⽅法...
查看⽤户信息...
id=20190101
name ="AspectJXML 测试⽤户"
springboot aop在切点之后,执⾏ aspectMethod2 ⽅法...
对⽐运⾏结果你可以发现切点在此的作⽤,就是在运⾏系统或者说主类前先经过他,或运⾏完要经过他。
⼆、在Spring Boot中定义的话会更加简单免除了这些个配置类,下⾯我简单说⼀下在Spring Boot中对于⽇志处理的整体逻辑结构。
同样的我们要先添加依赖Aspect依赖,因为SpringBoot2.0之后新建项⽬的时候没有aop这个模块了,你需要⾃⼰⼿动加载依赖,2.0之前新建项⽬有aop模块,你勾选上就可以,只是简单说⼀下,怕⼩伙伴迷路啊。让后你就可以编写⽇志类了,下⾯我简单说下⾥⾯⽤到的注解。内容的话⽐较简单,这些注解你知道⽤在什么地⽅,有什么作⽤,其实你已经学会了。
1.定义⼀个切⾯类,加上@Component @Aspect这两个注解
@Aspect:作⽤就是把当前类标识为⼀个切⾯(必须)
@Component :组件扫描。spring boot可以通过这个注解才可以到这个切⾯类。
2.定义切点,需要⼀个是表达式,⼀个是⽅法签名这两个通俗的讲,第⼀个就是在哪个地⽅定义切点,第⼆个是切点空⽅法,之后会使⽤到。
@Pointcut(“execution(* com.Mwxw.web..(…))”) (切⼊你可以理解为拦截)
public void log() {}
在上⾯切点表达式中,上⾯表达式代表切⼊com.Mwxw.web包下的所有类的所有⽅法,第⼀个表⽰不限返回类型,第⼆个表⽰那个包下的所有类,第三个*表⽰包下所有类的所有⽅法,…两个点表⽰⽅法⾥的参数不限。必须⽤@Pointcut切点注解,写在⼀个空⽅法上⾯,等下在Advice通知中可以直接调⽤这个空⽅法就⾏了。
3.Advice通知增强
@Before(“log()”):在⽅法上标注这个注解,可以在系统执⾏到切点之前执⾏你注解的这个⽅法。
@After(“log()”):在系统⽅法执⾏之后执⾏你注解的这个⽅法。
@AfterReturning(returning = “result”,pointcut = “log()”):这个是代表系统⽅法执⾏完,要返回数据的时候执⾏这个⽅法。⾥⾯的参数第⼀个就是你在⽅法⾥定义的要返回的参数,第⼆个就是切点⽅法。
@AfterThrowing ()切点⽅法抛异常执⾏。
JoinPoint为连接点对象,它可以获取当前切⼊的⽅法的参数等
Object[] args = Args(); // 获取传⼊⽬标⽅法的参数,返回⼀个数组
这就是最基本的⽇志框架的东西,你可以简单理解⼀下,更深⼀些的东西下⼀次会分享到。
⾯向切⾯编程是⼀种思想,在我们⽇常实践中最常⽤的就是在做⽇志处理的时候,如果没有切⾯我们会在每个⽅法中添加⽇志处理的代码,如下代码内容是⼀样的,但是代码复⽤性差并且单独写成⼀个⽇志处理的⽅法也需要⼿动调⽤。
我们可以通过动态代理,可以在指定位置执⾏对应流程。这样就可以将⼀些横向的功能抽离出来形成⼀个独⽴的模块,然后在指定位置插⼊这些功能。
之后就是例⼦中的定义切点并通知系统在切点的哪个位置运⾏。
通知类型和介绍
Before⽬标⽅法调⽤之前执⾏
After⽬标⽅法调⽤之后执⾏
After-returning⽬标⽅法执⾏成功后执⾏
Around相当于合并了前置和后置
After-throwing⽬标⽅法抛出异常后执⾏
今天就分享到这⾥,之后会继续更新,路过的⼩伙伴感觉不错的可以帮忙点赞,有其他想法的同学可以评论留⾔互相交流,本⼈看到后会第⼀时间回复的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论