@EnableAspectJAutoProxy自动为bean创建代理对象

@EnableAspectJAutoProxy可以自动为spring容器中符合条件的bean创建代理对象,@EnableAspectJAutoProxy需要结合@Aspect注解一起使用。

案例

来一个配置

@ComponentScan
@Configuration
//开启AspectJ注解
@EnableAspectJAutoProxy
public class MainConfig {
}

来两个方法:

@Component
public class CarService {public void sayCar(){System.out.println("carService");}
}@Component
public class UserService {public void sayUser(){System.out.println("userService");}
}

来个切面:

@Aspect
@Component
public class MyAspect {@Pointcut("execution(* com.spring.beanAOP6..*(..))")public void pointCut() {}@Before("pointCut()")public void before(JoinPoint joinPoint) {MethodSignature signature = (MethodSignature) joinPoint.getSignature();String name = signature.getMethod().getName();System.out.println(String.format("进入%s方法", name));}
}

测试:

@Testpublic void testAop11(){AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);CarService carService = context.getBean("carService", CarService.class);carService.say();com.spring.beanAOP6.UserService userService = context.getBean("userService", com.spring.beanAOP6.UserService.class);userService.say();}

运行结果:

进入sayCar方法
carService
进入sayUser方法
userService

AspectJ中有几个关键信息

  • 使用@Component将这个类注册到spring容器中
  • 使用@Aspect标注这是一个AsectJ来定义通知的配置类
  • 定义切点,目前的配置。会拦截beanAOP6包中以及其子包中所有类的所有方法。
  • 定义一个前置通知,这个通知会对@Pointcut定义的切入点起效

通知执行顺序

@EnaleAspectJAutoProxy允许spring容器中通过Advisor 、@Aspect 来定义通知,当spring容器中存在多个Advisor、@Aspect时,组成的拦截器调用链顺序是什么样的呢?在介绍这个之前,我们需要先回顾一下aop中4种通知相关知识。

spring aop中4种通知(Advice)

  1. MethodInterceptor
  2. MethodBeforeAdvice
  3. AfterReturningAdvice
  4. ThrowsAdvice

所有的通知最终都需要转换成MethodInterceptor类型的通知,然后组成一个MethodInterceptor列表,我们称之为方法调用链或者拦截器链,上面列表中后面3个通过下面的转换器将其包装为MethodInterceptor类型的通知

  1. MethodBeforeAdvice -> MethodBeforeAdviceInterceptor
  2. AfterReturningAdvice -> AfterReturningAdviceInterceptor
  3. ThrowsAdvice -> ThrowsAdviceInterceptor

org.aopalliance.intercept.MethodInterceptor:方法拦截器

方法拦截器,这个比较强大,可以在方法执行前后执行一些增强操作,其他类型的通知最终都会被包装为 MethodInterceptor 来执行。

下面我们自定义一个MethodInterceptor

class MyMethodInterceptor implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("我是MethodInterceptor start");//调用invocation.proceed()执行下一个拦截器Object result = invocation.proceed();System.out.println("我是MethodInterceptor end");//返回结果return result;}
}

org.springframework.aop.MethodBeforeAdvice:方法前置通知

方法前置通知,可以在方法之前定义增强操作。

下面我们自定义一个MethodBeforeAdvice

class MyMethodBeforeAdvice implements MethodBeforeAdvice {@Overridepublic void before(Method method, Object[] args, @Nullable Object target) throws Throwable {System.out.println("我是MethodBeforeAdvice");}
}

MethodBeforeAdvice最终会被包装为MethodBeforeAdviceInterceptor类型,然后放到拦截器链中去执行,通过MethodBeforeAdviceInterceptor代码可以理解MethodBeforeAdvice的执行过程

public class MethodBeforeAdviceInterceptor implements MethodInterceptor, BeforeAdvice, Serializable {private final MethodBeforeAdvice advice;/*** Create a new MethodBeforeAdviceInterceptor for the given advice.* @param advice the MethodBeforeAdvice to wrap*/public MethodBeforeAdviceInterceptor(MethodBeforeAdvice advice) {Assert.notNull(advice, "Advice must not be null");this.advice = advice;}@Overridepublic Object invoke(MethodInvocation mi) throws Throwable {//调用MethodBeforeAdvice的before方法,执行前置通知this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis());//执行下一个拦截器return mi.proceed();}}

org.springframework.aop.AfterReturningAdvice:方法返回通知

方法返回通知,用来在方法执行完毕之后执行一些增强操作。

下面我们自定义一个AfterReturningAdvice

class MyAfterReturningAdvice implements AfterReturningAdvice {@Overridepublic void afterReturning(@Nullable Object returnValue, Method method, Object[] args, @Nullable Object target) throws Throwable {System.out.println("我是AfterReturningAdvice");}
}

AfterReturningAdvice最终会被包装为AfterReturningAdviceInterceptor类型,然后放到拦截器链中去执行,通过AfterReturningAdviceInterceptor代码可以理解AfterReturningAdvice的执行过程

public class AfterReturningAdviceInterceptor implements MethodInterceptor, AfterAdvice, Serializable {private final AfterReturningAdvice advice;public AfterReturningAdviceInterceptor(AfterReturningAdvice advice) {this.advice = advice;}@Overridepublic Object invoke(MethodInvocation mi) throws Throwable {//执行下一个拦截器,可以获取目标方法的返回结果Object retVal = mi.proceed();//调用方法返回通知的afterReturning方法,会传入目标方法的返回值等信息this.advice.afterReturning(retVal, mi.getMethod(), mi.getArguments(), mi.getThis());return retVal;}}

org.springframework.aop.ThrowsAdvice:异常通知

当目标方法发生异常时,可以通过 ThrowsAdvice 来指定需要回调的方法,我们在此可以记录一些异常信息,或者将异常信息发送到监控系统等。

下面我们自定义一个ThrowsAdvice

/*** 用来定义异常通知* 方法名必须是afterThrowing,格式参考下面2种定义* 1. public void afterThrowing(Exception ex)* 2. public void afterThrowing(Method method, Object[] args, Object target, Exception ex)*/
class MyThrowsAdvice implements ThrowsAdvice {public void afterThrowing(Method method, Object[] args, Object target, Exception ex) {System.out.println("我是ThrowsAdvice");}
}

ThrowsAdvice最终会被包装为ThrowsAdviceInterceptor类型,然后放到拦截器链中去执行,通过ThrowsAdviceInterceptor代码可以理解ThrowsAdvice的执行过程,ThrowsAdviceInterceptor 构造参数传入一个自定义的 ThrowsAdvice 对象

public class ThrowsAdviceInterceptor implements MethodInterceptor, AfterAdvice {private final Object throwsAdvice;public ThrowsAdviceInterceptor(Object throwsAdvice) {this.throwsAdvice = throwsAdvice;}@Overridepublic Object invoke(MethodInvocation mi) throws Throwable {try {return mi.proceed();} catch (Throwable ex) {//调用 ThrowsAdvice 中的 afterThrowing 方法来处理异常this.throwsAdvice.afterThrowing(。。。。);//将异常继续往外抛throw ex;}}
}

拦截器链执行过程

假如目标方法上面有好几个通知,调用目标方法执行,spring会将所有的通知转换得到一个MethodInterceptor列表,然后依次按照下面的方式执行,会先调用第一个拦截器的MethodInterceptor#invoke(MethodInvocation invocation)方法,会传递一个MethodInvocation类型的参数,在此方法中,我们可以调用MethodInvocation#processd方法去执行第二个拦截器,然后依次按照这样的过程执行,到了最后一个MethodInterceptor中,再次调用MethodInvocation#processd时,会调用目标方法。
在这里插入图片描述4种通知的执行顺序

结合上面的过程,假如目标方法上面依次添加了下面4中通知,我们来分析一下他们的执行过程

class MyMethodInterceptor implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("我是MethodInterceptor start");//调用invocation.proceed()执行下一个拦截器Object result = invocation.proceed();System.out.println("我是MethodInterceptor end");//返回结果return result;}
}class MyMethodBeforeAdvice implements MethodBeforeAdvice {@Overridepublic void before(Method method, Object[] args, @Nullable Object target) throws Throwable {System.out.println("我是MethodBeforeAdvice");}
}class MyAfterReturningAdvice implements AfterReturningAdvice {@Overridepublic void afterReturning(@Nullable Object returnValue, Method method, Object[] args, @Nullable Object target) throws Throwable {System.out.println("我是AfterReturningAdvice");}
}class MyThrowsAdvice implements ThrowsAdvice {public void afterThrowing(Method method, Object[] args, Object target, Exception ex) {System.out.println("我是ThrowsAdvice");}
}

根据通知的规定,非MethodInterceptor类型的通知,都会被包装为MethodInterceptor类型的,上面除了第一个之外,其他3个都会被转换为MethodInterceptor,转换之后变成了下面这样:

class MyMethodInterceptor implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation mi) throws Throwable {System.out.println("我是MethodInterceptor start");//调用mi.proceed()执行下一个拦截器Object retVal = mi.proceed();System.out.println("我是MethodInterceptor end");//返回结果return retVal;}
}class MyMethodBeforeAdvice implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation mi) throws Throwable {System.out.println("我是MethodBeforeAdvice");//调用mi.proceed()执行下一个拦截器Object retVal = mi.proceed();return retVal;}
}class MyAfterReturningAdvice implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation mi) throws Throwable {//调用mi.proceed()执行下一个拦截器Object retVal = mi.proceed();System.out.println("我是AfterReturningAdvice");return retVal;}
}class MyThrowsAdvice implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation mi) throws Throwable {try {//调用mi.proceed()执行下一个拦截器return mi.proceed();} catch (Throwable ex) {System.out.println("我是ThrowsAdvice");throw ex;}}
}

根据通知链的执行过程,最终变成了下面这样:

System.out.println("我是MethodInterceptor start");
System.out.println("我是MethodBeforeAdvice");
Object retVal = null;
try {retVal = 通过反射调用目标方法获取返回值;
} catch (Throwable ex) {System.out.println("我是ThrowsAdvice");throw ex;
}
System.out.println("我是AfterReturningAdvice");
System.out.println("我是MethodInterceptor end");
return retVal;

我们来个案例验证一下:

public class MyMethodInterceptor implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("MyMethodInterceptor start");Object proceed = invocation.proceed();System.out.println("MyMethodInterceptor end");return proceed;}
}public class MyMethodBeforeInterceptor implements MethodBeforeAdvice {@Overridepublic void before(Method method, Object[] args, Object target) throws Throwable {System.out.println("MyMethodBeforeInterceptor before");}
}public class MyMethodAfterInterceptor implements AfterReturningAdvice {@Overridepublic void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {System.out.println("MyMethodAfterInterceptor after");}
}public class MyMethodThrowInterceptor implements ThrowsAdvice {public void afterThrowing(Method method, Object[] args, Object target, Exception ex) {System.out.println("MyMethodThrowInterceptor");}
}
public class UserService {public void say(){System.out.println("userService --> say方法");}
}

测试:

@Testpublic void testAop12(){ProxyFactory proxyFactory = new ProxyFactory();proxyFactory.addAdvice(new MyMethodInterceptor());proxyFactory.addAdvice(new MyMethodAfterInterceptor());proxyFactory.addAdvice(new MyMethodThrowInterceptor());proxyFactory.addAdvice(new MyMethodBeforeInterceptor());proxyFactory.setTarget(new com.spring.beanAOP7.UserService());com.spring.beanAOP7.UserService proxy = (com.spring.beanAOP7.UserService) proxyFactory.getProxy();proxy.say();}

运行结果:

MyMethodInterceptor start
MyMethodBeforeInterceptor before
userService --> say方法
MyMethodAfterInterceptor after
MyMethodInterceptor end

单个@Aspect中多个通知的执行顺序

@Aspect标注的类中可以使用下面5中注解来定义通知

@Before
@Around
@After
@AfterReturning
@AfterThrowing

当单个@Aspect中定义了多种类型的通知时,@EnableAspectJAutoProxy内部会对其进行排序,排序顺序如下

@AfterThrowing
@AfterReturning
@After
@Around
@Before

下面我们来个@Aspect类,同时定义5种通知,然后来一步步分析一下其执行的属性。

@Component
public class ColorService {public String color(){System.out.println("color");return "color";}
}@ComponentScan
@Configuration
@EnableAspectJAutoProxy
public class MainConfig {}
@Aspect
@Component
public class MyAspect {@Pointcut("execution(* com.spring.beanAOP8.ColorService.*(..))")public void pc() {}@Before("pc()")public void before() {System.out.println("@Before通知!");}@Around("pc()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("@Around通知start");Object result = joinPoint.proceed();System.out.println("@Around绕通知end");return result;}@After("pc()")public void after() throws Throwable {System.out.println("@After通知!");}@AfterReturning("pc()")public void afterReturning() throws Throwable {System.out.println("@AfterReturning通知!");}@AfterThrowing("pc()")public void afterThrowing() {System.out.println("@AfterThrowing通知!");}
}
 @Testpublic void testAop13(){AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(com.spring.beanAOP8.MainConfig.class);ColorService colorService = context.getBean("colorService", ColorService.class);colorService.color();}
@Around通知start
@Before通知!
color
@AfterReturning通知!
@After通知!
@Around绕通知end

这输出好像和我们上面说的不一样的???

排序规则和输出结果都没有问题,我们分析分析

@Aspect中5种通知回顾

5种通知对应的Advice类

  • @AfterThrowing --> AspectJAfterThrowingAdvice
  • @AfterReturning --> AspectJAfterReturningAdvice
  • @After --> AspectJAfterAdvice
  • @Around --> AspectJAroundAdvice
  • @Before --> AspectJMethodBeforeAdvice

@AfterThrowing:AspectJAfterThrowingAdvice

public class AspectJAfterThrowingAdvice implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation mi) throws Throwable {try {//执行下一个拦截器return mi.proceed();} catch (Throwable ex) {//通过反射调用@AfterThrowing标注的方法//继续抛出异常throw ex;}}
}

AspectJAfterThrowingAdvice 实现了 MethodInterceptor 接口,不需要进行包装。

@AfterReturning:AspectJAfterReturningAdvice

public class AspectJAfterReturningAdvice implements AfterReturningAdvice {@Overridepublic void afterReturning(@Nullable Object returnValue, Method method, Object[] args, @Nullable Object target) throws Throwable {// 调用@AfterReturning标注的方法}
}

AspectJAfterReturningAdvice 实现了 AfterReturningAdvice 接口,是一个方法返回通知,不是MethodInterceptor类型的,所以最终需包装为MethodInterceptor类型,变成下面这样

public class AspectJAfterReturningAdvice implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation mi) throws Throwable {//执行下一个拦截器Object retVal = mi.proceed();//调用@AfterReturning标注的方法return retVal;}
}

@After:AspectJAfterAdvice

public class AspectJAfterAdvice implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation mi) throws Throwable {try {//执行下一个拦截器return mi.proceed();} finally {//调用@After标注的方法}}
}

AspectJAfterAdvice 实现了 MethodInterceptor接口,所以最终执行的时候不需要进行包装。

注意 invoke 方法内部使用了 try…finally 的方式,@After方法的调用放在了finally中,所以不管是否有异常,@After类型的通知都会被执行。

@Around:AspectJAroundAdvice

public class AspectJAroundAdvice extends AbstractAspectJAdvice implements MethodInterceptor, Serializable {@Overridepublic Object invoke(MethodInvocation mi) throws Throwable {return 调用 @Around标注的方法 ;}
}

AspectJAroundAdvice 实现了 MethodInterceptor接口,最终执行的时候也不需要进行包装。

@Before:AspectJMethodBeforeAdvice

public class AspectJMethodBeforeAdvice implements MethodBeforeAdvice, Serializable {@Overridepublic void before(Method method, Object[] args, @Nullable Object target) throws Throwable {invokeAdviceMethod(getJoinPointMatch(), null, null);}
}

AspectJMethodBeforeAdvice 实现了 MethodBeforeAdvice接口,是一个前置通知,不是MethodInterceptor类型的,所以最终需包装为MethodInterceptor类型,变成下面这样

public class AspectJMethodBeforeAdvice implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation mi) throws Throwable {//调用@Before标注的方法//执行下一个拦截器return mi.proceed();}
}

我们在来看下定义的通知

@Aspect
@Component
public class MyAspect {@Pointcut("execution(* com.spring.beanAOP8.ColorService.*(..))")public void pc() {}@Before("pc()")public void before() {System.out.println("@Before通知!");}@Around("pc()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("@Around通知start");Object result = joinPoint.proceed();System.out.println("@Around绕通知end");return result;}@After("pc()")public void after() throws Throwable {System.out.println("@After通知!");}@AfterReturning("pc()")public void afterReturning() throws Throwable {System.out.println("@AfterReturning通知!");}@AfterThrowing("pc()")public void afterThrowing() {System.out.println("@AfterThrowing通知!");}
}

我们给出的结论是,会按照下面的顺序执行

@AfterThrowing -> @AfterReturning -> @After -> @Around -> @Before

按照上面的顺序,一步步来分析。

先执行第1个通知@AfterThrowing,变成下面这样

try {//执行下一个拦截器return mi.proceed();
} catch (Throwable ex) {System.out.println("@AfterThrowing通知!");//继续抛出异常throw ex;
}

mi.processed()会执行第2个通知@AfterReturning,变成了下面这样

try {//执行下一个拦截器Object retVal = mi.proceed();System.out.println("@AfterReturning通知!");return retVal;
} catch (Throwable ex) {System.out.println("@AfterThrowing通知!");//继续抛出异常throw ex;
}

继续mi.proceed()执行第3个通知@After,变成了下面这样

try {Object result = null;try {//执行下一个拦截器result = mi.proceed();} finally {System.out.println("@After通知!");}System.out.println("@AfterReturning通知!");return retVal;
} catch (Throwable ex) {System.out.println("@AfterThrowing通知!");//继续抛出异常throw ex;
}

继续mi.proceed()执行第4个通知@Around,变成了下面这样

try {Object result = null;try {System.out.println("@Around通知start");result = joinPoint.proceed();System.out.println("@Around绕通知end");return result;} finally {System.out.println("@After通知!");}System.out.println("@AfterReturning通知!");return retVal;
} catch (Throwable ex) {System.out.println("@AfterThrowing通知!");//继续抛出异常throw ex;
}

继续joinPoint.proceed()执行第5个通知@Before,变成了下面这样

try {Object result = null;try {System.out.println("@Around通知start");System.out.println("@Before通知!");result = mi.proceed();System.out.println("@Around绕通知end");return result;} finally {System.out.println("@After通知!");}System.out.println("@AfterReturning通知!");return retVal;
} catch (Throwable ex) {System.out.println("@AfterThrowing通知!");//继续抛出异常throw ex;
}

继续joinPoint.proceed()会调用目标方法,变成了下面这样

try {Object result = null;try {System.out.println("@Around通知start");System.out.println("@Before通知!");result = // 通过反射调用目标方法;System.out.println("@Around绕通知end");return result;} finally {System.out.println("@After通知!");}System.out.println("@AfterReturning通知!");return retVal;
} catch (Throwable ex) {System.out.println("@AfterThrowing通知!");//继续抛出异常throw ex;
}

所以最终输出

@Around通知start
@Before通知!
@Around绕通知end
@After通知!
@AfterReturning通知!

@EnableAspectJAutoProxy中为通知指定顺序

@EnableAspectJAutoProxy用在spring环境中,可以通过@Aspect以及Advisor来定义多个通知,当spring容器中有多个@Aspect、Advisor时,他们的顺序是什么样的呢?

我们先看一下如何为@Aspect、自定义Advisor指定顺序。

为@Aspect指定顺序:用@Order注解

需要在@Aspect标注的类上使用@org.springframework.core.annotation.Order注解,值越小,通知的优先级越高。

为Advisor指定顺序:实现Ordered接口

自定义的Advisor通过org.springframework.core.Ordered接口来指定顺序,这个接口有个public int getOrder()方法,用来返回通知的顺序。

spring为我们提供了一个Advisor类型的抽象类org.springframework.aop.support.AbstractPointcutAdvisor,这个类实现了Ordered接口,spring中大部分Advisor会是继承AbstractPointcutAdvisor,若需要自定义Advisor,也可以继承这个类,这个类的getOrder方法比较关键,来看一下

public abstract class AbstractPointcutAdvisor implements PointcutAdvisor, Ordered, Serializable {@Nullableprivate Integer order;public void setOrder(int order) {this.order = order;}@Overridepublic int getOrder() {//若当前Advisor指定了order,则直接返回if (this.order != null) {return this.order;}//获取当前类中配置的通知对象AdviceAdvice advice = getAdvice();//若advice实现了Ordered接口,这从advice中获取通知的顺序if (advice instanceof Ordered) {return ((Ordered) advice).getOrder();}//否则通知的优先级最低,Integer.MAX_VALUEreturn Ordered.LOWEST_PRECEDENCE;}
}

Spring为我们提供了一个默认的Advisor类:DefaultPointcutAdvisor,这个类就继承了AbstractPointcutAdvisor,通常我们可以直接使用DefaultPointcutAdvisor来自定义通知。

多个@Aspect、Advisor排序规则

排序规则

1、在spring容器中获取@Aspect、Advisor类型的所有bean,得到一个列表 list1

2、对list1按照order的值升序排序,得到结果list2

3、然后再对list2中@Aspect类型的bean内部的通知进行排序,规则
@AfterThrowing -> @AfterReturning -> @After -> @Around -> @Before

4、最后运行的时候会得到上面排序产生的方法调用链列表去执行。

案例不写了,大家下去可以自己尝试一下

@EnableAspectJAutoProxy另外2个功能

这个注解还有2个参数,大家看一下下面的注释,比较简单,就不用案例演示了。

public @interface EnableAspectJAutoProxy {/*** 是否基于类来创建代理,而不是基于接口来创建代理* 当为true的时候会使用cglib来直接对目标类创建代理对象* 默认为 false:即目标bean如果有接口的会采用jdk动态代理来创建代理对象,没有接口的目标bean,会采用cglib来创建代理对象*/boolean proxyTargetClass() default false;/*** 是否需要将代理对象暴露在ThreadLocal中,当为true的时候* 可以通过org.springframework.aop.framework.AopContext#currentProxy获取当前代理对象*/boolean exposeProxy() default false;}

@EnableAspectJAutoProxy原理

@EnableAspectJAutoProxy会在spring容器中注册一个bean:AnnotationAwareAspectJAutoProxyCreator

AnnotationAwareAspectJAutoProxyCreator是BeanPostProcessor类型的,BeanPostProcessor大家应该比较熟悉了,bean后置处理器,可以在bean声明周期中对bean进行操作,比如对bean生成代理等;而AnnotationAwareAspectJAutoProxyCreator就是对符合条件的bean,自动生成代理对象,源码就这里就不细说了,有兴趣的可以从postProcessAfterInitialization方法看,比较简单。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 深度学习在三维点云上的应用(Deep Learning for 3D Point Clouds: A Survey)

    深度学习在三维点云上的应用 摘要 最近,点云由于在计算机视觉、自动驾驶和机器人技术等许多领域的广泛应用而受到越来越多的关注。深度学习作为一种主要的人工智能技术,已经成功地用于解决各种二维视觉问题。由于使用深度神经网络处理点云所面临的独特挑…...

    2024/4/27 12:11:37
  2. 自定义注解实现操作日志

    ​ 冷静 专注 集中 努力 自定义注解实现操作日志 ​ 在梳理保全中心逻辑的过程中,有业务场景需要记录过程中某些保全的操作日志,打算使用注解加切面的方式实现,此处先做个测试Demo 1.定义操作日志注解Log Retention 表示这是一个运行时注解…...

    2024/4/28 2:38:28
  3. pring-AOP

    /*** ClassName: AopTransation* Description:自定AOP 切面类 日志打印* author dongwei_qi* date 2020年6月10日**/ Component Aspect// 标识为切面类 public class AopLog {private static final Logger log LoggerFactory.getLogger(AopLog.class);Pointcut("executio…...

    2024/4/30 1:26:05
  4. kali下安装nessus漏扫工具

    1、nessus下载 2、上传到kali 解压缩dpkg -i Nessus-8.12.0-debian6_amd64.deb 然后执行命令启动 /bin/systemctl start nessusd.service 3、web登录安装 登录方式,https://kali的IP:8834 https://192.168.124.131:8834/ 通过邮箱获取激活码 https:/…...

    2024/4/27 11:00:38
  5. 2020-10-16如何分析食品是否合格了

    是指将宰后的整只猪胴体沿脊椎中线,纵向锯(劈)成两分体的猪肉。 鲜片猪肉宰后的片猪肉,经过凉肉,但不经过冷却工艺过翟的猪肉。  冻片猪肉是指冻结工艺过程,其后腿肌肉深层中心温度不高于-15℃的猪肉…...

    2024/4/27 19:04:11
  6. laravel任务调度重复执行

    文章目录项目场景问题描述原因分析解决方案项目场景 项目场景: laravel 数据库备份时任务调度重复执行 问题描述 在任何的一个项目中数据库里面的数据都是是要定时的进行备份来以防万一服务器出现问题时数据丢失。 在laravel 项目中我使用任务调度来实现数据库定时备…...

    2024/5/4 10:53:44
  7. Windows下升级git比较简单的办法

    Windows下git升级版本 1.升级 1.打开powershell 2.输入命令git update-git-for-windows 2.遇到的问题 OpenSSL SSL_read: Connection was reset, errno 10054 解决方法: git config --global http.sslVerify "false" Failed to connect to xxxx: Tim…...

    2024/4/6 8:28:47
  8. Docker 命令查询(保存好,指不定啥时候就用到了)

    Docker 命令查询 一张图总结 Docker 的命令 container事件状态图 docker命令分布图 基本语法 Docker 命令有两大类,客户端命令和服务端命令。前者是主要的操作接口,后者用来启动 Docker Daemon。 客户端命令:基本命令格式为 docker [OPT…...

    2024/4/14 21:10:38
  9. 指纹图像预处理

    指纹图像预处理是指纹识别的前提,它的好坏直接影响到指纹识别的成败,但由于指纹图像降质带来的困难,并根据指纹图像的特征提出了合理的假设,再根据假设提出了增强指纹图像对比度的算法、提取指纹有效区域的算法、根据方向信息分割图像的算法以及去除图像…...

    2024/5/6 22:34:04
  10. 多路径识别算法

    随着各省市高速公路的不断建设,基本上建成了大小规模不等的联网收费系统,在联网收费系统建设中,都面临了一个共同的问题——车辆行驶路径的识别。路径识别不仅仅涉及对每一通行车辆如何计算通行费,同时还要考虑将收入的通行费拆分…...

    2024/4/25 23:37:21
  11. 常见的反爬虫方法

    常见的反爬虫 爬虫一般分为 数据采集,处理,储存三个部分。 一般网站从三个方面反爬虫:用户请求的Headers,用户行为,网站目录和数据加载方式。前两种比较容易遇到,大多数网站都从这些角度来反爬虫。第三种…...

    2024/4/24 4:27:04
  12. Silicon labs BLE 开发介绍

    Silicon labs BLE 开发人员指南 介绍 该文档涵盖了各个方面的发展,并且是对使用C开发的所有运行Bluetooth堆栈的Wireless Gecko产品的所有人的重要参考。 该文档涵盖以下主题: “ 应用程序开发流程”部分讨论了应用程序开发流程和项目结构。 部分配置…...

    2024/4/6 8:28:42
  13. JAVA实现第n个素数的查找

    素数就是除了自己和1之外没有其他因数的数 判断条件可以是: 1.因数只有1和本身n 2.(1,n/2]中没有可以整除n的整数 3.(1,sqrt(n)]中没有可以整除n的整数 首先写一下输出1-n中的素数输出 方法一 import java.util.Scanner;public class 素数 {public static vo…...

    2024/4/29 4:50:49
  14. Solidia Technologies宣布有可能将混凝土转变为地球碳汇

    首席执行官Tom Schuler在Countdown全球启动仪式上发表TED演讲,分享预拌混凝土的技术应用 新泽西州皮斯卡特维--(美国商业资讯)--Solidia Technologies首席执行官Tom Schuler在TED和Future Stewards全球Countdown启动仪式上发表TED演讲,其间分享了将Solid…...

    2024/4/27 15:19:28
  15. DREP双周报9.16-10.15 | DREP公链开发持续优化,区块浏览器提升分析和统计功能

    亲爱的DREP社区成员: 9月下半月和10月上半月DREP更加关注DREP技术产品进展。 技术产品方面,DREP公链正在进行出块节点弹性增减功能的设计与开发,增加节点最高限制MaxPeers,节点总量可在2/3MaxPeers ~ MaxPeers 之间增减&#xf…...

    2024/4/28 22:00:14
  16. CDH技术向视频:PaaS、flink、kafka、Workload XM、Cloudera Machine Learning

    CDP私有云上面的PaaS服务,也即是容器化的数据体验服务,一共有五类PaaS服务:CDW、CDE、CML、CDF、COD。本视频主要展示CDW和CML两类服务。 CDW封装了Hive LLAP和Impala服务,这些服务运行在K8S之上,让你可以快速部署计算…...

    2024/5/6 18:25:05
  17. 一周的小项目总结

    一,普通用户(User) 1)注册: 注册的时候由于注册的用户分为普通用户和管理员用户,所以关联到另一张角色表,并且是用户角色权限表是通过用户表和角色表的主键构成,不能直接在用户表里…...

    2024/4/19 1:04:40
  18. leetcode-621. 任务调度器

    题目 给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态…...

    2024/4/17 20:21:01
  19. innodb行级锁

    1.SELECT … FROM 是一个快照读,通过读取数据库的一个快照,不会加任何锁,除非将隔离级别设置成了 SERIALIZABLE 。 2.SELECT … FROM … LOCK IN SHARE MODE 在所有索引扫描范围的索引记录上加上共享的next key锁;如果是唯一索引,…...

    2024/4/17 19:35:40
  20. Loadrunner 录制手机App脚本多种方法介绍

    之前写过使用Loadrunner录制APP脚本的基本流程_Loadrunner_APP测试_性能测试_脚本录制_基本操作流程,但是只能用于请求单一服务器端口适用 这次主要是写的多server服务器时,如何录制脚本(APP、浏览器脚本录制均适用) 录制多serve…...

    2024/4/6 8:28:34

最新文章

  1. element ui的确认提示框按钮样式修改

    修改确认提示框的默认按钮样式,使用css强制修改 例: js代码: deleteUser(params){this.$confirm("您确定要删除吗?此操作无法撤销并且将永久删除所有数据。", "提示", { type: "warning", cancel…...

    2024/5/9 11:56:01
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. 嵌入式硬件中常见的面试问题与实现

    1 01 请列举您知道的电阻、电容、电感品牌(最好包括国内、国外品牌) ▶电阻 美国:AVX、VISHAY威世 日本:KOA兴亚、Kyocera京瓷、muRata村田、Panasonic松下、ROHM罗姆、susumu、TDK 台湾:LIZ丽智、PHYCOM飞元、RALEC旺诠、ROYALOHM厚生、SUPEROHM美隆、TA-I大毅、TMT…...

    2024/5/7 15:35:45
  4. 零代码编程:用kimichat将PDF自动批量分割成多个图片

    有一个PDF文件,现在想把pdf文件转换成图片, 可以在kimichat中输入提示词: 你是一个Python编程专家,要完成一个将PDF文件自动批量分割成多个图片的任务,具体步骤如下: 打开d盘下的pdf文件:Ill …...

    2024/5/9 7:00:01
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/8 19:32:33
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/9 7:40:42
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...

    2024/5/9 2:44:26
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...

    2024/5/8 20:33:13
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...

    2024/5/9 3:15:57
  10. 【Objective-C】Objective-C汇总

    方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/9 5:40:03
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...

    2024/5/9 7:40:40
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/8 20:58:56
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...

    2024/5/9 1:35:21
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/9 4:12:16
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/9 7:40:35
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/8 18:06:50
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/9 7:40:34
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...

    2024/5/9 1:42:21
  19. --max-old-space-size=8192报错

    vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...

    2024/5/9 5:02:59
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...

    2024/5/9 4:31:45
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...

    2024/5/8 12:44:41
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...

    2024/5/8 9:51:44
  23. python django 小程序图书借阅源码

    开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图&#xff0…...

    2024/5/9 6:36:49
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/9 4:33:29
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57