静态方法

Spring 的学习6_______静态代理和动态代理(AOP的底层实现原理)

六眼飞鱼酱① 提交于 2020-02-15 14:41:15
代理模式可分为静态代理,动态代理。 1.静态代理: 静态代理的角色分析: 1.真实对象; 2.代理真实对象的对象(代理对象)一般会添加一些附加的操作; 3.真实对象和代理对象抽象出来的公共部分(一般为抽象类或者接口); 4.用户(通过代理对象来调用真实对象的方法)。 静态代理的一个代码案例: 情景模型:你(用户)通过租房中介(代理对象)从房东(真实对象)进行租房的活动。 真实对象(Host) //真实对象 public class Host implements Rent { public void rent() { System.out.println("Host 租房子啦!"); } } 代理对象: //代理对象 public class Proxy implements Rent { private Host host; public Proxy(Host host) { this.host = host; } public void rent() { lookHouse(); host.rent(); fare(); } //代理对象添加的额外的操作 public void lookHouse(){ System.out.println("带你一起去看看房子!"); } public void fare(){ System.out.println("交易结束,请按时付款!"

使用WSGIServer修改静态文件

别来无恙 提交于 2020-02-15 13:15:07
背景:公司水务项目要求提供一个以POST方法修改静态文件的接口,由于nginx已经关闭了对POST方法的支持,并且开启POST方法后也无法去修改静态文件,所以需要额外的一个api接口去修改,而python的WSGIServer正好适用 一、使nginx支持POST方法 1、下载nginx的tar包:http: //nginx.org/download/nginx-1.15.9.tar.gz 2、解压tar包后,修改src/http/modules/ngx_http_static_module.c文件,将文件中的NGINX_HTTP_POST选项,注释,如下图: 3、为nginx添加 nginx-upload-module 模块: 模块下载地址: https://github.com/winshining/nginx-upload-module 直接git conle https://github.com/winshining/nginx-upload-module 即可 4、然后编译并安装nginx即可,下面为Dockerfile内容: FROM ubuntu ADD nginx-1.15.9.tar.gz nginx-upload-module.tar.gz /opt/ RUN apt update \ && apt -y install python3.7 python3

Java面向对象[数组]

时间秒杀一切 提交于 2020-02-13 11:07:11
理解数组 Java的数组要求所有的数组元素具有相同的数据类型,换句话说一个数组里只能存储一种数据类型的数据 一旦数组的的初始化完成,数组在内存中所占的空间将被固定下来,因此数组的长度将不可改变,即使把某个数组元素的数据清空,但它所占的空间依然保留,依然属于该数组,数组的长度依然不变 Java的数组既可以存储基本类型的数据,也可以存储引用类型的数据,只要所有的数据属于相同的数据类型即可 数组也是一种数据类型,它本身是一种引用类型,因此用它定义一个变量时,仅仅表示定义了一个引用变量(也就是一个指针),这个引用变量还未指定任何内存 数组的定义和初始化 Java提供了两种定义数组的语法 type[] arrayName; type arrayName[]; 数组是个引用类型,因此用它定义一个变量时,仅仅表示定义了一个引用变量(也就是一个指针),这个时候引用变量还未指定任何内存,因此定义数组时不能指定数组的长度,并且没有指定内存就没有内存空间来存储数组元素,因此这个数组也就不能直接使用,只有对数组进行初始化后才可以使用。 数组初始化 所谓初始化就是给数组分配内存空间,并为数组元素赋初始值,一旦为数组的每个数组元素分配了内存,每个内存空间里存储的内容就是该数组元素的值,即使这个内存空间存储的内容是空,这个空也是一个值(null),只要为数组元素分配了内存空间,数组元素就具有了初始值

Bean的实例化--静态工厂

时光毁灭记忆、已成空白 提交于 2020-02-13 08:21:25
1,创建实体类User package com.songyan.demo1; /** * 要创建的对象类 * @author sy * */ public class User { private String name; private int age ; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 2,创建生产对象的工厂类 改工厂类必须有一个静态的返回值为“要生产的对象的类型” package com.songyan.staticfactory; import com.songyan.demo1.User; /** * 创建User对象的工厂类 * @author sy * */ public class UserFactory { /** * 该方法必须是static的 * @return 工厂要创建的对像 */ public static User createUser() { return new User(); } } 3,配置bean对象 1 <?xml

用静态工厂的方法实例化bean

独自空忆成欢 提交于 2020-02-13 08:20:46
//代码如下: package com.timo.domain; public class ClientService { //use static factory method create bean private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public static ClientService getClientService() { return clientService; } public static void setClientService(ClientService clientService) { ClientService.clientService = clientService; } private static ClientService clientService=new ClientService(); private static People people=new People(); private ClientService(){} public static ClientService createInstance(){ clientService

静态工厂方法和实例工厂方法及普通的bean

≡放荡痞女 提交于 2020-02-13 08:20:20
容纳你的bean bean工厂:最简单的容器,提供了基础的依赖注入支持。创建各种类型的Bean。 应用上下文(ApplicationContext):建立在bean工厂基础之上,提供系统架构服务。 bean工厂介绍 工厂设计模式,创建分发各种bean。配置好它们之间的协作关系,参与bean的生命周期。 BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml")); bean工厂只把bean的定义信息加载进来,用到的时候才实例化。 factory.getBean("mybean");就可得到一个bean 静态工厂方法实例 package com.test.srping.bean.factory; import java.util.HashMap; import java.util.Map; //静态工厂方法:直接调用某一个类的静态方法就可以返回Bean的实例 public class StaticCarFactory { private static Map<String,Car> cars = new HashMap<String,Car>(); static{ cars.put("baoma", new Car("BaoMa",3000000)); cars

Java学习笔记(三)面向对象---Static关键词

China☆狼群 提交于 2020-02-12 00:55:15
内容 静态:Static 用法 Static是一个修饰符,用于修饰成员(成员变量,成员函数),当成员被静态修饰后,除了可以被对象调用外,还可以直接被类名调用。 举例 class Person { String name; //成员变量,实例变量 static String country = "CN"; //静态的成员变量,类变量 } public class StaticDemo { public static void main(String[] args) { Person p = new Person(); System.out.println(p.country); //使用对象调用 System.out.println(Person.country);//直接使用类名调用 } } 运行结果: CN CN 特点 Static关键词所修饰的成员随着类的加载而加载(随着类的消失而消失),也就是说静态变量不需要依靠创建对象而存在在内存中,所以它的生命周期最长 优先于对象存在 (静态是先存在的,对象是后存在的) 被所有对象所共享 可以直接被类名所调用 实例变量和类变量的区别 存放位置 类变量随着类的加载而存在于方法区中。 实例变量随着对象的建立而存在于堆内存中。 生命周期 类变量生命周期最长,随着类的消失而消失。 实例变量的生命周期取决于对象的建立和消失。 静态使用注意事项

abstract、static、final关键字

走远了吗. 提交于 2020-02-11 18:59:39
关键字 abstract关键字 抽象的,可以用来修饰类和方法 1、修饰类 抽象类,抽象类是为了模型化那些父类无法确定全部实现,而是由子类提供具体实现的对象的类 a、不可被实例化,因为可能含有抽象方法,如果由此类的对象来调用时就无法调用未完成的抽象方法 b、抽象类有构造器,还可以自定义构造器 2、修饰方法 抽象方法 a、格式: 没有方法体,以及{} ;例:public abstract void eat(); b、实现:抽象方法只保留此方法的功能,具体的实现交给子类来实现,由子类来重写这个方法 c、抽象方法所在的类一定是抽象类,抽象类中可以没有抽象方法 d、若子类继承了抽象类,并重写了抽象类里所有的抽象方法,那么该子类可以被实例化,如果没有重写抽象类里的所有抽象方法,那么该类必须声明为抽象类 3、冲突 a、不可用来修饰属性:被abstract修饰的都是暂未实现的,比如类和方法,而属性不存在未被实现的状态 b、不可用来修饰构造器:构造器不可被重写 c、不可以修饰声明为private的方法:子类不能覆盖或者重写private方法 d、不可以和final共用:final用于类之前,表示类不能被继承,final用于变量前则只能赋值一次,如果初始化了那就是常量,和abstract搭配无意义(final不能被重写,根本就不可能被abstract的实现类重写) e、不可以和static共用

C++学习笔记7

瘦欲@ 提交于 2020-02-11 15:56:10
目录 六、动态联编与虚函数 1、联编的概念 2、静态联编 3、动态联编 4、虚函数 5、虚析构函数 6、纯虚函数和抽象类 六、动态联编与虚函数 1、联编的概念 联编是指一个计算机程序自身彼此关联(使一个源程序经过编译、 连接, 成为一个可执行程序) 的过程, 在这个联编过程中, 需要确定程序中的操作调用(函数调用) 与执行该操作(函数) 的代码段之间的映射关系, 按照联编所进行的阶段不同, 可分为静态联编和动态联编。 2、静态联编 静态联编又称静态束定、 早期联编、 前期联编。 静态联编是指联编工作是在程序编译链接阶段进行的, 静态联编又称早期联编, 因为这种联编是在程序开始运行之前完成的。 在程序编译阶段进行的这种联编又称静态束定, 在编译时就解决了程序中的操作调用与执行该操作代码间的关系, 确定这种关系又被称为束定, 编译时束定又称为静态束定。 静态联编就是, 编译器在程序运行前就知道调用什么函数做什么事 。 静态联编特点: 速度快效率高 。 3、动态联编 动态联编又称动态关联、 动态束定、 后期联编、 晚期联编。 动态联编是指编译程序在编译阶段并不能确切地知道将要调用的函数, 只有在程序执行时才能确定将要调用的函数, 为此要确切地知道将要调用的函数,要求联编工作在程序运行时进行, 这种在程序运行时进行的联编工作被称为动态联编。 C++规定: 动态联编是在 虚函数

静态代理设计模式

假装没事ソ 提交于 2020-02-11 14:16:51
代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。 为什么需要代理:      打一个最简单的比方,我现在想要学习,那么就必须得把书包拿过来,把书掏出来,准备好纸笔,然后开始学习,等学完了我还得收拾书,把书塞回书包里,还得整理一下书包,这是一个完整的学习的过程,但是我很懒,不想动弹,只想学习,那可能就得让妈妈帮我把书包拿过来,把书打开,我只管学习就好了,学完以后,妈妈再帮我把书整理好放回去.(我这是打个什么破比方...),在这里,妈妈就代表了一个代理对象,要学习的人是我,而我只管学习,这样效率才最高,至于其他的交给代理对象(妈妈)做就好了,画一个丑陋的的图表示一下: 静态代理 我们最开始接触jdbc操作数据库的时候,业务层每一个方法,都需要1.打开数据库连接,2.执行我们想要的操作3.关闭数据库连接.这样就使得业务层代码不够纯粹,我的功能是查询用户数据,打开和关闭数据库连接关我毛事?我干嘛要去干这件事?这就是传统开发中存在的一个问题 其实这个方法的实现是有问题的, 核心业务与辅助业务写在了一个方法中,不但业务冗余了不说,像开关数据库连接这样的公共操作也大量的重复,这时候就出现了代理模式的思想 ,我们可以使用代理模式的思想改写一下上面的代码: 实现类的改造: 通过代理模式,我们可以抽取出核心业务与辅助业务,但是问题随之而来了