Spring Aop简介

简介: Spring Aop简介

1.Spring Aop简介

Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的一个重要特性。它为应用程序提供了一种以声明方式定义横切关注点(Cross-cutting Concerns)的能力,通过将这些关注点与主要业务逻辑进行解耦,提高了系统的可维护性和灵活性。

Spring AOP的工作原理

Spring AOP的工作原理可以简单描述为:

定义切面:开发者通过配置文件或者注解的方式定义切面(Aspect),切面包含横切关注点(Advice)和切入点(Pointcut)。

创建代理对象:Spring根据配置文件或者注解的规范,为被AOP增强的目标对象创建代理对象。

拦截方法调用:当方法调用到达切入点时,代理对象将会拦截方法调用,并执行相应的横切关注点。

执行增强逻辑:在拦截方法调用时,代理对象会根据配置执行相应的增强逻辑,如记录日志、事务管理等。

继续执行原始方法:在执行完增强逻辑后,代理对象会继续执行原始的方法逻辑,完成整个方法调用过程。

Spring AOP的类型

Spring AOP支持以下几种类型的横切关注点:

Before Advice:在目标方法调用之前执行的通知。

After Returning Advice:在目标方法成功返回后执行的通知。

After Throwing Advice:在目标方法抛出异常后执行的通知。

After Advice:无论目标方法如何结束,都会执行的通知。

Around Advice:在目标方法调用前后都可以自定义处理逻辑,并且决定是否继续执行目标方法。

Spring AOP的优势

降低代码的耦合度:通过将横切关注点与主要业务逻辑解耦,减少了代码的重复和侵入性。

提高了系统的可维护性:横切关注点的¥¥维护使得对整个系统的修改更加容易。

增强代码的灵活性:不同的切面可以通过配置的方式进行组合,实现不同的横切需求。

可以集成不同的框架:Spring AOP可以与其他框架如Spring MVC、Hibernate等进行集成,提供全方位的AOP功能。

总结起来,Spring AOP是Spring框架的一个重要特性,通过面向切面编程的方式,提供了一种以声明方式定义横切关注点的能力。它通过与主要业务逻辑解耦,降低了代码的耦合度,提高了系统的可维护性和灵活性。

2.AOP中关键性概念

在Spring AOP中,有几个关键性概念:

1.切面(Aspect):切面是一个类,它包含了一组通知和切点。通常,切面用于封装与横切关注点相关的行为。

连接点(Join Point):连接点是在应用程序执行过程中可以插入切面的点。在Spring AOP中,连接点可以是方法调用、方法执行、异常抛出等。

通知(Advice):通知是切面在连接点上执行的动作。Spring AOP支持几种类型的通知,包括前置通知(Before)、后置通知(After)、返回通知(After Returning)和异常通知(After Throwing)等。

切点(Pointcut):切点是一个表达式,它定义了在哪些连接点上应用通知。Spring AOP使用切点表达式来匹配连接点。

引入(Introduction):引入是一种在现有类中添加新方法或属性的方式,以增强该类的功能。Spring AOP允许通过引入来向现有类添加接口的实现。

织入(Weaving):织入是将切面应用到目标对象中的过程。Spring AOP支持编译时织入、类加载时织入和运行时织入。

这些概念是Spring AOP的核心组成部分,通过使用Spring AOP,可以实现横切关注点的模块化,并将其与应用程序的核心逻辑分离开来,提高代码的可维护性和可重用性。

3.Sping aop的专业术语

在Spring AOP中,还有一些专业术语,如下所示:

目标对象(Target Object):目标对象是被切面所通知的对象。它是应用程序中的实际业务对象。

代理对象(Proxy Object):代理对象是Spring AOP在运行时为目标对象创建的对象。代理对象包含了切面的通知逻辑,并在调用目标对象的方法之前或之后执行通知。

引入(Introduction):引入是一种在现有类中添加新方法或属性的方式,以增强该类的功能。Spring AOP允许通过引入来向现有类添加接口的实现。

织入(Weaving):织入是将切面应用到目标对象中的过程。Spring AOP支持编译时织入、类加载时织入和运行时织入。

切面优先级(Aspect Ordering):切面优先级定义了多个切面之间的执行顺序。在Spring AOP中,可以使用@Order注解或实现Ordered接口来指定切面的优先级。

切面自动代理(Aspect Auto-proxying):切面自动代理是Spring AOP的一种机制,它通过扫描应用程序上下文中的切面定义,并自动为匹配的目标对象创建代理对象。

切面表达式(Aspect Expression):切面表达式是用于定义切点的表达式。它可以使用类名、方法名、参数类型等来匹配连接点。

这些专业术语是Spring AOP中常用的概念,了解它们可以帮助更好地理解和使用Spring AOP框架。

4.spring的前置通知

伪代码论证

package com.zking.aop.advice;
import java.lang.reflect.Method;
import java.util.Arrays;
import org.springframework.aop.MethodBeforeAdvice;
/**
 * 买书、评论前加系统日志
 * @author Administrator
 *
 */
public class MyMethodBeforeAdvice implements MethodBeforeAdvice {
  @Override
  public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
//    在这里,可以获取到目标类的全路径及方法及方法参数,然后就可以将他们写到日志表里去
    String target = arg2.getClass().getName();
    String methodName = arg0.getName();
    String args = Arrays.toString(arg1);
    System.out.println("【前置通知:系统日志】:"+target+"."+methodName+"("+args+")被调用了");
  }
}

spring_context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 default-autowire="byType"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.zking.ioc.web.UserAction" id="userAction">
</bean>
    <bean class="com.zking.ioc.web.GoodsAction" id="goodsAction">
    </bean>
<bean class="com.zking.ioc.impl.UserServiceImpl1" id="userService"></bean>
    <bean class="com.zking.aop.biz.impl.BookBizImpl" id="bookBiz"></bean>
<bean class="com.zking.aop.advice.MyMethodBeforeAdvice" id="methodBeforeAdvice"></bean>
    <bean class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" id="methodPointcutAdvisor">
        <property name="advice"  ref="myAfterReturningAdvice"></property>
        <property name="pattern" value=".*buy"></property>
    </bean>
    <bean class="org.springframework.aop.framework.ProxyFactoryBean" id="bookProxy">
        <property name="target" ref="bookBiz"></property>
        <property name="proxyInterfaces">
            <list>
                <value>com.zking.aop.biz.IBookBiz</value>
            </list>
        </property>
        <property name="interceptorNames">
            <list>
                <value>methodBeforeAdvice</value>
<!--                <value>myAfterReturningAdvice</value>-->
                <value>methodPointcutAdvisor</value>
                <value>methodInterceptor</value>
                <value>myThrowsAdvice</value>
            </list>
        </property>
    </bean>
</beans>

demo,后面几个都会用到demo就不重复了

package com.zking.demo;
import com.zking.aop.biz.IBookBiz;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class demo1 {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("sping-context.xml");
        IBookBiz bookBiz = (IBookBiz) context.getBean("bookProxy");
bookBiz.buy("小朱","西医",9.9d);
bookBiz.comment("你","你");
    }
}

5.Sping后置通知

package com.zking.aop.advice;
import java.lang.reflect.Method;
import java.util.Arrays;
import org.springframework.aop.AfterReturningAdvice;
/**
 * 买书返利
 * @author Administrator
 *
 */
public class MyAfterReturningAdvice implements AfterReturningAdvice {
  @Override
  public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
    String target = arg3.getClass().getName();
    String methodName = arg1.getName();
    String args = Arrays.toString(arg2);
    System.out.println("【后置通知:买书返利】:"+target+"."+methodName+"("+args+")被调用了,"+"该方法被调用后的返回值为:"+arg0);
  }
}

spring_context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 default-autowire="byType"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.zking.ioc.web.UserAction" id="userAction">
<!--    <property name="userService" ref="userService"></property>-->
<!--<constructor-arg name="uname" value="袁辉sb"></constructor-arg>-->
<!--    <constructor-arg name="age" value="11"></constructor-arg>-->
<!--    <constructor-arg name="hobby" >-->
<!--        <list>-->
<!--            <value>-->
<!--                农村-->
<!--            </value>-->
<!--            <value>-->
<!--                农村-->
<!--            </value>-->
<!--            <value>-->
<!--                农村-->
<!--            </value>-->
<!--        </list>-->
<!--    </constructor-arg>-->
</bean>
    <bean class="com.zking.ioc.web.GoodsAction" id="goodsAction">
<!--        <property name="userService" ref="userService"></property>-->
<!--    <property name="gname" value="雨伞"></property>-->
<!--        <property name="age" value="1"></property>-->
<!--        <property name="peoples" >-->
<!--            <list>-->
<!--                <value>男的</value>-->
<!--                <value>女的</value>-->
<!--            </list>-->
<!--        </property>-->
    </bean>
<bean class="com.zking.ioc.impl.UserServiceImpl1" id="userService"></bean>
    <bean class="com.zking.aop.biz.impl.BookBizImpl" id="bookBiz"></bean>
<bean class="com.zking.aop.advice.MyMethodBeforeAdvice" id="methodBeforeAdvice"></bean>
    <bean class="com.zking.aop.advice.MyAfterReturningAdvice" id="myAfterReturningAdvice"></bean>
    <bean class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" id="methodPointcutAdvisor">
        <property name="advice"  ref="myAfterReturningAdvice"></property>
        <property name="pattern" value=".*buy"></property>
    </bean>
    <bean class="org.springframework.aop.framework.ProxyFactoryBean" id="bookProxy">
        <property name="target" ref="bookBiz"></property>
        <property name="proxyInterfaces">
            <list>
                <value>com.zking.aop.biz.IBookBiz</value>
            </list>
        </property>
        <property name="interceptorNames">
            <list>
                <value>methodBeforeAdvice</value>
<!--                <value>myAfterReturningAdvice</value>-->
                <value>methodPointcutAdvisor</value>
                <value>methodInterceptor</value>
                <value>myThrowsAdvice</value>
            </list>
        </property>
    </bean>
</beans>

6.环绕通知

package com.zking.aop.advice;
import java.util.Arrays;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
/**
 * 环绕通知
 *  包含了前置和后置通知
 * 
 * @author Administrator
 *
 */
public class MyMethodInterceptor implements MethodInterceptor {
  @Override
  public Object invoke(MethodInvocation arg0) throws Throwable {
    String target = arg0.getThis().getClass().getName();
    String methodName = arg0.getMethod().getName();
    String args = Arrays.toString(arg0.getArguments());
    System.out.println("【环绕通知调用前:】:"+target+"."+methodName+"("+args+")被调用了");
//    arg0.proceed()就是目标对象的方法
    Object proceed = arg0.proceed();
    System.out.println("【环绕通知调用后:】:该方法被调用后的返回值为:"+proceed);
    return proceed;
  }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 default-autowire="byType"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.zking.ioc.web.UserAction" id="userAction">
<!--    <property name="userService" ref="userService"></property>-->
<!--<constructor-arg name="uname" value="袁辉sb"></constructor-arg>-->
<!--    <constructor-arg name="age" value="11"></constructor-arg>-->
<!--    <constructor-arg name="hobby" >-->
<!--        <list>-->
<!--            <value>-->
<!--                农村-->
<!--            </value>-->
<!--            <value>-->
<!--                农村-->
<!--            </value>-->
<!--            <value>-->
<!--                农村-->
<!--            </value>-->
<!--        </list>-->
<!--    </constructor-arg>-->
</bean>
    <bean class="com.zking.ioc.web.GoodsAction" id="goodsAction">
<!--        <property name="userService" ref="userService"></property>-->
<!--    <property name="gname" value="雨伞"></property>-->
<!--        <property name="age" value="1"></property>-->
<!--        <property name="peoples" >-->
<!--            <list>-->
<!--                <value>男的</value>-->
<!--                <value>女的</value>-->
<!--            </list>-->
<!--        </property>-->
    </bean>
<bean class="com.zking.ioc.impl.UserServiceImpl1" id="userService"></bean>
    <bean class="com.zking.aop.biz.impl.BookBizImpl" id="bookBiz"></bean>
<bean class="com.zking.aop.advice.MyMethodBeforeAdvice" id="methodBeforeAdvice"></bean>
    <bean class="com.zking.aop.advice.MyAfterReturningAdvice" id="myAfterReturningAdvice"></bean>
    <bean class="com.zking.aop.advice.MyMethodInterceptor" id="methodInterceptor"></bean>
    <bean class="com.zking.aop.advice.MyThrowsAdvice" id="myThrowsAdvice"></bean>
    <bean class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" id="methodPointcutAdvisor">
        <property name="advice"  ref="myAfterReturningAdvice"></property>
        <property name="pattern" value=".*buy"></property>
    </bean>
    <bean class="org.springframework.aop.framework.ProxyFactoryBean" id="bookProxy">
        <property name="target" ref="bookBiz"></property>
        <property name="proxyInterfaces">
            <list>
                <value>com.zking.aop.biz.IBookBiz</value>
            </list>
        </property>
        <property name="interceptorNames">
            <list>
                <value>methodBeforeAdvice</value>
<!--                <value>myAfterReturningAdvice</value>-->
                <value>methodPointcutAdvisor</value>
                <value>methodInterceptor</value>
                <value>myThrowsAdvice</value>
            </list>
        </property>
    </bean>
</beans>

7.sping异常通知

package com.zking.aop.advice;
import org.springframework.aop.ThrowsAdvice;
import com.zking.aop.exception.PriceException;
/**
 * 出现异常执行系统提示,然后进行处理。价格异常为例
 * @author Administrator
 *
 */
public class MyThrowsAdvice implements ThrowsAdvice {
  public void afterThrowing(PriceException ex) {
    System.out.println("【异常通知】:当价格发生异常,那么执行此处代码块!!!");
  }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 default-autowire="byType"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.zking.ioc.web.UserAction" id="userAction">
<!--    <property name="userService" ref="userService"></property>-->
<!--<constructor-arg name="uname" value="袁辉sb"></constructor-arg>-->
<!--    <constructor-arg name="age" value="11"></constructor-arg>-->
<!--    <constructor-arg name="hobby" >-->
<!--        <list>-->
<!--            <value>-->
<!--                农村-->
<!--            </value>-->
<!--            <value>-->
<!--                农村-->
<!--            </value>-->
<!--            <value>-->
<!--                农村-->
<!--            </value>-->
<!--        </list>-->
<!--    </constructor-arg>-->
</bean>
    <bean class="com.zking.ioc.web.GoodsAction" id="goodsAction">
<!--        <property name="userService" ref="userService"></property>-->
<!--    <property name="gname" value="雨伞"></property>-->
<!--        <property name="age" value="1"></property>-->
<!--        <property name="peoples" >-->
<!--            <list>-->
<!--                <value>男的</value>-->
<!--                <value>女的</value>-->
<!--            </list>-->
<!--        </property>-->
    </bean>
<bean class="com.zking.ioc.impl.UserServiceImpl1" id="userService"></bean>
    <bean class="com.zking.aop.biz.impl.BookBizImpl" id="bookBiz"></bean>
<bean class="com.zking.aop.advice.MyMethodBeforeAdvice" id="methodBeforeAdvice"></bean>
    <bean class="com.zking.aop.advice.MyAfterReturningAdvice" id="myAfterReturningAdvice"></bean>
    <bean class="com.zking.aop.advice.MyMethodInterceptor" id="methodInterceptor"></bean>
    <bean class="com.zking.aop.advice.MyThrowsAdvice" id="myThrowsAdvice"></bean>
    <bean class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" id="methodPointcutAdvisor">
        <property name="advice"  ref="myAfterReturningAdvice"></property>
        <property name="pattern" value=".*buy"></property>
    </bean>
    <bean class="org.springframework.aop.framework.ProxyFactoryBean" id="bookProxy">
        <property name="target" ref="bookBiz"></property>
        <property name="proxyInterfaces">
            <list>
                <value>com.zking.aop.biz.IBookBiz</value>
            </list>
        </property>
        <property name="interceptorNames">
            <list>
                <value>methodBeforeAdvice</value>
<!--                <value>myAfterReturningAdvice</value>-->
                <value>methodPointcutAdvisor</value>
                <value>methodInterceptor</value>
                <value>myThrowsAdvice</value>
            </list>
        </property>
    </bean>
</beans>

8.Spring的过滤通知

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 default-autowire="byType"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.zking.ioc.web.UserAction" id="userAction">
<!--    <property name="userService" ref="userService"></property>-->
<!--<constructor-arg name="uname" value="袁辉sb"></constructor-arg>-->
<!--    <constructor-arg name="age" value="11"></constructor-arg>-->
<!--    <constructor-arg name="hobby" >-->
<!--        <list>-->
<!--            <value>-->
<!--                农村-->
<!--            </value>-->
<!--            <value>-->
<!--                农村-->
<!--            </value>-->
<!--            <value>-->
<!--                农村-->
<!--            </value>-->
<!--        </list>-->
<!--    </constructor-arg>-->
</bean>
    <bean class="com.zking.ioc.web.GoodsAction" id="goodsAction">
<!--        <property name="userService" ref="userService"></property>-->
<!--    <property name="gname" value="雨伞"></property>-->
<!--        <property name="age" value="1"></property>-->
<!--        <property name="peoples" >-->
<!--            <list>-->
<!--                <value>男的</value>-->
<!--                <value>女的</value>-->
<!--            </list>-->
<!--        </property>-->
    </bean>
<bean class="com.zking.ioc.impl.UserServiceImpl1" id="userService"></bean>
    <bean class="com.zking.aop.biz.impl.BookBizImpl" id="bookBiz"></bean>
<bean class="com.zking.aop.advice.MyMethodBeforeAdvice" id="methodBeforeAdvice"></bean>
    <bean class="com.zking.aop.advice.MyAfterReturningAdvice" id="myAfterReturningAdvice"></bean>
    <bean class="com.zking.aop.advice.MyMethodInterceptor" id="methodInterceptor"></bean>
    <bean class="com.zking.aop.advice.MyThrowsAdvice" id="myThrowsAdvice"></bean>
    <bean class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" id="methodPointcutAdvisor">
        <property name="advice"  ref="myAfterReturningAdvice"></property>
        <property name="pattern" value=".*buy"></property>
    </bean>
    <bean class="org.springframework.aop.framework.ProxyFactoryBean" id="bookProxy">
        <property name="target" ref="bookBiz"></property>
        <property name="proxyInterfaces">
            <list>
                <value>com.zking.aop.biz.IBookBiz</value>
            </list>
        </property>
        <property name="interceptorNames">
            <list>
                <value>methodBeforeAdvice</value>
<!--                <value>myAfterReturningAdvice</value>-->
                <value>methodPointcutAdvisor</value>
                <value>methodInterceptor</value>
                <value>myThrowsAdvice</value>
            </list>
        </property>
    </bean>
</beans>

不管是前置通知、后置通知、环绕通知、异常通知、过滤通知,代码都是非业务核心代码,如日志、事务的管理(开启,提交、回滚)

总结:专业术语

目标对象 + 连接点 + 通知 = 代理

切入点是多个连接点的集合

通知 + 切入点= 适配器

总结:

通过本文的介绍,我们了解了Spring AOP的特点、专业术语以及不同类型的通知。Spring

AOP提供了一种优雅的方式来处理横切关注点,提高了代码的可维护性和可重用性。不同类型的通知可以满足不同的需求,开发人员可以根据具体场景选择合适的通知类型。通过深入学习和应用Spring

AOP,我们可以更好地设计和开发高质量的Java应用程序。

目录
相关文章
|
3月前
|
Java
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
这篇文章是Spring5框架的实战教程,深入讲解了AOP的基本概念、如何利用动态代理实现AOP,特别是通过JDK动态代理机制在不修改源代码的情况下为业务逻辑添加新功能,降低代码耦合度,并通过具体代码示例演示了JDK动态代理的实现过程。
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
|
1天前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
21天前
|
存储 缓存 Java
Spring高手之路23——AOP触发机制与代理逻辑的执行
本篇文章深入解析了Spring AOP代理的触发机制和执行流程,从源码角度详细讲解了Bean如何被AOP代理,包括代理对象的创建、配置与执行逻辑,帮助读者全面掌握Spring AOP的核心技术。
28 3
Spring高手之路23——AOP触发机制与代理逻辑的执行
|
6天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
18 1
|
2天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
7 0
|
2月前
|
设计模式 Java 测试技术
spring复习04,静态代理动态代理,AOP
这篇文章讲解了Java代理模式的相关知识,包括静态代理和动态代理(JDK动态代理和CGLIB),以及AOP(面向切面编程)的概念和在Spring框架中的应用。文章还提供了详细的示例代码,演示了如何使用Spring AOP进行方法增强和代理对象的创建。
spring复习04,静态代理动态代理,AOP
|
7天前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
24 0
|
1月前
|
Java 编译器 Spring
Spring AOP 和 AspectJ 的区别
Spring AOP和AspectJ AOP都是面向切面编程(AOP)的实现,但它们在实现方式、灵活性、依赖性、性能和使用场景等方面存在显著区别。‌
51 2
|
1月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
118 9
|
2月前
|
XML 监控 Java
Spring Cloud全解析:熔断之Hystrix简介
Hystrix 是由 Netflix 开源的延迟和容错库,用于提高分布式系统的弹性。它通过断路器模式、资源隔离、服务降级及限流等机制防止服务雪崩。Hystrix 基于命令模式,通过 `HystrixCommand` 封装对外部依赖的调用逻辑。断路器能在依赖服务故障时快速返回备选响应,避免长时间等待。此外,Hystrix 还提供了监控功能,能够实时监控运行指标和配置变化。依赖管理方面,可通过 `@EnableHystrix` 启用 Hystrix 支持,并配置全局或局部的降级策略。结合 Feign 可实现客户端的服务降级。
153 23