当前位置: 首页 > news >正文

【Spring进阶系列丨第九篇】基于XML的面向切面编程(AOP)详解

文章目录

  • 一、基于XML的AOP
    • 1.1、打印日志案例
      • 1.1.1、beans.xml中添加aop的约束
      • 1.1.2、定义Bean
    • 1.2、定义记录日志的类【切面】
    • 1.3、导入AOP的依赖
    • 1.4、主配置文件中配置AOP
    • 1.5、测试
    • 1.6、切入点表达式
      • 1.6.1、访问修饰符可以省略
      • 1.6.2、返回值可以使用通配符,表示任意返回值
      • 1.6.3、包名可以使用通配符表示任意包。有几级包,就几个*
      • 1.6.4、类名也可以用*
      • 1.6.5、方法也可以用*
      • 1.6.6、参数列表
      • 1.6.7、全通配符写法
      • 1.6.8、使用最多的写法
    • 1.7、通知类型的使用
      • 1.7.1、在日志类中新增通知方法
      • 1.7.2、配置AOP
      • 1.7.3、测试
    • 1.8、切入点表达式改进
      • 1.8.1、方式一
      • 1.8.2、方式二
    • 1.9、环绕通知
      • 1.9.1、在日志记录类中新增环绕通知
      • 1.9.2、AOP配置环绕通知
      • 1.9.3、测试1
      • 1.9.4、解决
  • 好书推荐

在这里插入图片描述

一、基于XML的AOP

1.1、打印日志案例

1.1.1、beans.xml中添加aop的约束

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>

1.1.2、定义Bean

package cn.bdqn.domain;
public class User {}
package cn.bdqn.service;
public interface UserService {// 保存用户public void save(User user);// 根据id查询用户public User queryById(Integer id);// 查询全部用户public List<User> queryAll();
}
package cn.bdqn.service;
public class UserServiceImpl implements UserService{// 保存用户public void save(User user){}// 根据id查询用户public User queryById(Integer id){return new User();}// 查询全部用户public List<User> queryAll(){return new ArrayList<User>();}
}

1.2、定义记录日志的类【切面】

package cn.bdqn.advice;// 定义记录日志的类,这个类就封装了我们所有的公共的代码
public class Logger {//  该方法的作用是在切入点方法执行之前执行public void beforePrintLog(){System.out.println("开始打印日志啦");}
}

1.3、导入AOP的依赖

<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version>
</dependency>

1.4、主配置文件中配置AOP

<beans><!--  1、注册UserServiceImpl这个Bean  --><bean id="userService" class="cn.bdqn.service.UserServiceImpl"/><!--  2、以下操作都是Spring基于XML的AOP配置步骤2.1 把通知/增强Bean也需要注册到Spring容器中2.2 使用<aop:config/>标签来去声明开始AOP的配置了2.3 使用<aop:aspect/>标签来去表示开始配置切面了可以想一下:既然要配置切面,那切面就是切入点和通知的结合,所以肯定需要配置切入点和通知这两部分id属性:是给切面提供一个唯一标识ref属性:是指定通知类bean的Id。2.4 在<aop:aspect/>标签的内部使用对应标签来配置通知的类型前置通知/后置通知/异常通知/最终通知需求:beforePrintLog方法在切入点方法执行之前之前:所以是前置通知前置通知:<aop:before/>method属性:用于指定Logger类中哪个方法是前置通知pointcut属性:用于指定切入点表达式,该表达式的含义指的是对业务层中哪些方法增强3、切入点表达式的写法:关键字:execution(表达式)表达式:访问修饰符  方法返回值  包名1.包名2...类名.方法名(参数列表)需求:我现在就想对UserServiceImpl类中的queryAll方法进行拦截public java.util.List cn.bdqn.service.UserServiceImpl.queryAll()--><!--  2.1 把通知/增强Bean也需要注册到Spring容器中  --><bean id="logger" class="cn.bdqn.advice.Logger"/><!--  2.2 使用此标签来去声明开始AOP的配置了--><aop:config><!--配置切面 --><aop:aspect id="loggerAdvice" ref="logger"><!-- 配置通知的类型,并且建立增强方法和切入点方法的关联--><aop:before method="beforePrintLog" pointcut="execution(public java.util.List cn.bdqn.service.UserServiceImpl.queryAll())"/></aop:aspect></aop:config>
</beans>

1.5、测试

在这里插入图片描述

@Test
public void testUserServiceImpl() throws Exception{ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");UserService userService = (UserService) ac.getBean("userService");userService.queryAll();
}

1.6、切入点表达式

​ 问题:我们上面的案例经过测试发现确实在调用业务方法之前增加了日志功能,但是问题是仅仅能针对某一个业务方法进行增强,而我们的业务方法又有可能有很多,所以显然一个一个的去配置很麻烦,如何更加灵活的去配置呢?这个就需要使用到切入点表达式

​ 语法:execution(表达式)

访问修饰符  方法返回值  包名1.包名2...类名.方法名(参数列表)

1.6.1、访问修饰符可以省略

// 完整写法
public java.util.List cn.bdqn.service.UserServiceImpl.queryAll())// 标准写法
java.util.List cn.bdqn.service.UserServiceImpl.queryAll())

1.6.2、返回值可以使用通配符,表示任意返回值

* cn.bdqn.service.UserServiceImpl.queryAll())

1.6.3、包名可以使用通配符表示任意包。有几级包,就几个*

* *.*.*.UserServiceImpl.queryAll())

但是对于包来说,连续的写3个*,显然也是麻烦的,那么可以使用“…”表示当前包及其子包。

// 表示的是任意包下的只要有UserServiceImpl类都会对queryAll方法进行增强
* *..UserServiceImpl.queryAll())

1.6.4、类名也可以用*

* *..*.queryAll()

1.6.5、方法也可以用*

* *..*.*()

1.6.6、参数列表

写法1、可以直接写数据类型:基本类型直接写名称           int、double引用类型写包名.类名的方式   java.lang.String、java.util.List
写法2、可以使用通配符表示任意类型前提是必须要有参数。写法3、使用..可以使用..表示有无参数均可,如果有参数则表示的可以是任意类型	

1.6.7、全通配符写法

 * *..*.*(..)

1.6.8、使用最多的写法

​ 实际中的写法:切到业务层实现类下的所有方法。即:

* com.bdqn.service.impl.*.*(..)

1.7、通知类型的使用

1.7.1、在日志类中新增通知方法

// 定义记录日志的类,这个类就封装了我们所有的公共的代码
public class Logger {//  该方法的作用是在切入点方法执行之前执行public void beforePrintLog(){System.out.println("前置通知(beforePrintLog):开始打印日志啦");}//  该方法的作用是在切入点方法执行之后执行public void afterReturningPrintLog(){System.out.println("后置通知(afterReturningPrintLog):业务方法执行完了,日志打印");}//  该方法的作用是在切入点方法执行出错后执行public void afterThrowingPrintLog(){System.out.println("异常通知(afterThrowingPrintLog):业务方法出现异常了,日志打印");}//  该方法的作用是在切入点方法执行之后不管有没有错误,都最终要执行public void afterPrintLog(){System.out.println("最终通知(afterPrintLog):业务方法不管有没有异常了,日志打印");}
}

1.7.2、配置AOP

<beans><!--  2.1 把通知/增强Bean也需要注册到Spring容器中  --><bean id="logger" class="cn.bdqn.advice.Logger"/><!--  2.2 使用此标签来去声明开始AOP的配置了--><aop:config><!--配置切面 --><aop:aspect id="loggerAdvice" ref="logger"><!-- 配置前置通知:在切入点方法执行之前执行--><aop:before method="beforePrintLog" pointcut="execution(* cn.bdqn.service.UserServiceImpl.queryAll())"/><!-- 后置通知:在切入点方法正常执行之后值。它和异常通知永远只能执行一个--><aop:after-returning method="afterReturningPrintLog"  pointcut="execution(* cn.bdqn.service.UserServiceImpl.queryAll())"/><!--配置异常通知:在切入点方法执行产生异常之后执行。它和后置通知永远只能执行一个--><aop:after-throwing method="afterThrowingPrintLog"  pointcut="execution(* cn.bdqn.service.UserServiceImpl.queryAll())"/><!--配置最终通知:无论切入点方法是否正常执行它都会在其后面执行--><aop:after method="afterPrintLog"pointcut="execution(* cn.bdqn.service.UserServiceImpl.queryAll())"/></aop:aspect></aop:config>
</beans>

1.7.3、测试

@Test
public void testUserServiceImpl() throws Exception{ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");UserService userService = (UserService) ac.getBean("userService");userService.queryAll();
}
/***前置通知(beforePrintLog):开始打印日志啦查询全部用户执行啦后置通知(afterReturningPrintLog):业务方法执行完了,日志打印最终通知(afterPrintLog):业务方法不管有没有异常了,日志打印
**/

1.8、切入点表达式改进

​ 通过11.7可以发现,我们在配置文件中配置了四种通知类型,其中的pointcut配置的是切入点表达式,发现是一模一样的,那么有没有一种改进写法呢?可以将表达式抽取出来,将来可以引用。

1.8.1、方式一

<beans><!--  1、注册UserServiceImpl这个Bean  --><bean id="userService" class="cn.bdqn.service.UserServiceImpl"/><!--  2、以下操作都是Spring基于XML的AOP配置步骤--><!--  2.1 把通知/增强Bean也需要注册到Spring容器中  --><bean id="logger" class="cn.bdqn.advice.Logger"/><!--  2.2 使用此标签来去声明开始AOP的配置了--><aop:config><!--配置切面 --><aop:aspect id="loggerAdvice" ref="logger"><!--配置切入点表达式id属性用于指定切入点表达式的唯一标识。expression属性用于指定表达式内容此标签写在aop:aspect标签内部只能当前切面使用。--><aop:pointcut id="loggerPt" expression="execution(* 																					cn.bdqn.service.UserServiceImpl.queryAll())"/><!-- 配置前置通知:在切入点方法执行之前执行--><aop:before method="beforePrintLog" pointcut-ref="loggerPt"/><!-- 后置通知:在切入点方法正常执行之后值。它和异常通知永远只能执行一个--><aop:after-returning method="afterReturningPrintLog" pointcut-ref="loggerPt"/><!--配置异常通知:在切入点方法执行产生异常之后执行。它和后置通知永远只能执行一个--><aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="loggerPt"/><!--配置最终通知:无论切入点方法是否正常执行它都会在其后面执行--><aop:after method="afterPrintLog" pointcut-ref="loggerPt"/></aop:aspect></aop:config>
</beans>

1.8.2、方式二

​ 对于方式一,我们将aop:pointcut标签写在了aop:aspect里面,这样的话这切入点表达式只能被当前的切面使用,而如果其他切面想使用就使用不到了,所以我们可以把这个切入点表示再定义到外面。

<beans><bean id="userService" class="cn.bdqn.service.UserServiceImpl"/><!--  2、以下操作都是Spring基于XML的AOP配置步骤--><!--  2.1 把通知/增强Bean也需要注册到Spring容器中  --><bean id="logger" class="cn.bdqn.advice.Logger"/><!--  2.2 使用此标签来去声明开始AOP的配置了--><aop:config><!--配置切入点表达式id属性用于指定切入点表达式的唯一标识。expression属性用于指定表达式内容此标签写在aop:aspect标签外面,那么所有的切面都可以使用。--><aop:pointcut id="loggerPt" expression="execution(* cn.bdqn.service.UserServiceImpl.queryAll())"/><!--配置切面 --><aop:aspect id="loggerAdvice" ref="logger"><!-- 配置前置通知:在切入点方法执行之前执行--><aop:before method="beforePrintLog" pointcut-ref="loggerPt"/><!-- 后置通知:在切入点方法正常执行之后值。它和异常通知永远只能执行一个--><aop:after-returning method="afterReturningPrintLog" pointcut-ref="loggerPt"/><!--配置异常通知:在切入点方法执行产生异常之后执行。它和后置通知永远只能执行一个--><aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="loggerPt"/><!--配置最终通知:无论切入点方法是否正常执行它都会在其后面执行--><aop:after method="afterPrintLog" pointcut-ref="loggerPt"/></aop:aspect></aop:config>
</beans>

1.9、环绕通知

1.9.1、在日志记录类中新增环绕通知

public class Logger {// 环绕通知public void aroundPrintLog(){System.out.println("环绕通知....aroundPrintLog.....");}
}

1.9.2、AOP配置环绕通知

<beans><!--  1、注册UserServiceImpl这个Bean  --><bean id="userService" class="cn.bdqn.service.UserServiceImpl"/><!--  2、以下操作都是Spring基于XML的AOP配置步骤--><!--  2.1 把通知/增强Bean也需要注册到Spring容器中  --><bean id="logger" class="cn.bdqn.advice.Logger"/><!--  2.2 使用此标签来去声明开始AOP的配置了--><aop:config><!--    配置切入点表达式    --><aop:pointcut id="loggerPt" expression="execution(* cn.bdqn.service.UserServiceImpl.queryAll())"/><!--配置切面 --><aop:aspect id="loggerAdvice" ref="logger"><!-- 环绕通知--><aop:around method="aroundPrintLog" pointcut-ref="loggerPt"/></aop:aspect></aop:config>
</beans>

1.9.3、测试1

@Test
public void testUserServiceImpl() throws Exception{ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");UserService userService = (UserService) ac.getBean("userService");userService.queryAll();
}
/**环绕通知....aroundPrintLog.....发现:仅仅打印了环绕通知的代码。当我们配置了环绕通知之后,切入点方法没有执行,而通知方法执行了
*/

1.9.4、解决

​ Spring框架为我们提供了一个接口:ProceedingJoinPoint。该接口有一个方法proceed(),此方法就相当于明确调用切入点方法。该接口可以作为环绕通知的方法参数,在程序执行时,spring框架会为我们提供该接口的实现类供我们使用。

public class Logger {// 环绕通知public Object aroundPrintLog(ProceedingJoinPoint pjp){Object result = null;try{Object[] args = pjp.getArgs();System.out.println(pjp.getSignature().getName());System.out.println("前置");result = pjp.proceed(args);System.out.println("后置");return result;}catch (Throwable t){System.out.println("异常");throw new RuntimeException(t);}finally {System.out.println("最终");}}
}
/**环绕通知:它是spring框架为我们提供的一种可以在代码中手动控制增强方法何时执行的方式。
*/

好书推荐

在这里插入图片描述

《深入浅出Spring Boot 3.x》

> 对于Java开发人员来说,Spring是必须学习的框架。

作者简介

杨开振——长期从事Java开发工作,拥有近十年的Java开发经验,目前就职于一家互联网金融公司,担任互联网软件开发职位。
IT技术的狂热爱好者,热衷于Java互联网方向的软件技术开发与研究。熟练掌握Java基础、软件开发设计模式和数据库相关知识,对Spring、MyBatis等主流Java开源框架有深入研究。

购书链接:点此进入

在这里插入图片描述

相关文章:

【Spring进阶系列丨第九篇】基于XML的面向切面编程(AOP)详解

文章目录 一、基于XML的AOP1.1、打印日志案例1.1.1、beans.xml中添加aop的约束1.1.2、定义Bean 1.2、定义记录日志的类【切面】1.3、导入AOP的依赖1.4、主配置文件中配置AOP1.5、测试1.6、切入点表达式1.6.1、访问修饰符可以省略1.6.2、返回值可以使用通配符&#xff0c;表示任…...

学习记录:转发和重定向

转发&#xff08;Forward&#xff09;和重定向&#xff08;Redirect&#xff09;是两种不同的 Web 请求处理方式&#xff0c;它们在功能和行为上有着显著的区别。 区别 转发&#xff08;Forward&#xff09;&#xff1a; 服务器内部跳转&#xff1a;转发是服务器内部的行为&…...

实现(图像、视频等)数据上云存储

实现&#xff08;图像、视频等&#xff09;数据上云存储 实现&#xff08;图像、视频等&#xff09;数据上云存储通常涉及以下几个步骤&#xff1a; 选择云存储服务商&#xff1a; 根据您的需求、预算、地域覆盖、数据安全性、服务稳定性等因素&#xff0c;选择一家合适的云存储…...

LeetCode 454.四数相加II

LeetCode 454.四数相加II 1、题目 题目链接&#xff1a;454. 四数相加 II - 力扣&#xff08;LeetCode&#xff09; 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 <…...

GoogleNet网络训练集和测试集搭建

测试集和训练集都是在之前搭建好的基础上进行修改的&#xff0c;重点记录与之前不同的代码。 还是使用的花分类的数据集进行训练和测试的。 一、训练集 1、搭建网络 设置参数&#xff1a;使用辅助分类器&#xff0c;采用权重初始化 net GoogleNet(num_classes5, aux_logi…...

将数字状态码在后台转换为中文状态

这是我们的实体类 可以看出我们的状态status是2如过返回到前端我们根本不知道2代表的是什么&#xff0c;所以我们需要再这里将数字转换成能看懂的中文状态&#xff0c;首先我们创建一个枚举类 先将我们状态码所对应的中文状态枚举出来&#xff0c;然后创建一个静态方法&#…...

2017NOIP普及组真题 4. 跳房子

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1417\ 核心思想 首先、本题中提到 “ 至少 要花多少金币改造机器人&#xff0c;能获得 至少 k分 ”。看到这样的话语&#xff0c;基本可以考虑要使用 二分答案。 那么&#xff0c;本题中…...

网络与 Internet因特网的基本概念

目录 网络Internet &#xff08;互联网或互连网&#xff09;Internet&#xff08;因特网&#xff09;待续、更新中 网络 指将分布在不同地理位置的、相同或不同类型的网络通过网络互连设备&#xff08;中继器、网桥、路由器或网关等&#xff09;相互连接&#xff0c;形成一个范…...

vue-router 中 router-link 与 a 标签的区别

文章目录 前言 a标签定义 router-link定义 总结 前言 vue-router 中 router-link 与 a 标签的区别 a标签定义 <a> 标签定义超链接&#xff0c;用于从一张页面链接到另一张页面。 从一张页面跳转到另一张页面&#xff0c;但从这里来说就违背了多视图的单页Web应用这个…...

MySQL基础知识——MySQL事务

事务背景 什么是事务&#xff1f; 一组由一个或多个数据库操作组成的操作组&#xff0c;能够原子的执行&#xff0c;且事务间相互独立&#xff1b; 简单来说&#xff0c;事务就是要保证一组数据库操作&#xff0c;要么全部成功&#xff0c;要么全部失败。 注&#xff1a;MyS…...

【架构方法论(一)】架构的定义与架构要解决的问题

文章目录 一. 架构定义与架构的作用1. 系统与子系统2. 模块与组件3. 框架与架构4. 重新定义架构&#xff1a;4R 架构 二、架构设计的真正目的-别掉入架构设计的误区1. 是为了解决软件复杂度2. 简单的复杂度分析案例 三. 案例思考 本文关键字 架构定义 架构与系统的关系从业务逻…...

基于springboot实现人口老龄化社区服务与管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现人口老龄化社区服务与管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了人口老龄化社区服务与管理平台的开发全过程。通过分析人口老龄化社区服务与管理平台方面的不足&#xff…...

代码随想录算法训练营第三十七天| LeetCode 738.单调递增的数字、总结

一、LeetCode 738.单调递增的数字 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html 状态&#xff1a;已解决 1.思路 如何求得小于等于N的最大单调递增的整数&#xff1f;98&am…...

C++动态内存管理 解剖new/delete详细讲解(operator new,operator delete)

讨厌抄我作业和不让我抄作业的人 讨厌插队和不让我插队的人 讨厌用我东西和不让我用东西的人 讨厌借我钱和不借给我钱的人 讨厌开车加塞和不让我加塞的人 讨厌内卷和打扰我内卷的人 一、C中动态内存管理 1.new和delete操作内置类型 2.new和delete操作自定义类型 二、operat…...

python-re正则笔记0.2.0

1. 匹配linux文件路径 from re import match, search,findall str"sh refreshConfig.sh /opt/client/ccc.txt /opt/client/ccc.dfs 胜多负少的"patter1"\/.\.\w" print(findall(patter1, str))""" [/opt/client/ccc.txt /opt/client/ccc…...

.NET SignalR Redis实时Web应用

环境 Win10 VS2022 .NET8 Docker Redis 前言 什么是 SignalR&#xff1f; ASP.NET Core SignalR 是一个开放源代码库&#xff0c;可用于简化向应用添加实时 Web 功能。 实时 Web 功能使服务器端代码能够将内容推送到客户端。 适合 SignalR 的候选项&#xff1a; 需要从服…...

【热门话题】常见分类算法解析

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 常见分类算法解析1. 逻辑回归&#xff08;Logistic Regression&#xff09;2. 朴…...

有效利用MRP能为中小企业带来什么?

在离散制造企业&#xff0c;主流的生产模式主要为面向订单生产和面向库存生产&#xff08;又称为预测生产&#xff09;&#xff0c;在中小企业中&#xff0c;一般为面向订单生产&#xff0c;也有部分面向库存和面向订单混合的生产方式&#xff08;以面向订单为主&#xff0c;面…...

InternlM2

第一次作业 基础作业 进阶作业 1. hugging face下载 2. 部署 首先&#xff0c;从github上git clone仓库 https://github.com/InternLM/InternLM-XComposer.git然后里面的指引安装环境...

2024-12.python高级语法

异常处理 首先我们要理解什么叫做**"异常”**&#xff1f; 在程序运行过程中&#xff0c;总会遇到各种各样的问题和错误。有些错误是我们编写代码时自己造成的&#xff1a; 比如语法错误、调用错误&#xff0c;甚至逻辑错误。 还有一些错误&#xff0c;则是不可预料的错误…...

【C语言】贪吃蛇项目(1) - 部分Win32 API详解 及 贪吃蛇项目思路

文章目录 一、贪吃蛇项目需要实现的基本功能二、Win32 API介绍2.1 控制台2.2 部分控制台命令及调用函数mode 和 title 命令COORD 命令GetStdHandle&#xff08;获取数据&#xff09;GetConsoleCursorInfo&#xff08;获取光标数据&#xff09;SetConsoleCursorInfo &#xff08…...

秋叶Stable diffusion的创世工具安装-带安装包链接

来自B站up秋葉aaaki&#xff0c;近期发布了Stable Diffusion整合包v4.7版本&#xff0c;一键在本地部署Stable Diffusion&#xff01;&#xff01; 适用于零基础想要使用AI绘画的小伙伴~本整合包支持SDXL&#xff0c;预装多种必须模型。无需安装git、python、cuda等任何内容&am…...

华为ensp中aaa(3a)实现telnet远程连接认证配置命令

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月14日18点49分 AAA认证的全称是Authentication、Authorization、Accounting&#xff0c;中文意思是认证、授权、计费。 以下是详细解释 认证&#xff08;Authentic…...

前端网络---http协议和https协议的区别

http协议和https的区别 1、http是超文本传输协议&#xff0c;信息是明文传输&#xff0c;https则是具有安全性的ssl加密传输协议。 2、http和https使用的端口不一样&#xff0c;http是80&#xff0c;https是443。 3、http的连接很简单&#xff0c;是无状态的&#xff08;可以…...

FactoryMethod工厂方法模式详解

目录 模式定义实现方式简单工厂工厂方法主要优点 应用场景源码中的应用 模式定义 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。 Factory Method 使得一个类的实例化延迟到子类。 实现方式 简单工厂 以下示例非设计模式&#xff0c;仅为编码的一种规…...

Java基础-知识点1(面试|学习)

Java基础-知识点1 Java与C、PythonJava &#xff1a;C&#xff1a;Python: java 与 C的异同相似之处&#xff1a;区别&#xff1a; Java8的新特性Lambda 表达式&#xff1a;Stream API&#xff1a;接口的默认方法和静态方法&#xff1a; 基本数据类型包装类自动装箱与自动拆箱自…...

【InternLM 实战营第二期-笔记1】书生浦语大模型开源体系详细介绍InternLM2技术报告解读(附相关论文)

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型,很高兴能参与本次第二期训练营&#xff0c;我也将会通过笔记博客的方式记录学习的过程与遇到的问题&#xff0c;并为代码添加注释&#xff0c;希望可以帮助到你们。 记得点赞哟(๑ゝω╹๑) 书生浦语大模型开源体系…...

【免费】基于SOE算法的多时段随机配电网重构方法

1 主要内容 该程序是完全复现《Switch Opening and Exchange Method for Stochastic Distribution Network Reconfiguration》&#xff0c;也是一个开源代码&#xff0c;网上有些人卖的还挺贵&#xff0c;本次免费分享给大家&#xff0c;代码主要做的是一个通过配电网重构获取…...

Swift面向对象编程

类的定义与实例化&#xff1a; Swift中定义一个类使用class关键字&#xff0c;类的属性和方法都写在大括号内。示例代码如下&#xff1a; class MyClass {var property1: Intvar property2: Stringinit(property1: Int, property2: String) {self.property1 property1self.pr…...

IEDA 的各种常用插件汇总

目录 IEDA 的各种常用插件汇总1、 Alibaba Java Coding Guidelines2、Translation3、Rainbow Brackets4、MyBatisX5、MyBatis Log Free6、Lombok7、Gitee IEDA 的各种常用插件汇总 1、 Alibaba Java Coding Guidelines 作用&#xff1a;阿里巴巴代码规范检查插件&#xff0c;…...

wordpress 栏目 主题/新手做电商怎么起步

刚刚学习 SHELL 写了一个简单的例子 发生如下错误-bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directoryVI打开文件&#xff0c;没发现任何问题&#xff0c;把/bin/bash改成/bin/sh-bash: ./test.sh: /bin/sh^M: bad interpreter: No such file or direc…...

wordpress 流程/找资源

我在编写PHP时遇到麻烦.我有一个JavaScript / jQuery HTML5页面使用$.post与我的PHP脚本交互.但是,PHP面临着一个奇怪的问题,可能与编码有关.当我写作htmlentities("")我希望PHP输出& iacute;.然而,它输出& Atilde;& shy;一开始,我认为我在编码方面犯了一…...

手机自建房设计软件app/seo工作内容

做了那么多年的marketing&#xff0c;一直以来都处于学习的状态&#xff0c;这么多年的吸收&#xff0c;也许应该开始学着对外做一些表达了。今天想说的是&#xff0c;如何做一次完整的营销策划。对于很多市场人来说&#xff0c;在实际工作中从事的更多是营销活动中的某些环节。…...

门户网站开发请示/上海网站推广服务公司

uilabel添加点击事件需要用到UITapGestureRecognizer对象&#xff0c;用法非常简单&#xff0c;下面是UITapGestureRecognizer的使用案例。- (void)viewDidLoad {[super viewDidLoad];//创建uilabelUILabel *label [[UILabel alloc] initWithFrame:CGRectMake(100, 60, 120, 3…...

asp.net做音乐网站/电商seo

定义向量与矩阵的乘积和线性方程组表达的含义一致定义了矩阵和向量的乘积每一行向量和列向量进行点乘相乘的结果就是:每一个行向量和列向量 相乘点乘的结果: 行向量和列向量乘积为了实现点乘的运算 a的列向量 和 b的行相同简化相关的公式向量的乘积矩阵和向量的乘积单位矩阵&…...

怎么做图片网站源码/淄博seo怎么选择

请看这篇博客&#xff1a;https://www.cnblogs.com/lemontea-t/p/4919091.html 亲测&#xff0c;通俗易懂&#xff0c;一看就明白。...