spring之AOP的概念及简单案例

AOP概念

AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

AOP核心概念

Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。

Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。

Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。

Advice(增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。

Target(目标对象):织入 Advice 的目标对象.。

Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程

举例理解

下面我以一个简单的例子来比喻一下 AOP 中 Aspect, Joint point, Pointcut 与 Advice之间的关系.

让我们来假设一下, 从前有一个叫爪哇的小县城, 在一个月黑风高的晚上, 这个县城中发生了命案. 作案的凶手十分狡猾, 现场没有留下什么有价值的线索. 不过万幸的是, 刚从隔壁回来的老王恰好在这时候无意中发现了凶手行凶的过程, 但是由于天色已晚, 加上凶手蒙着面, 老王并没有看清凶手的面目, 只知道凶手是个男性, 身高约七尺五寸. 爪哇县的县令根据老王的描述, 对守门的士兵下命令说: 凡是发现有身高七尺五寸的男性, 都要抓过来审问. 士兵当然不敢违背县令的命令, 只好把进出城的所有符合条件的人都抓了起来.

来让我们看一下上面的一个小故事和 AOP 到底有什么对应关系.
首先我们知道, 在 Spring AOP 中 Joint point 指代的是所有方法的执行点, 而 point cut 是一个描述信息, 它修饰的是 Joint point, 通过 point cut, 我们就可以确定哪些 Joint point 可以被织入 Advice. 对应到我们在上面举的例子, 我们可以做一个简单的类比, Joint point 就相当于 爪哇的小县城里的百姓,pointcut 就相当于 老王所做的指控, 即凶手是个男性, 身高约七尺五寸, 而 Advice 则是施加在符合老王所描述的嫌疑人的动作: 抓过来审问.
为什么可以这样类比呢?

Joint point : 爪哇的小县城里的百姓: 因为根据定义, Joint point 是所有可能被织入 Advice 的候选的点, 在 Spring AOP中, 则可以认为所有方法执行点都是 Joint point. 而在我们上面的例子中, 命案发生在小县城中, 按理说在此县城中的所有人都有可能是嫌疑人.

Pointcut :男性, 身高约七尺五寸: 我们知道, 所有的方法(joint point) 都可以织入 Advice, 但是我们并不希望在所有方法上都织入 Advice, 而 Pointcut 的作用就是提供一组规则来匹配joinpoint, 给满足规则的 joinpoint 添加 Advice. 同理, 对于县令来说, 他再昏庸, 也知道不能把县城中的所有百姓都抓起来审问, 而是根据凶手是个男性, 身高约七尺五寸, 把符合条件的人抓起来. 在这里 凶手是个男性, 身高约七尺五寸 就是一个修饰谓语, 它限定了凶手的范围, 满足此修饰规则的百姓都是嫌疑人, 都需要抓起来审问.

Advice :抓过来审问, Advice 是一个动作, 即一段 Java 代码, 这段 Java 代码是作用于 point cut 所限定的那些 Joint point 上的. 同理, 对比到我们的例子中, 抓过来审问 这个动作就是对作用于那些满足 男性, 身高约七尺五寸 的爪哇的小县城里的百姓.

Aspect::Aspect 是 point cut 与 Advice 的组合, 因此在这里我们就可以类比: “根据老王的线索, 凡是发现有身高七尺五寸的男性, 都要抓过来审问” 这一整个动作可以被认为是一个 Aspect.

代码案例

我们首先建立配置类Config,在此类开启AspectJ注解@EnableAspectJAutoProxy

注意:在最新版本的Spring框架中,@EnableAspectJAutoProxy注解不是必需的。当你使用<aop:aspectj-autoproxy>配置或者Spring Boot时,它会自动启用AspectJ自动代理。

Spring框架会根据以下条件自动启用AspectJ自动代理:

  1. 在类路径下存在AspectJ织入器(例如,AspectJ的相关依赖已经被引入)。
  2. Spring上下文中存在至少一个@Aspect注解的切面类。

因此,如果你的项目满足这些条件,你无需显式地使用@EnableAspectJAutoProxy注解。Spring框架会自动探测并启用AspectJ自动代理。

Config类:

package com.xsh.springaop;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@ComponentScan
@Configuration
//开启AspectJ注解
@EnableAspectJAutoProxy
public class Config {
}


下列代码是一个简单的AOP切面示例,用于在目标方法执行之前和执行之后打印日志。

  1. @Aspect注解表示这是一个切面类,用于声明切面的功能。
  2. @Component注解表示这个切面类是一个Spring组件,将被Spring容器管理。
  3. @Before("execution(* com.xsh.springaop.MyServer.fun1(..))")注解表示这个方法将在目标方法执行之前执行。它使用了切点表达式来指定切入的连接点。在本例中,切点表达式execution(* com.xsh.springaop.MyServer.fun1(..))表示匹配com.xsh.springaop.MyServer类中的fun1方法,并且方法参数任意。
  4. @After("execution(* com.xsh.springaop.MyServer.fun2(..))")注解表示这个方法将在目标方法执行之后执行。切点表达式与上述相似,匹配com.xsh.springaop.MyServer类中的fun2方法。
  5. beforeMethodExecution()方法是前置通知方法,它在目标方法执行之前被调用,打印了一条日志信息。
  6. afterAdvice()方法是后置通知方法,它在目标方法执行之后被调用,打印了一条日志信息。

通过这种方式,可以在不修改原有业务逻辑的情况下,通过AOP切面对目标方法进行增强操作,例如记录日志、性能监控、事务管理等。在示例中,切面类LoggingAspect将在目标方法执行前后输出日志信息。

LoggingAspect:

package com.xsh.springaop;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;



@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.xsh.springaop.MyServer.fun1(..))")
    public void beforeMethodExecution() {
        System.out.println("Before executing method");
    }

    @After("execution(* com.xsh.springaop.MyServer.fun2(..))")
    public void afterAdvice() {
        System.out.println("After executing method");
    }




}


下列代码是有2个方法,分别对应切面类中的所切方法。

MyServer:

package com.xsh.springaop;


import org.springframework.stereotype.Service;

@Service
public class MyServer {


    public void fun1() {
        System.out.println("我是方法1111");
    }

    public void fun2(){
        System.out.println("我是方法2222");
    }

}


下列代码是一个Spring Boot的应用程序启动类。它实现了CommandLineRunner接口,用于在应用程序启动后执行一些初始化任务。

  1. @Component注解表示这个类是一个Spring组件,将被Spring容器管理。
  2. AppRunner类实现了CommandLineRunner接口,它定义了一个run方法,在应用程序启动后会被自动调用。
  3. AppRunner类中,使用@Autowired注解将MyServer类的实例自动注入进来,即将MyServer对象注入到myServer字段中。
  4. run方法中,调用了myServer对象的fun1()fun2()方法,即执行了目标方法。

通过这种方式,当应用程序启动后,AppRunner类的run方法将会被自动调用,从而触发执行MyServer类中的目标方法fun1()fun2()。这样可以方便地测试和验证切面是否生效,是否正确地增强了目标方法的功能。

AppRunner:

package com.xsh.springaop;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class AppRunner implements CommandLineRunner {

    @Autowired
    private MyServer myServer;

    @Override
    public void run(String... args) throws Exception {
        myServer.fun1();
        myServer.fun2();
    }
}


本文转载于网络 如有侵权请联系删除

相关文章

  • 新版Optional

    我们每一做一件事都应该既小心谨慎,又充满信心。——爱比克泰德 首先关于Optional的博客我已经写过好几篇了Optional进行优雅非空判断Optional再扩展Optional没有peek函数?自己写一个在Java9中更新了Optional的三个函数第一个:将Optional中的值转换为Stream,如果值不存在,则返回空的Stream/** *Ifavalueispresent,returnsasequential{@linkStream}containing *onlythatvalue,otherwisereturnsanempty{@codeStream}. * *@apiNote *Thismethodcanbeusedtotransforma{@codeStream}ofoptional *elementstoa{@codeStream}ofpresentvalueelements: *<pre>{@code *Stream<Optional<T>>os=.. *Stream<T>s=os.flatMap(Optional

  • 这个 JSON 可视化工具,更直观易用!

    大家好,我是小G。不久前,我曾在公众号写过一篇文章《开箱即用,5个功能强悍的JSON神器!》,里面详细介绍了GitHub上几款比较实用的JSON神器。刚好,最近我在GitHub闲逛的时候,又发现一款更猛的JSON神器,叫JSONHero,今天再着重介绍一下。众所周知,现在有不少代码编辑器以及在线工具,都支持JSON格式化,因此这一特性,已经不能称的上是亮点。但是,你见过能直接可视化JSON数据,把整个JSON文件,从头到尾给你翻新一下,在你面前呈现出一整个JSON数据可视化的场景么?如果没有,那你应该好好看看JSONHero这个开源项目。GitHub:https://github.com/jsonhero-io/jsonhero-web该项目提供了简洁直观的UI界面,让查阅和理解JSON数据变得更为轻松便捷。开发者借助这一工具,能以列表视图、树状视图、编辑器视图等多种方式来查看JSON文件,并自动识别数据内容,展示数据预览。JSONHero通过为您提供包含额外功能的干净美观的UI,使阅读和理解JSON文件变得容易。此外,工具还内置了JSON验证、内容搜索、生成可分享的URL路径等功能。

  • Java底层-本地接口(JNI)

    前面的文章我们讲述了类加载子系统、执行引擎、GC子系统、运行数据区的相关内容,那么HotSpot虚拟机三大子系统、两组件就剩下本地接口组件没有讲述了,所以这一篇文章对于本地接口进行介绍。为什么会有本地接口的概念呢?我们在之前的文章说过Java语言不是面向硬件的,它无法直接调用操作系统API操控硬件,Java和硬件的交互正常都是通过JVM提供的API来完成的,但是当虚拟机提供的API不足以实现我们个别需求的时候,就需要本地接口了。由于JVM底层就有C++的影子,所以JVM也提供了JNI(Java本地接口:JavaNativeInterface,)技术作为其它语言(主要是C/C++)通信的API。在本地接口的相关的概念里,Java成为了一个调用方,其他语言成为了主角,这篇文章我们以C++为例,看一下如何调用本地接口,关于C++的部分尽可能简单的描述,如果大家还有疑问可以了解一些C++的基本知识。首先编写调用本地方法的类,方法定义为native,表明调用的是本地接口。packagecom.studyjava.email.jni.main; publicclassMain{ //加载Libr

  • GAN秒变肖像画!清华刘永进提出APDrawingGAN ,CVPR Oral(附微信小程序)

    【新智元导读】自动地将人脸照片转换为高质量的艺术肖像画具有重要的艺术价值和实用价值。清华大学刘永进教授课题组对此提出APDrawingGAN,结果优于目前已有方法。该项工作被CVPR2019录取为oralpaper。本文还提供微信小程序,供读者尝试。肖像画是一种独特的艺术形式,通常使用一组稀疏的连续图形元素如线条来捕捉一个人的外表特征。肖像画通常是在人物面前或基于人物照片进行创作的,其创作依赖于细致的观察、分析和丰富的经验。一幅好的肖像画能很好地捕捉到人的个性和情感。图1.一些人脸照片和对应的艺术家画的肖像线条画。然而,即使是受过专业训练的艺术家,完成一幅精致的肖像画也需要很长时间。因此,自动地将人脸照片转换为高质量的艺术肖像画具有重要的艺术价值和实用价值。清华刘永进组提出APDrawingGAN随着深度学习的发展,使用卷积神经网络进行图像风格转换的神经风格转换(NST)方法被提出。随后,基于生成对抗网络(GAN)的方法在图像风格转换上实现了很好的效果。但是,这些已有方法多数针对于生成信息较为丰富的风格,如油画,这些风格的图像中包含很多零碎的图形元素(如笔触),而对单个元素的质量要求较

  • 对iPhone手机型号进行判断

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/51026185 直接将一下代码复制粘贴到Header.h文件中即可,在使用的时候进行判读。#defineIS_IPhone6Plus([UIScreeninstancesRespondToSelector:@selector(currentMode)]?CGSizeEqualToSize(CGSizeMake(1242,2208),[[UIScreenmainScreen]currentMode].size):NO)#defineIS_IPhone6([UIScreeninstancesRespondToSelector:@selector(currentMode)]?CGSizeEqualToSize(CGSizeMake(750,1334),[[UIScreenmainScreen]currentMode].size):NO)#defineIS_IPhone4([UIScreeninstancesRespondToS

  • 大话脑成像之四--浅谈近红外脑功能成像

    亚洲舞王尼古拉斯.特斯拉喊你来关注思影科技今天由思影科技给大家简单(xiaosa)的介绍一下功能近红外成像(fNIRS)。(本图片由岛津公司独家免费赞助)近红外简单来说就是往你脑袋上打一束近红外光。(红外线,靠近可见光的一侧,所以叫“近”红外,“愿圣光与你同在的光”看到此处wower会心一笑然后老泪纵横),然后通过一些列的光学算法,计算出你大脑的氧合血红蛋白与去氧血红蛋白的浓度变化。那么为什么测量血氧浓度就能够反映大脑的活动呢?我们都知道所谓大脑的活动就是神经元放电,俗话说得好,“兵马未动粮草先行”,神经元放电也需要大量的能量去支援,于是乎氧合血红蛋白被源源不断地输送到“战场”。所以我们只要看粮草往哪边运送,就知道哪里发生了“战争”,学术上我们称之为“激活”(朋友,你确定不是脉动?,好吧,来一瓶)。针对数据分析,私以为各位不要去死磕公式,理解公式的基本涵意就够了(这句话是针对研究生特别是博士生说的。如果是本科生,倒是有大把的时间去折腾)。毕竟国内大部分的心理系或者医学院并不十分重视数理技术特别是计算机基础的训练,你拿自己的弱项去跟学计算机的死磕,我不能说死路一条,起码也是事倍功半,倒不

  • 如何在CDH启用Kerberos的情况下安装及使用Sentry(一)

    温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。1.文档编写目的本文档主要讲述如何在启用Kerberos的CDH集群中安装配置及使用Sentry。内容概述1.如何安装Sentry服务2.Hive/Impala/Hue/HDFS服务如何与Sentry集成3.Sentry测试测试环境1.操作系统为CentOS6.52.CM和CDH版本为5.11.13.采用root用户操作前置条件1.CDH集群运行正常2.集群已启用Kerberos且正常使用2.Sentry安装1.在MySQL中创建sentry数据库建表语句:createdatabasesentrydefaultcharactersetutf8;CREATEUSER'sentry'@'%'IDENTIFIEDBY'password';GRANTALLPRIVILEGESONsentry.*TO'sentry'@'%';FLUSHPRIVILEGES;命令行操作:[root@ip-172-31-6-148527-hive-HIVE

  • 微信小程序使用字体图标的方法

    一、先到阿里巴巴矢量图标库(http://iconfont.cn/),用微博帐号登录,搜索你想要的图标,然后添加入库从项目里下载下来并解压,找到ttf格式文件二、到这个平台https://transfonter.org/,把刚才下载的ttf字体文件转化成base64格式 原文:http://www.soswen.com/article/10三、下载下来之后解压找到stylesheet.css,打开文件,复制这些内容到wxss里:四、打开之前在阿里巴巴下载的压缩包,找到iconfont.css文件,打开它全部复制到wxss里四、在wxml加入字体就可以使用了

  • 无人经济兴起,安防行业如何切入?

    相信在上周末的时候,很多人的朋友圈里面都给”深圳无人公交试运营”这一消息刷了屏。四台搭载着“阿尔法巴智能驾驶公交系统”的智能公交车在深圳福田保税区首发试运行。据悉,该智能驾驶系统为一个整体解决方案,以国产、自主可控的智能驾驶技术为基础,集人工智能、自动驾驶、视觉计算等众多黑科技为一体。在智能驾驶的基础上,系统还包括了客流统计分析、智慧调度、安全评估与应急响应、智能充电、智能维保等子系统。近年来,伴随着人工智能技术的进步与发展,无人驾驶汽车吸引了众多企业的关注,无论是传统车企还是互联网企业,甚至是安防行业的大佬级企业大华股份和海康威视,都纷纷切入智能汽车领域,对人工智能技术进行探索。随着智能汽车的逐步发展,支撑智能汽车的关键技术如监控技术、机器视觉、人工智能等都与安防有着千丝万缕的关系,有的甚至是安防技术在车辆上的直接应用。有的专家认为,无人驾驶技术的发展,将会为安防企业带来新一轮的机遇,而这,也是大华、海康等安防大佬们将目光瞄准无人驾驶市场的原因。现阶段,人工智能俨然已经成为个行业炙手可热的话题,“无人经济”的理念也不断被人们提起,作为人工智能技术落地应用较为成熟的行业,除无人驾驶外,

  • 上班被监控屏幕和摄像头,拒绝就直接开除,员工起诉公司获赔52万元

    萧箫发自凹非寺 量子位|公众号QbitAI监控电脑屏幕还不够,必须在工作期间全程打开摄像头?要是不这么做,就会被直接解雇,甚至连原因都不告诉你。这是一名员工在远程办公期间的遭遇。要知道,他已经在这家公司勤勤恳恳工作一年半,公司在解雇他时却连提前通知都没有,甚至在合同中还安排了一个竞业协议。如今,他不服并上诉到法院,最终获得75000欧元(约合人民币52万元)的赔偿,同时法院还宣判对应的竞业协议无效。事情发酵到网上后,立刻引起了网友的热议。有网友锐评公司的做法:如果你需要一个摄像头随时监控员工,那你这经理大概也做得不咋样。甚至还有网友表示,竞业协议本身就是一种错误,应该被禁止:判赔金额超过员工年薪这名被开除的员工来自荷兰,曾经给这家名叫Chetu的美国软件公司干活。他于2019年入职Chetu荷兰分公司,以远程办公的方式做了一年半左右电话销售。但从2020年8月23日开始,公司突然要求他加入一个叫“CorrectiveActionProgram”(更正行动计划)的项目,在上班期间始终打开屏幕共享和摄像头。按工作日时长来看,这名员工必须一天保持摄像头9小时处于开启状态。最初他同意了这个要求

  • accessors 作用_EasyExcel与@Accessors(chain = true)不兼容分析

    EasyExcelEasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel.github地址:https://github.com/alibaba/easyexcelAccessors@Accessors注解用来配置lombok如何产生和显示getters和setters的方法。public@interfaceAccessors{/***如果为true,则访问器将以该字段命名,并且不包含get或set*前缀,且省略了chain,则chain默认为true。**默认值:false*/booleanfluent()defaultfalse;/****如果为true,setter将返回this而不是void。**默认:false*/booleanchain()defaultfalse;String[]prefix()default{};}测试案例pom.xmlorg.projectlomboklomboktruecom.alibabaeasyexcel2.2.6Student.java@Data@Accessors(cha

  • 几百行代码实现一个 JSON 解析器

    前言 之前在写gscript时我就在想有没有利用编译原理实现一个更实际工具?毕竟真写一个语言的难度不低,并且也很难真的应用起来。 一次无意间看到有人提起JSON解析器,这类工具充斥着我们的日常开发,运用非常广泛。 以前我也有思考过它是如何实现的,过程中一旦和编译原理扯上关系就不由自主的劝退了;但经过这段时间的实践我发现实现一个JSON解析器似乎也不困难,只是运用到了编译原理前端的部分知识就完全足够了。 得益于JSON的轻量级,同时语法也很简单,所以核心代码大概只用了800行便实现了一个语法完善的JSON解析器。 首先还是来看看效果: import"github.com/crossoverJie/gjson" funcTestJson(t*testing.T){ str:=`{ "glossary":{ "title":"exampleglossary", "age":1, "long":99.99, "GlossDiv":{ "title":"S", "GlossList":{ "GlossEntry":{ "ID":"SGML", "SortAs":"

  • 临时邮箱

    https://10minutemail.net/

  • STM32ADC实验讲解,从入门到放弃。

    文章目录 前言一、ADC什么是ADC?ADC主要特性有那些?ADC的功能说明 二、实验步骤代码部分讲解代码示例 总结 前言 本文参考了网上的博文,并加以归纳总结,帮助新手从入门到放弃。 提示:以下是本篇文章正文内容 一、ADC 什么是ADC? ADC:Analog-to-DigitalConverter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。 12位ADC是逐次趋近型模数转换器。它具有多达19个复用通道,可测量来自16个外部源、两个内部源和VBAT通道的信号。这些通道的A/D转换可在单次、连续、扫描或不连续采样模式下进行。ADC的结果存储在一个左对齐或右对齐的16位数据寄存器中。ADC具有模拟看门狗特性,允许应用检测输入电压是否超过了用户自定义的阈值上限或下限。 STM32f103系列有3个ADC,精度为12位,每个ADC最多有16个外部通道。其中ADC1和ADC2都有16个外部通道,ADC3一般有8个外部通道,各通道的A/D转换可以单次

  • java浅析

    基本结构 1.以字节码的方式运行在虚拟机上,不是直接编译成机器码运行,所以性能上差于C但是高于python这样的解释形语言。 笔者大学期间学习过汇编和C,工作后使用python,对这两种语言有些粗浅的认识。 2.详细了解java字节码运行方式可以阅读 Java字节码浅析。  安装JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html Java的版本 JavaSE:StandardEdition,标准版 JavaEE:EnterpriseEdition,企业版 JavaME:MicroEdition,移动版 名词解释 JSR:JavaSpecificationRequest JCP:JavaCommunityProcess RI:ReferenceImplementation TCK:TechnologyCompatibilityKit JDK:JavaDevelopmentKit JRE:JavaRuntimeEnvironment java类的命名规则: 必须字

  • Java类、Java文件、class文件的名的关系

    Java类名:Java属于面向对象编程语言,对象就是一个个类,所以Java类名是我们在编写程序时为我们定义的对象取的名字。 java文件名:对于编写的Java程序我们需要有个文件来保存,保存的文件后缀为.java,.java前的便是Java文件名。 class文件名:Java程序要查看结果便需要运行.class文件。.class前面的便是class文件名  一个java文件可以有多个类,但只能有一个与java文件名同名的public类 在一个文件里定义了几个类的时候,每个class会生成一个.class文件  

  • 2019Unite大会

      一年一度的Unite大会,在今年(2019)的5月10日准时在上海的国际会议中心盛大举行。本届大会历时三天,由来自全球的Unity公司技术专家、开发者、艺术家和Unity爱好者们齐聚一堂,展示Unity的最新技术成就,以及展示MadewithUnity的游戏与行业应用,分享Unity技术应用经验。   作为全球规模最大的Unity开发者聚会,历年的Unite大会都会成为开发者们获取Unity最新技术知识,交流开发经验,把握行业发展脉搏,体验全球前沿科技的绝好机会!  本次大陆地区的2019Unite大会,为期三天。第1天是unity技术培训与Keynote主题演讲、第2天重点是Unity美国高管与技术专家针对最新的技术发展前沿进行讲解与演示、第3天则更多的是国内unity技术团队与优秀Unity作品技术分享会议。以上安排基本延续了最近几年的大会固定日程。    Unite大会是由Unity举办的全球开发者大会,至今已有13年的历史,Unite现已成为游戏、VR、AR、MR等行业中最具有权威性和影响力的活动。历届Unite大会都会吸引到成千上万的开发者们参与,成为大家学习

  • 重心在哪里

    【题目描述】 每个人都知道牛顿发现万有引力的故事。自从牛顿发现万有引力后,人们用万有引力理论解决了非常多的问题。不仅如此,我们也知道了每个物体都有自己的重心。 现在,给你三角形三个顶点的坐标,你能计算出三角形的重心吗? 【输入格式】 第一行输入一个正整数n,表示测试数据的个数。 接下来n行,每行包含6个数字x1,y1,x2,y2,x3,y3,表示三角形三个顶点的坐标。 【输出格式】 对于每组输入,输出重心的坐标,结果保留1位小数。 【样例输入】 2 1.02.03.04.05.02.0 1.01.04.01.01.05.0 【样例输出】 3.02.7 2.02.3 【分析】 三角形三边中线的交点叫做三角形的重心。一种明显的方法就是求出三条边的中点,然后分别求一个顶点和一个中点所在直线的解析式,最后联列三个解析式即可。但是这样太麻烦了。 其实对于重心是有公式的。 若三角形ABC的重心为G,点P为其内部任意一点,则: 3PG^2=(AP^2+BP^2+CP^2)-1/3(AB^2+BC^2+CA^2) 设三点A(x1.y1)B(x2,y2)C(x3,y3),重心G(xm,ym) 考虑xm:

  • 2022-2023-1 20211408 《信息安全专业导论》第十二周学习总结

    2021-2022-120211408《信息安全专业导论》第十二周学习总结 2021-2022-120211408《信息安全专业导论》第十二周学习总结作业信息 作业模板:https://www.cnblogs.com/rocedu/p/9577842.html#JXJC作业要求:https://www.cnblogs.com/rocedu/p/9577842.html#WEEK12 教材学习内容总结1.1信息安全:用于确保正确访问数据的技术与政策。 技术层面上说,信息安全不同于网络安全。网络安全指的是应对攻击的网络空间(因特网上可以获得的资源)使用的保护和防御。如下图所示。然而,由于大多数信息都存储在电子设备中,这些电子设备又可以联网,因此这两个概念有很大一部分重叠,有时会互用。 信息安全——C(confidentiality),I(integrity),A(availability) 保密性(C):指确保关键数据受到保护以免受未经授权的访问。 完整性(I):指确保数据只能通过适当的机制修改,。它定义了你对信息的信任程度。 可用性(A):是指授权的用户能在必要时以合法的

  • 找相似图像+python

    deffind_similar_img(det_im,im_dataset_dir): im_dataset=os.listdir(im_dataset_dir) need_im_name=[] need_im_det_instance=[] print('nowdoinggetfeature.....') num=0 forfijinim_dataset: big_imag=cv2.imread(im_dataset_dir+'/'+fij,cv2.IMREAD_GRAYSCALE) big_imag=resize(big_imag,bigimg_size) w_big_imag=resize(det_im,bigimg_size) w_feature=HOG_features(w_big_imag) wo_feature=HOG_features(big_imag) dist=calEuclideanDistance(w_feature,wo_feature) need_im_name.append(fij) need_im_det_instance.append(dist)

  • 模块讲解----json与pickle模块的区别

    1、在生产中,dumps和loads只进行一次,而且要用w把原来的数据冲掉,从而保证每次都是最新的。 2、虚拟机的快照,是每个快照都有一个文件,而不是全都不放在一起。 3、如果想生产好几个序列化,就生成多个文件。 4、json和pickle又有相同的方法:   json:用于(不同平台和多语言)字符串和python数据类型进行转换 pickle:用于python特有的类型和python的数据类型间进行转换(所有python数据类型)   json:模块提供了四个功能:dumps dump loads load  pickle:模块提供了四个功能:dumps dump loads load      (1)、在内存中修改,通过write和read、for循环的方式读写到文件中:     dumps:f.write(jsoin|pickle.dumps(info))     load

相关推荐

推荐阅读