SpringAOP的5种增强类型应用讲解

2023-10-26

SpringAOP的5种增强类型应用讲解

一.前言
spring框架中为我们提供的增强包括针对切面的增强和针对切入点的增强,对一个方法的增强底层使用的是动态代理,所以在学习springAop增强之前大家有必要先了解一下动态代理相关内容;
本文分别采用继承接口和使用配置文件来实现增强。

二.springAOP自带的增强类型
按照增强在目标类方法中的连接点位置,可以分为5种:
1.前置增强:org.springframework.aop.BeforeAdvice是前置增强顶层接口,因为Spring只持方法的增强,其子接口MethodBeforeAdvice是目前可用的前置增强。表示在目标方法执行前实施增强。

2.后置增强:org.springframework.aop.AfterReturningAdvice是目前可用的后置增强,表示在目标方法执行后实施增强。

3.环绕增强:org.aopalliance.intercept.MethodInterceptor代表了环绕增强,表示在目标方法执行前后实施增强。直接使用了AOP联盟定义的接口。

4.异常抛出增强:org.springframework.aop.ThrowsAdvice代表了异常抛出增强,表示在目标方法抛出异常后实施增强。

5.引介增强:org.springframework.aop.IntroductionInterceptor代表引介增强,表示在目标类中添加一些新的方法和属性。

三.五种增强的具体使用方法

一,前置增强

1,我们先不用配置文件,先使用原始的方法–继承底层接口的形式来实现增强。配置文件或者注解的底层也是使用这些接口来生成代理的。
首先,创建maven工程,利用pom文件自动导入所需的包。
然后,编写目标类和增强类。
1实现接口方式实现前置增强

package com.jimmy.mvn.a.BeforeAdvice;

/**
 * 目标类(被增强类),say方法将被增强,其中say方法执行前后都可以是切入点(point-cut)
 */
public class Target {
    public void say() {
        System.out.println("我需要被增强!");
    }
}


package com.jimmy.mvn.a.BeforeAdvice;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;

/**
 * 增强类,用于在切入点处进行增强
 * 
 * 该类实现了MethodBeforeAdvice接口,并实现了唯一的before()方法。
 * 
 */
public class Advice implements MethodBeforeAdvice{

    /**
     * method是目标类的方法
     * args是目标类方法的入参
     * target是目标类实例
     * 
     * before()方法会在目标类方法调用前执行。
     */
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("我是前置增强,很高兴为你服务!");
    }   
}


//测试方法
package com.jimmy.mvn.SpringAdvice;

import org.springframework.aop.framework.ProxyFactory;

import com.jimmy.mvn.a.BeforeAdvice.Advice;
import com.jimmy.mvn.a.BeforeAdvice.Target;

public class BeforeAdviceTest {
    public static void main(String[] args) {

        Target target = new Target();  // 目标类对象
        Advice advice = new Advice();  // 增强类对象

        ProxyFactory pf = new ProxyFactory(); // Spring提供的代理工厂
        pf.setTarget(target);  // 设置代理目标
        pf.addAdvice(advice);  // 为代理目标添加增强

        Target target2 = (Target) pf.getProxy(); // 生成代理实例
        target2.say();  // 代理对象再调用say()方法就能产生前置增强
    }
}

2使用xml配置文件的方式实现前置增强
首先,还是先创建maven工程,自动导入需要的包。
然后,创建目标类和增强类。

package com.jimmy.mvn.a.BeforeAdviceXML;

/**
 * 目标类。同上,很普通的一个类,实际开发中往往是一个业务类 
 */
public class Target {
    public void say() {
        System.out.println("我需要被增强!");
    }
}

package com.jimmy.mvn.a.BeforeAdviceXML;

/**
 * 增强类,该类不再继承任何接口,就是个普通的POJO类
 * 
 * 从外观上看,根本看不出来这个类要干嘛 
 */
public class Advice {   
    public void beforeAdvice() {
        System.out.println("我是前置增强,很高兴为你服务!");
    }
}

然后再针对切入点编写配置文件

<?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-4.0.xsd
                           http://www.springframework.org/schema/aop
                           http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

    <bean id="target" class="com.jimmy.mvn.a.BeforeAdviceXML.Target"></bean>
    <bean id="advice" class="com.jimmy.mvn.a.BeforeAdviceXML.Advice"></bean>

    <aop:config>
        <aop:aspect ref="advice">           
            <aop:before method="beforeAdvice" pointcut="execution(* com.jimmy.mvn.a.BeforeAdviceXML.*.*(..))"/>         
        </aop:aspect>
    </aop:config>     
</beans>

解读上面的配置文件:
1,定义2个bean,target是增强后的bean,而advice是为了在文件中被切面引用。
2,aop:config,AOP设置的最外层元素,一个文件可以有多个aop:config,不同的aop:config可以采用不同的代理技术。
3,aop:aspect,改元素定义一个切面,其ref属性用来引用增强类的bean。
4,aop:before,定义一个前置增强,method属性是增强类bean中的方法名;pointcut属性是一个“切点表达式”,该表达式用于匹配“切入点”,即需要被增强的bean的方法。
编写测试类

package com.jimmy.mvn.SpringAdvice;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.jimmy.mvn.a.BeforeAdviceXML.Target;

public class BeforeAdviceXMLTest {
    public static void main(String[] args) {

        String path = "com/jimmy/mvn/a/BeforeAdviceXML/smart-context.xml";
        ApplicationContext app1 = new ClassPathXmlApplicationContext(path);
        Target target = (Target) app1.getBean("target");
        target.say();
    }

注:配置文件配置AOP时,有很多种写法,还可以将“切点表达式”单独命名,如下:

<bean id="target" class="com.jimmy.mvn.a.BeforeAdviceXML.Target"></bean>
<bean id="advice" class="com.jimmy.mvn.a.BeforeAdviceXML.Advice"></bean>

<aop:config>
    <aop:aspect ref="advice">
        <aop:pointcut id="pointcut" expression="execution(* com.jimmy.mvn.a.BeforeAdviceXML.*.*(..))"/>
        <aop:before method="beforeAdvice" pointcut-ref="pointcut"/>
    </aop:aspect>
</aop:config>  

当然,还可以将aop:pointcut提取出来,单独写,可以供很多切面aop:aspect引用:

 <bean id="target" class="com.jimmy.mvn.a.BeforeAdviceXML.Target"></bean>
    <bean id="advice" class="com.jimmy.mvn.a.BeforeAdviceXML.Advice"></bean>

    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(* com.jimmy.mvn.a.BeforeAdviceXML.*.*(..))"/>
<--配置两个相同的beforeAdvice就可以在执行这个方法之前执行两次增强-->
        <aop:aspect ref="advice">
            <aop:before method="beforeAdvice" pointcut-ref="pointcut"/>
        </aop:aspect>
        <aop:aspect ref="advice">
            <aop:before method="beforeAdvice" pointcut-ref="pointcut"/>
        </aop:aspect>
    </aop:config>   

3基于Annotation注解方式进行增强
首先,创建maven工程,自动导入所需要的包
然后,编写目标类和增强类。

package com.jimmy.mvn.a.BeforeAdviceAnnotation;
/**
 * 目标类。同上,很普通的一个类,实际开发中往往是一个业务类 
 */
public class Target {
    public void say() {
        System.out.println("我还要被增强!");
    }
}

package com.jimmy.mvn.a.BeforeAdviceAnnotation;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

/**
 * 增强类,使用注解开发,该类同样不再继承任何接口
 * 
 * @Aspect用于将类标识为一个切面
 * @Before("execution(...)")用于将方法标识为增强方法,"切入点表达式"用于定位被切入方法。
 */
@Aspect
public class Advice {   

    @Before("execution(* *..Target.*(..))")
    public void beforeAdvice() {
        System.out.println("我是前置增强,很高兴为你服务!");
    }
}

再然后,我们仍然需要配置一点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-4.0.xsd
                           http://www.springframework.org/schema/aop
                           http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

    <aop:aspectj-autoproxy/>
    <bean id="target" class="com.jimmy.mvn.a.BeforeAdviceAnnotation.Target"></bean>
    <bean id="advice" class="com.jimmy.mvn.a.BeforeAdviceAnnotation.Advice"></bean>       
</beans>

解读上述配置文件,文件中只有短短的3行配置。
1,aop:aspectj-autoproxy自动为Spring容器中那些匹配@Aspect切面的bean创建代理,完成切面织入。
2,两个bean,其中target供测试时getBean方法调用;advice可以没有id,其为自动创建代理时使用。
最后,编写测试类

package com.jimmy.mvn.SpringAdvice;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.jimmy.mvn.a.BeforeAdviceAnnotation.Target;

public class BeforeAdviceAnnotationTest1 {
    public static void main(String[] args) {        
        String path = "com/jimmy/mvn/a/BeforeAdviceAnnotation/smart-context.xml";
        ApplicationContext app1 = new ClassPathXmlApplicationContext(path);
        Target target = (Target) app1.getBean("target");
        target.say();
    }
}

二,后置增强

跟前置增强的使用一样一样的。

三,环绕增强

1,基于MethodIntercepter接口方式实现环绕增强
首先,创建maven工程,自动导入jar包。
然后,创建目标类和增强类。

package com.jimmy.mvn.b.AroundAdvice;
/**
 * 目标类,普通POJO类,其say方法被增强。
 */
public class Target {
    public void say(){
        System.out.println("我需要前后都增强!");
    }
}

package com.jimmy.mvn.b.AroundAdvice;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

/**
 * 增强类实现了MethodInterceptor接口,并实现了其中的invoke方法
 */
public class AroundAdvice implements MethodInterceptor{

    /**
     * 该方法截获目标类方法的执行,并在前后加上横断逻辑
     */
    public Object invoke(MethodInvocation invocation) throws Throwable {

        System.out.println("我是前置增强,很高兴为你服务!"); // 前置增强
        Object obj = invocation.proceed(); // 通过反射机制调用目标方法
        System.out.println("我是后置增强,很高兴为你服务!"); // 后置增强
        return obj;
    }
}

最后,编写测试类,该测试类跟前置增强时用的一样。

package com.jimmy.mvn.SpringAdvice;

import org.springframework.aop.framework.ProxyFactory;

import com.jimmy.mvn.b.AroundAdvice.AroundAdvice;
import com.jimmy.mvn.b.AroundAdvice.Target;

public class AroundAdviceTest {
    public static void main(String[] args) {
        Target target = new Target();
        AroundAdvice advice = new AroundAdvice();

        ProxyFactory pf = new ProxyFactory();
        pf.setTarget(target);
        pf.addAdvice(advice);

        Target target2 = (Target) pf.getProxy();
        target2.say();
    }
}

2.基于xml方式实现spring的环绕增强
首先,创建maven工程,自动导入jar包。
然后,创建目标类和增强类。

package com.jimmy.mvn.b.AroundAdviceXML;
/**
 * 目标类,跟上面是一样一样的。
 */
public class Target {
    public void say() {
        System.out.println("我还要前后增强!");
    }
}

package com.jimmy.mvn.b.AroundAdviceXML;

import org.aspectj.lang.ProceedingJoinPoint;

/**
 * 增强类,普通POJO类,不再继承任何接口。
 * 自定义环绕增强方法,由于是要在切入点前后横插入逻辑,所以将ProceedingJoinPoint接口对象pjp作为方法的入参。
 * pjp.proceed()方法通过反射机制调用目标方法。
 * 在pjp.proceed()前后加上横断逻辑。
 */
public class AroundAdvice {

    public void myAroundAdvice(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("我是前置增强,很高兴为你服务!");
        pjp.proceed();
        System.out.println("我是后置增强,很高兴为你服务!");
    }
}

再然后,编写配置文件,smart-context.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-4.0.xsd
                           http://www.springframework.org/schema/aop
                           http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

    <bean id="target" class="com.jimmy.mvn.b.AroundAdviceXML.Target"></bean>
    <bean id="advice" class="com.jimmy.mvn.b.AroundAdviceXML.AroundAdvice"></bean>

    <aop:config>
        <aop:aspect ref="advice">           
            <aop:around method="myAroundAdvice" pointcut="execution(* *..Target.*(..))"/>           
        </aop:aspect>
    </aop:config>     
</beans>

我们看到,配置文件跟前置增强的差别不大,无非是把aop:before换成了aop:around。

最后,编写测试类。

package com.jimmy.mvn.SpringAdvice;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.jimmy.mvn.b.AroundAdviceXML.Target;

public class AroundAdviceXMLTest {
    public static void main(String[] args) {
        String path = "com/jimmy/mvn/b/AroundAdviceXML/smart-context.xml";
        ApplicationContext app1 = new ClassPathXmlApplicationContext(path);
        Target target = (Target) app1.getBean("target");
        target.say();
    }
}

3.基于Annotation方式实现环绕增强
首先,创建maven工程,自动导入jar包。
然后,创建目标类和增强类。

package com.jimmy.mvn.b.AroundAdviceAnnotation;

public class Target {
    public void say() {
        System.out.println("我还要前后增强!");
    }
}

package com.jimmy.mvn.b.AroundAdviceAnnotation;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class AroundAdvice {
    @Around(value = "execution(* *..Target.*(..))")
    public void myAroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("我是前置增强,很高兴为你服务!");
        pjp.proceed();
        System.out.println("我是后置增强,很高兴为你服务!");
    }
}

再然后,编写配置文件,smart-context.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-4.0.xsd
                           http://www.springframework.org/schema/aop
                           http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

    <aop:aspectj-autoproxy/>
    <bean id="target" class="com.jimmy.mvn.b.AroundAdviceAnnotation.Target"></bean>
    <bean id="advice" class="com.jimmy.mvn.b.AroundAdviceAnnotation.AroundAdvice"></bean>  
</beans>

最后,编写测试代码

package com.jimmy.mvn.SpringAdvice;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.jimmy.mvn.b.AroundAdviceAnnotation.Target;

public class AroundAdviceAnnotationTest {
    public static void main(String[] args) {
        String path = "com/jimmy/mvn/b/AroundAdviceAnnotation/smart-context.xml";
        ApplicationContext app1 = new ClassPathXmlApplicationContext(path);
        Target target = (Target) app1.getBean("target");
        target.say();
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringAOP的5种增强类型应用讲解 的相关文章

  • JaxB2Marshaller 未将 XML 绑定到 Kotlin 数据类

    我正在编写一个批处理作业来解析 XML 提取字段并将它们保存在数据库中 解析 XML 时 它会选取 2 个根元素 但将所有字段保留为空 因此在我的数据库中 我有 2 条记录将为空字段 似乎无法弄清楚为什么它无法读取元素 TIA Bean f
  • Java 中具有级别顺序插入的完整二叉搜索树

    我们接到一个任务 需要编码 二叉搜索树 那个树has to be complete not perfect 这意味着所有不在最低级别或次低级别的节点都应该有 2 个子节点 而最低级别的节点应尽可能远离左侧 我们需要插入到树中等级顺序 所以如
  • Java泛型类型要么扩展要么是父类

    我正在寻找一些如下所示的代码 public class Parent
  • Android - 检测电容式触摸屏上的触摸压力?

    我听说过 MotionEvent e float press e getPressure 但这只会在没有触摸时返回 0 当我的手指触摸屏幕时返回 1 是否可以找到手指在触摸电容屏上施加的压力值 或者我的预感是否正确 即这只适用于电阻屏幕 M
  • Gradle中的build-by-convention深度解释是什么?

    The 摇篮用户指南 http www gradle org docs current userguide userguide html经常提到 Gradle 是陈述性的和用途按惯例构建 这是什么意思 据我了解 这意味着 例如 在java插
  • 在 Spring Security 中创建自定义 PostAuthorize 方法

    我正在尝试创建一个自定义方法 用于预 后授权调用 如下所示 public class CustomLSecurityExpressionHandler extends DefaultMethodSecurityExpressionHandl
  • 高负载应用程序的数据库可扩展性?

    我见过一些应用程序拥有集群 Web 服务器 例如 10 到 20 个服务器 以具有可扩展性 可以在其中分发 在网络服务器之间加载 但我总是看到所有网络服务器都使用单个数据库 现在考虑任何电子商务或铁路 Web 应用程序 其中有数百万用户在任
  • Spring Boot 删除 Whitelabel 错误页面

    我正在尝试删除白色标签错误页面 所以我所做的是为 error 创建了一个控制器映射 RestController public class IndexController RequestMapping value error public
  • 从java应用程序发送电子邮件时出现异常:中继被拒绝

    我们正在使用 Spring Mail 从 java 应用程序发送电子邮件 org springframework mail javamail JavaMailSenderImpl Spring电子邮件配置是
  • Bean 属性不可读或具有无效的 getter 方法

    因此 我的任务是为注册表路由编写一个简单的 Web 应用程序 使用 Spring MVC 所以我有 路线 类 我想在其中保留起点 终点和中间点列表 但我不明白如何将值从 jsp 放入列表 例如使用 jstl 所以我决定解析一个字符串 pub
  • 在同一个容器但不同的耳朵中使用本地EJB

    我正在尝试在同一个 Glassfish 但不同的耳朵中使用本地 EJB 但是Glassfish找不到本地EJB或者无法消费 我读到了这个 根据 JavaEE 教程 Local bean 的客户端 必须在与其访问的企业 bean 相同的 JV
  • 无法安装 JDK 9,因为“另一个 Java 安装正在进行中”

    我已经在 Windows 10 x64 上使用 JDK 9 一段时间了 但是当我去安装最新的早期版本 b174 时 我首先卸载了以前的版本 像往常一样 然后运行新的安装程序 它失败并显示一个消息框 显示 另一个 Java 安装正在进行中 您
  • 使用 JNDI 添加 LDAP 条目

    我正在尝试使用 JNDI 将条目添加到 LDAP 服务器 我可以成功地从 LDAP 服务器读取条目 但是当我尝试添加新条目时出现错误 我检查了各种方法但都失败了 private String getUserAttribs String se
  • Jlist 自定义渲染器

    我正在尝试添加一个我猜你会称其为列表中每个项目的子列表 我构建了一个自定义渲染器 它提供以下输出 正如你所看到的 有些东西不对劲 我没能找到问题的答案 我猜我需要更改面板布局中的某些内容才能获得正确的结果 但不知道是什么 https i s
  • 无法使用 Jsoup HTML 解析器 Java 实现某些功能

    我无法使用 Jsoup Java 库解析以下场景的一些文本 1 This is b My Text b some other b b text as well b b b non empty tag1 b other text 预期输出 s
  • 从 Apache Kafka 中的主题删除消息

    所以我是 Apache Kafka 的新手 我正在尝试创建一个简单的应用程序 以便我可以更好地理解 API 我知道这个问题在这里被问了很多 但是如何清除存储在主题上的消息 记录 我看到的大多数答案都说要更改消息保留时间或删除并重新创建主题
  • Apache Beam:如何在使用重复数据删除功能时解决“ParDo 需要确定性密钥编码器才能使用状态和计时器”

    我正在尝试使用 Apache Beam 的重复数据删除功能对来自 Google Cloud Pubsub 的输入消息进行重复数据删除 但是 我创建后遇到错误KV
  • Android 调整图片大小

    我的图像存储在 SD 卡上 每个大小约为 4MB 我想调整每个的大小 而不是将其设置为 ImageView 但我不能使用BitmapFactory decodeFile path 因为异常 java lang OutOfMemoryErro
  • Java 需要一个 FileSet 包/类

    任何人都可以建议 Java 中的 FileSet 包 类吗 我所说的 FileSet 是指文件和目录的集合以及正则表达式支持的包含和排除规则 类似于 Apache Ant 谢谢 Apache 公共 IO文件工具 http commons a
  • JVM锯齿状空闲进程

    我目前正在进行一项涉及 JVM 及其内存使用工作原理的研究 我不明白的是 JVM在空闲时用什么填充它的内存 只是为了在堆几乎达到时释放它 为什么使用的内存不只有一条平线 顺便说一句 这个 java 应用程序托管在 glassfish 上 但

随机推荐

  • 竖式问题 rust解法

    竖式问题 输入一个数字集合 数字之间没有空格 找出所有形如abc de 三位数乘以两位数 的算式 在完整的竖式中 所有数字都属于这个数字集合 输出所有竖式 每个竖式前应有编号 之后应有一个空行 样例输入 2357 输出 lt 1 gt 77
  • python中add函数_如何使用python中的add函数?

    之前向大家介绍过python中的求和函数sum函数 numpy中的sum函数 对于数组可以指定维度进行相加 numpy中还有另一种求和运算方法 即add函数 add函数不仅作用于numpy中加法运算 还用于set中添加元素 本文主要向大家介
  • uniapp - APP云打包、蒲公英平台发布APP的步骤

    一 uniapp 云打包 1 注册 dcloud 开发者 首先需要注册一个 dcloud 开发者的账号 dcloud开发者中心 登录 dcloud net cn 根据流程注册即可 2 云打包 已安卓为例 项目创建完成后 查看 dcloud
  • Python连接Gbase数据库

    在数据清洗和计算方面 Python比SQL的灵活性更强 本文记录使用Python读取Gbase数据库中的数据 建立数据库连接 无论什么方法读取读取或操作数据库中的数据 首先要建立数据库连接对象 import pandas as pd imp
  • 如何学习python(附实际操作方法)

    人工智能在发展 Python作为人工智能的首选语言 自然也越来越火爆 现在 Python可以说是备受程序员欢迎的编程语言了 但是 有很多同学却不知道该从何处下手 接下来小编就跟大家聊聊吧 首先 我们要准备一台电脑 Windows7 10系统
  • parted3 Linux分区命令

    原贴地址 http www junfcom cn post 184 html Parted是一个着名的命令行工具 可以轻松管理硬盘分区 它可以帮助您添加 删除 缩小和扩展磁盘分区及其上的文件系统 从第一次出来 分手已经走了很长的路 其中一些
  • 谈谈管理者绩效管理要点

    作者 李石 链接 https www zhihu com question 19626322 answer 29165823 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 在绩效管理中衡量一个管理者的绩效与
  • 2023-05-22 题目

    1 java的泛型 泛型是jdk 5 引入的 泛型就是 引用类型作为参数 本质就是参数化类型 1 类型擦除 java的泛型基本上都是在编译器这个层次来实现的 在生成的字节码文件中是不包含泛型类中的信息的 泛型参数在编译的时候被去掉的过程叫做
  • 关于安卓系统安全性的问题

    引言 很久以前有人声称使用安卓系统不安全 称其获取的用户权限过多 太过于暴露用户的隐私 很多人在贴下反讽 只是你不会使用权限管理而已 而实际上现在 很多安卓应用程序一旦禁用了某些权限就直接限制用户的使用 完全就是一种流氓姿态 限制权限已经不
  • 前端学习路线(2023)

    这个前端学习路线看起来很详细和全面 涵盖了从基础知识到高级框架 从单机开发到全栈项目 从混合应用到原生应用 从性能优化到架构设计的各个方面 如果你能够按照这个路线学习和实践 我相信你一定能够成为一名优秀的前端工程师 不过 我也要提醒你 这个
  • ModuleNotFoundError: No module named 'encodings'

    问题描述 Fatal Python error Py Initialize unable to load the file system codec ModuleNotFoundError No module named encodings
  • 三极管和MOS管的使用及区别

    1 三极管 单片机IO口输出高电平时 三极管导通 单片机IO口输出低电平时 三极管截止 1 三极管是电流控制型元件 三极管的BE之间可以理解为存在一个二极管的通路 当给B加高电平时 BE之间就会产生持续的电流 维持三极管打开的条件就是BE之
  • 101.对称二叉树

    给定一个二叉树 检查它是否是镜像对称的 例如 二叉树 1 2 2 3 4 4 3 是对称的 1 2 2 3 4 4 3 但是下面这个 1 2 2 null 3 null 3 则不是镜像对称的 1 2 2 3 3 方法1 根左右遍历一次树得到
  • 微信小程序个人简历界面(编辑版)

    微信小程序个人简历界面 可编辑修改 包含全部源码 1 微信小程序实现简单的个人简历界面 包含基本信息 教育背景 获奖证书 兴趣爱好等 简历信息支持修改编辑内容 2 通过此文章 希望能带给更多学习微信小程序的伙伴们一点点经验 示例简洁 布局简
  • Linux系统编程之pthread多线程与互斥编程

    Linux系统编程之pthread多线程与互斥编程 include
  • tcp三次握手、四次挥手

    原文 https www cnblogs com qq78292959 p 3922231 html https blog csdn net qq 38950316 article details 81087809 经典的四次握手关闭图 T
  • 几款常用压测工具介绍与使用

    现在市面上的压测工具数不胜数 挑几款常用的做个简单的介绍 1 Apache ab ab是apache自带的压力测试工具 使用起来非常方便 安装 1 ab运行需要依赖apr util包 安装命令为 yum install apr util 2
  • 腾讯云短信Java调用示例(SDK3.0)

    腾讯云短信Java调用示例 SDK3 0 1 pom xml 添加以下依赖 2 需要引入的包 3 程序实例 1 pom xml 添加以下依赖
  • IDEA控制台乱码问题 maven-javadoc-plugin

    接手老项目 上来就是编译报错 一看是控制台还打印一堆乱码 所以上来百度搜到一篇不错的文章DEA控制台乱码问题 原因 解决方式 解决不了算我输 一顿操作仍然无效 不过学会了不少 后来控制台报错中发现了 maven javadoc plugin
  • SpringAOP的5种增强类型应用讲解

    SpringAOP的5种增强类型应用讲解 一 前言 spring框架中为我们提供的增强包括针对切面的增强和针对切入点的增强 对一个方法的增强底层使用的是动态代理 所以在学习springAop增强之前大家有必要先了解一下动态代理相关内容 本文